| Quentin Colombet | 3198649 | 2016-06-10 01:57:48 +0000 | [diff] [blame] | 1 | ; RUN: llc %s -o - | FileCheck %s |
| 2 | ; This file checks some weird corner case in LiveRangeEdit. |
| 3 | ; We used to do crash when we eliminate the definition |
| 4 | ; of the product of splitting when the original live-range |
| 5 | ; has already been removed. |
| 6 | ; Basically, we have the following input. |
| 7 | ; v1 = loadimm cst |
| 8 | ; ... |
| 9 | ; = use v1 |
| 10 | ; |
| 11 | ; We split the live-range like this: |
| 12 | ; v1 = loadimm cst |
| 13 | ; ... |
| 14 | ; v2 = copy v1 |
| 15 | ; ... |
| 16 | ; = use v2 |
| 17 | ; |
| 18 | ; We actually issue loadimm instead of the copy: |
| 19 | ; v1 = loadimm cst |
| 20 | ; ... |
| 21 | ; v2 = loadimm cst |
| 22 | ; ... |
| 23 | ; = use v2 |
| 24 | ; |
| 25 | ; v1 is now dead so we remove its live-range. |
| 26 | ; Actually, we shrink it to empty to keep the |
| 27 | ; instruction around for futher remat opportunities |
| 28 | ; (accessbile via the origin pointer.) |
| 29 | ; |
| 30 | ; Later v2 gets remove as well (e.g., because we |
| 31 | ; remat it closer to its use) and the live-range |
| 32 | ; gets eliminated. We used to crash at this point |
| 33 | ; because we were looking for a VNI of origin (v1) |
| 34 | ; at the slot index of the definition of v2. However, |
| 35 | ; we do not have a VNI for v1 at this point, since the |
| 36 | ; live-range is now empty... crash! |
| 37 | ; PR27983 |
| 38 | |
| 39 | source_filename = "bugpoint-output-1e29d28.bc" |
| 40 | target datalayout = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128" |
| 41 | target triple = "i386-unknown-linux-gnu" |
| 42 | |
| 43 | @r = external global i32, align 4 |
| 44 | @k = external global i32, align 4 |
| 45 | @g = external global i32, align 4 |
| 46 | @a = external global i16, align 2 |
| 47 | @p = external global i32, align 4 |
| 48 | @n = external global i16, align 2 |
| 49 | @.str = external unnamed_addr constant [12 x i8], align 1 |
| 50 | @.str.1 = external unnamed_addr constant [13 x i8], align 1 |
| 51 | @s = external global i32, align 4 |
| 52 | @z = external global i16, align 2 |
| 53 | |
| 54 | ; CHECK-LABEL: fn1: |
| 55 | define void @fn1() #0 { |
| 56 | entry: |
| 57 | br label %for.cond |
| 58 | |
| 59 | for.cond: ; preds = %cleanup100, %for.end29, %entry |
| 60 | %t7.0 = phi i16 [ undef, %entry ], [ %t7.1, %for.end29 ], [ %t7.19, %cleanup100 ] |
| 61 | %t9.0 = phi i32 [ undef, %entry ], [ %t9.1, %for.end29 ], [ 0, %cleanup100 ] |
| 62 | %t2.0 = phi i32 [ undef, %entry ], [ undef, %for.end29 ], [ %t2.18, %cleanup100 ] |
| 63 | %tmp = load i32, i32* @r, align 4 |
| 64 | br i1 undef, label %if.then, label %if.end7 |
| 65 | |
| 66 | if.then: ; preds = %for.cond |
| 67 | %tobool = icmp ne i32 %tmp, 0 |
| 68 | %tobool1 = icmp ne i32 %t2.0, 0 |
| 69 | %tmp1 = and i1 %tobool1, %tobool |
| 70 | %land.ext = zext i1 %tmp1 to i32 |
| 71 | %tmp2 = load i32, i32* @k, align 4 |
| 72 | %shr = lshr i32 %land.ext, %tmp2 |
| 73 | %tobool4 = icmp ne i32 %shr, 0 |
| 74 | %or.cond = and i1 false, %tobool4 |
| 75 | br i1 %or.cond, label %L6, label %if.end7 |
| 76 | |
| 77 | if.end7: ; preds = %if.then, %for.cond |
| 78 | %t2.1 = phi i32 [ %shr, %if.then ], [ %t2.0, %for.cond ] |
| 79 | %tobool8 = icmp eq i32 undef, 0 |
| 80 | br i1 %tobool8, label %if.end11, label %for.cond10 |
| 81 | |
| 82 | for.cond10: ; preds = %for.cond10, %if.end7 |
| 83 | br label %for.cond10 |
| 84 | |
| 85 | if.end11: ; preds = %if.end7 |
| 86 | %tmp3 = load i32, i32* @g, align 4 |
| 87 | %tmp4 = load i16, i16* @a, align 2 |
| 88 | %conv = sext i16 %tmp4 to i32 |
| 89 | %div = sdiv i32 %tmp3, %conv |
| 90 | %tobool12 = icmp eq i32 %div, 0 |
| 91 | br i1 %tobool12, label %for.cond15, label %L5 |
| 92 | |
| 93 | for.cond15: ; preds = %for.cond17, %if.end11 |
| 94 | %t7.1 = phi i16 [ %t7.2, %for.cond17 ], [ %t7.0, %if.end11 ] |
| 95 | %t9.1 = phi i32 [ %t9.2, %for.cond17 ], [ %t9.0, %if.end11 ] |
| 96 | %tobool16 = icmp eq i32 undef, 0 |
| 97 | br i1 %tobool16, label %for.end29, label %for.cond17 |
| 98 | |
| 99 | for.cond17: ; preds = %for.cond20, %for.cond15 |
| 100 | %t7.2 = phi i16 [ %t7.3, %for.cond20 ], [ %t7.1, %for.cond15 ] |
| 101 | %t9.2 = phi i32 [ undef, %for.cond20 ], [ %t9.1, %for.cond15 ] |
| 102 | %tobool18 = icmp eq i8 undef, 0 |
| 103 | br i1 %tobool18, label %for.cond15, label %for.cond20 |
| 104 | |
| 105 | for.cond20: ; preds = %for.cond23, %for.cond17 |
| 106 | %t7.3 = phi i16 [ %t7.4, %for.cond23 ], [ %t7.2, %for.cond17 ] |
| 107 | %tobool21 = icmp eq i32 undef, 0 |
| 108 | br i1 %tobool21, label %for.cond17, label %for.cond23 |
| 109 | |
| 110 | for.cond23: ; preds = %L1, %for.cond20 |
| 111 | %t7.4 = phi i16 [ %t7.5, %L1 ], [ %t7.3, %for.cond20 ] |
| 112 | %tobool24 = icmp eq i8 undef, 0 |
| 113 | br i1 %tobool24, label %for.cond20, label %L1 |
| 114 | |
| 115 | L1: ; preds = %cleanup100, %for.cond23 |
| 116 | %t7.5 = phi i16 [ %t7.19, %cleanup100 ], [ %t7.4, %for.cond23 ] |
| 117 | %conv26 = sext i16 undef to i64 |
| 118 | br label %for.cond23 |
| 119 | |
| 120 | for.end29: ; preds = %for.cond15 |
| 121 | br i1 undef, label %for.cond, label %for.cond32thread-pre-split |
| 122 | |
| 123 | for.cond32thread-pre-split: ; preds = %for.end29 |
| 124 | %.pr = load i32, i32* @p, align 4 |
| 125 | br label %for.cond32 |
| 126 | |
| 127 | for.cond32: ; preds = %for.inc94, %for.cond32thread-pre-split |
| 128 | %t7.6 = phi i16 [ %t7.1, %for.cond32thread-pre-split ], [ %t7.17, %for.inc94 ] |
| 129 | %t3.4 = phi i64 [ 0, %for.cond32thread-pre-split ], [ 0, %for.inc94 ] |
| 130 | %t9.6 = phi i32 [ %t9.1, %for.cond32thread-pre-split ], [ 0, %for.inc94 ] |
| 131 | %t2.7 = phi i32 [ undef, %for.cond32thread-pre-split ], [ %t2.16, %for.inc94 ] |
| 132 | %tobool33 = icmp eq i32 0, 0 |
| 133 | br i1 %tobool33, label %for.end95, label %for.body34 |
| 134 | |
| 135 | for.body34: ; preds = %for.cond32 |
| 136 | %tobool35 = icmp eq i16 undef, 0 |
| 137 | br i1 %tobool35, label %for.inc94, label %if.then36 |
| 138 | |
| 139 | if.then36: ; preds = %for.body34 |
| 140 | %tmp5 = load i16, i16* @n, align 2 |
| 141 | %tobool37 = icmp eq i32 undef, 0 |
| 142 | br i1 %tobool37, label %if.end78, label %if.then38 |
| 143 | |
| 144 | if.then38: ; preds = %if.then36 |
| 145 | tail call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str, i32 0, i32 0), i64 undef) |
| 146 | %tobool40 = icmp eq i32 undef, 0 |
| 147 | br i1 %tobool40, label %L3, label %cleanup100 |
| 148 | |
| 149 | L3: ; preds = %while.end.split, %if.then38 |
| 150 | %t7.7 = phi i16 [ %tmp5, %if.then38 ], [ %t7.15, %while.end.split ] |
| 151 | %t3.5 = phi i64 [ %t3.4, %if.then38 ], [ %t3.11, %while.end.split ] |
| 152 | %t2.8 = phi i32 [ %t2.7, %if.then38 ], [ %t2.14, %while.end.split ] |
| 153 | %tobool43 = icmp eq i32 undef, 0 |
| 154 | br i1 %tobool43, label %if.end48, label %cleanup75 |
| 155 | |
| 156 | if.end48: ; preds = %L3 |
| 157 | tail call void (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.1, i32 0, i32 0), i64 %t3.5) |
| 158 | br i1 undef, label %if.end61, label %for.cond52.preheader |
| 159 | |
| 160 | for.cond52.preheader: ; preds = %if.end48 |
| 161 | %tobool57 = icmp eq i16 undef, 0 |
| 162 | %.130 = select i1 %tobool57, i16 -8, i16 0 |
| 163 | br label %if.end61 |
| 164 | |
| 165 | if.end61: ; preds = %for.cond52.preheader, %if.end48 |
| 166 | %t7.9 = phi i16 [ %t7.7, %if.end48 ], [ %.130, %for.cond52.preheader ] |
| 167 | %tobool62 = icmp eq i32 undef, 0 |
| 168 | br i1 %tobool62, label %if.end71, label %if.then63 |
| 169 | |
| 170 | if.then63: ; preds = %if.end61 |
| 171 | br i1 undef, label %if.end67, label %L5 |
| 172 | |
| 173 | L5: ; preds = %cleanup100.L5_crit_edge, %if.then63, %if.end11 |
| 174 | %.pre = phi i32 [ %.pre.pre, %cleanup100.L5_crit_edge ], [ undef, %if.then63 ], [ %tmp, %if.end11 ] |
| 175 | %t7.10 = phi i16 [ %t7.19, %cleanup100.L5_crit_edge ], [ %t7.9, %if.then63 ], [ %t7.0, %if.end11 ] |
| 176 | %t3.6 = phi i64 [ 0, %cleanup100.L5_crit_edge ], [ %t3.5, %if.then63 ], [ 2, %if.end11 ] |
| 177 | %t9.8 = phi i32 [ 0, %cleanup100.L5_crit_edge ], [ undef, %if.then63 ], [ %t9.0, %if.end11 ] |
| 178 | %t2.9 = phi i32 [ %t2.18, %cleanup100.L5_crit_edge ], [ %t2.8, %if.then63 ], [ %t2.1, %if.end11 ] |
| 179 | store i32 %t9.8, i32* @s, align 4 |
| 180 | br label %if.end67 |
| 181 | |
| 182 | if.end67: ; preds = %L5, %if.then63 |
| 183 | %tmp6 = phi i32 [ %.pre, %L5 ], [ undef, %if.then63 ] |
| 184 | %t7.11 = phi i16 [ %t7.10, %L5 ], [ %t7.9, %if.then63 ] |
| 185 | %t3.7 = phi i64 [ %t3.6, %L5 ], [ %t3.5, %if.then63 ] |
| 186 | %t9.9 = phi i32 [ %t9.8, %L5 ], [ undef, %if.then63 ] |
| 187 | %t2.10 = phi i32 [ %t2.9, %L5 ], [ %t2.8, %if.then63 ] |
| 188 | %tobool68 = icmp eq i32 %tmp6, 0 |
| 189 | br i1 %tobool68, label %if.end71, label %for.end95 |
| 190 | |
| 191 | if.end71: ; preds = %if.end67, %if.end61 |
| 192 | %t7.12 = phi i16 [ %t7.11, %if.end67 ], [ %t7.9, %if.end61 ] |
| 193 | %t3.8 = phi i64 [ %t3.7, %if.end67 ], [ %t3.5, %if.end61 ] |
| 194 | %tobool72 = icmp eq i32 undef, 0 |
| 195 | br i1 %tobool72, label %cleanup75.thread128, label %if.then73 |
| 196 | |
| 197 | if.then73: ; preds = %if.end71 |
| 198 | br label %cleanup100 |
| 199 | |
| 200 | cleanup75.thread128: ; preds = %if.end71 |
| 201 | br label %if.end78 |
| 202 | |
| 203 | cleanup75: ; preds = %L3 |
| 204 | br i1 false, label %for.cond98, label %for.end95 |
| 205 | |
| 206 | if.end78: ; preds = %cleanup75.thread128, %if.then36 |
| 207 | %t7.14 = phi i16 [ %tmp5, %if.then36 ], [ 0, %cleanup75.thread128 ] |
| 208 | %t3.10 = phi i64 [ %t3.4, %if.then36 ], [ %t3.8, %cleanup75.thread128 ] |
| 209 | %t9.12 = phi i32 [ %t9.6, %if.then36 ], [ undef, %cleanup75.thread128 ] |
| 210 | %t2.13 = phi i32 [ %t2.7, %if.then36 ], [ undef, %cleanup75.thread128 ] |
| 211 | store i16 %t7.14, i16* @z, align 2 |
| 212 | br label %L6 |
| 213 | |
| 214 | L6: ; preds = %if.end78, %if.then |
| 215 | %t7.15 = phi i16 [ %t7.0, %if.then ], [ %t7.14, %if.end78 ] |
| 216 | %t3.11 = phi i64 [ 2, %if.then ], [ %t3.10, %if.end78 ] |
| 217 | %t9.13 = phi i32 [ %t9.0, %if.then ], [ %t9.12, %if.end78 ] |
| 218 | %t2.14 = phi i32 [ %shr, %if.then ], [ %t2.13, %if.end78 ] |
| 219 | br i1 undef, label %while.condthread-pre-split, label %for.inc94 |
| 220 | |
| 221 | while.condthread-pre-split: ; preds = %L6 |
| 222 | %tobool83 = icmp eq i32 undef, 0 |
| 223 | br i1 %tobool83, label %while.end.split, label %while.cond |
| 224 | |
| 225 | while.cond: ; preds = %while.cond, %while.condthread-pre-split |
| 226 | br label %while.cond |
| 227 | |
| 228 | while.end.split: ; preds = %while.condthread-pre-split |
| 229 | %tobool84 = icmp eq i16 undef, 0 |
| 230 | br i1 %tobool84, label %for.inc94, label %L3 |
| 231 | |
| 232 | for.inc94: ; preds = %while.end.split, %L6, %for.body34 |
| 233 | %t7.17 = phi i16 [ %t7.6, %for.body34 ], [ %t7.15, %L6 ], [ %t7.15, %while.end.split ] |
| 234 | %t2.16 = phi i32 [ %t2.7, %for.body34 ], [ %t2.14, %L6 ], [ %t2.14, %while.end.split ] |
| 235 | store i32 undef, i32* @p, align 4 |
| 236 | br label %for.cond32 |
| 237 | |
| 238 | for.end95: ; preds = %cleanup75, %if.end67, %for.cond32 |
| 239 | %t7.18 = phi i16 [ %t7.6, %for.cond32 ], [ %t7.7, %cleanup75 ], [ %t7.11, %if.end67 ] |
| 240 | %t2.17 = phi i32 [ %t2.7, %for.cond32 ], [ %t2.8, %cleanup75 ], [ %t2.10, %if.end67 ] |
| 241 | %tobool96 = icmp eq i32 undef, 0 |
| 242 | br i1 %tobool96, label %cleanup100, label %for.cond98 |
| 243 | |
| 244 | for.cond98: ; preds = %for.cond98, %for.end95, %cleanup75 |
| 245 | br label %for.cond98 |
| 246 | |
| 247 | cleanup100: ; preds = %for.end95, %if.then73, %if.then38 |
| 248 | %t7.19 = phi i16 [ %t7.18, %for.end95 ], [ %tmp5, %if.then38 ], [ %t7.12, %if.then73 ] |
| 249 | %t2.18 = phi i32 [ %t2.17, %for.end95 ], [ %t2.7, %if.then38 ], [ undef, %if.then73 ] |
| 250 | switch i32 undef, label %unreachable [ |
| 251 | i32 0, label %for.cond |
| 252 | i32 17, label %L1 |
| 253 | i32 7, label %cleanup100.L5_crit_edge |
| 254 | ] |
| 255 | |
| 256 | cleanup100.L5_crit_edge: ; preds = %cleanup100 |
| 257 | %.pre.pre = load i32, i32* @r, align 4 |
| 258 | br label %L5 |
| 259 | |
| 260 | unreachable: ; preds = %cleanup100 |
| 261 | unreachable |
| 262 | } |
| 263 | |
| 264 | ; Function Attrs: nounwind |
| 265 | declare void @printf(i8* nocapture readonly, ...) #1 |
| 266 | |
| 267 | attributes #0 = { noreturn nounwind "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="pentium4" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } |
| 268 | attributes #1 = { nounwind "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="pentium4" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } |