1 ; RUN: opt < %s -basicaa -licm -S | FileCheck %s 2 3 declare i32 @strlen(i8*) readonly 4 5 declare void @foo() 6 7 ; Sink readonly function. 8 define i32 @test1(i8* %P) { 9 br label %Loop 10 11 Loop: ; preds = %Loop, %0 12 %A = call i32 @strlen( i8* %P ) readonly 13 br i1 false, label %Loop, label %Out 14 15 Out: ; preds = %Loop 16 ret i32 %A 17 ; CHECK-LABEL: @test1( 18 ; CHECK: Out: 19 ; CHECK-NEXT: call i32 @strlen 20 ; CHECK-NEXT: ret i32 %A 21 } 22 23 declare double @sin(double) readnone 24 25 ; Sink readnone function out of loop with unknown memory behavior. 26 define double @test2(double %X) { 27 br label %Loop 28 29 Loop: ; preds = %Loop, %0 30 call void @foo( ) 31 %A = call double @sin( double %X ) readnone 32 br i1 true, label %Loop, label %Out 33 34 Out: ; preds = %Loop 35 ret double %A 36 ; CHECK-LABEL: @test2( 37 ; CHECK: Out: 38 ; CHECK-NEXT: call double @sin 39 ; CHECK-NEXT: ret double %A 40 } 41 42 ; This testcase checks to make sure the sinker does not cause problems with 43 ; critical edges. 44 define void @test3() { 45 Entry: 46 br i1 false, label %Loop, label %Exit 47 Loop: 48 %X = add i32 0, 1 49 br i1 false, label %Loop, label %Exit 50 Exit: 51 %Y = phi i32 [ 0, %Entry ], [ %X, %Loop ] 52 ret void 53 54 ; CHECK-LABEL: @test3( 55 ; CHECK: Exit.loopexit: 56 ; CHECK-NEXT: %X.le = add i32 0, 1 57 ; CHECK-NEXT: br label %Exit 58 59 } 60 61 ; If the result of an instruction is only used outside of the loop, sink 62 ; the instruction to the exit blocks instead of executing it on every 63 ; iteration of the loop. 64 ; 65 define i32 @test4(i32 %N) { 66 Entry: 67 br label %Loop 68 Loop: ; preds = %Loop, %Entry 69 %N_addr.0.pn = phi i32 [ %dec, %Loop ], [ %N, %Entry ] 70 %tmp.6 = mul i32 %N, %N_addr.0.pn ; <i32> [#uses=1] 71 %tmp.7 = sub i32 %tmp.6, %N ; <i32> [#uses=1] 72 %dec = add i32 %N_addr.0.pn, -1 ; <i32> [#uses=1] 73 %tmp.1 = icmp ne i32 %N_addr.0.pn, 1 ; <i1> [#uses=1] 74 br i1 %tmp.1, label %Loop, label %Out 75 Out: ; preds = %Loop 76 ret i32 %tmp.7 77 ; CHECK-LABEL: @test4( 78 ; CHECK: Out: 79 ; CHECK-NEXT: %[[LCSSAPHI:.*]] = phi i32 [ %N_addr.0.pn 80 ; CHECK-NEXT: mul i32 %N, %[[LCSSAPHI]] 81 ; CHECK-NEXT: sub i32 %tmp.6.le, %N 82 ; CHECK-NEXT: ret i32 83 } 84 85 ; To reduce register pressure, if a load is hoistable out of the loop, and the 86 ; result of the load is only used outside of the loop, sink the load instead of 87 ; hoisting it! 88 ; 89 @X = global i32 5 ; <i32*> [#uses=1] 90 91 define i32 @test5(i32 %N) { 92 Entry: 93 br label %Loop 94 Loop: ; preds = %Loop, %Entry 95 %N_addr.0.pn = phi i32 [ %dec, %Loop ], [ %N, %Entry ] 96 %tmp.6 = load i32, i32* @X ; <i32> [#uses=1] 97 %dec = add i32 %N_addr.0.pn, -1 ; <i32> [#uses=1] 98 %tmp.1 = icmp ne i32 %N_addr.0.pn, 1 ; <i1> [#uses=1] 99 br i1 %tmp.1, label %Loop, label %Out 100 Out: ; preds = %Loop 101 ret i32 %tmp.6 102 ; CHECK-LABEL: @test5( 103 ; CHECK: Out: 104 ; CHECK-NEXT: %tmp.6.le = load i32, i32* @X 105 ; CHECK-NEXT: ret i32 %tmp.6.le 106 } 107 108 109 110 ; The loop sinker was running from the bottom of the loop to the top, causing 111 ; it to miss opportunities to sink instructions that depended on sinking other 112 ; instructions from the loop. Instead they got hoisted, which is better than 113 ; leaving them in the loop, but increases register pressure pointlessly. 114 115 %Ty = type { i32, i32 } 116 @X2 = external global %Ty 117 118 define i32 @test6() { 119 br label %Loop 120 Loop: 121 %dead = getelementptr %Ty, %Ty* @X2, i64 0, i32 0 122 %sunk2 = load i32, i32* %dead 123 br i1 false, label %Loop, label %Out 124 Out: ; preds = %Loop 125 ret i32 %sunk2 126 ; CHECK-LABEL: @test6( 127 ; CHECK: Out: 128 ; CHECK-NEXT: %dead.le = getelementptr %Ty, %Ty* @X2, i64 0, i32 0 129 ; CHECK-NEXT: %sunk2.le = load i32, i32* %dead.le 130 ; CHECK-NEXT: ret i32 %sunk2.le 131 } 132 133 134 135 ; This testcase ensures that we can sink instructions from loops with 136 ; multiple exits. 137 ; 138 define i32 @test7(i32 %N, i1 %C) { 139 Entry: 140 br label %Loop 141 Loop: ; preds = %ContLoop, %Entry 142 %N_addr.0.pn = phi i32 [ %dec, %ContLoop ], [ %N, %Entry ] 143 %tmp.6 = mul i32 %N, %N_addr.0.pn 144 %tmp.7 = sub i32 %tmp.6, %N ; <i32> [#uses=2] 145 %dec = add i32 %N_addr.0.pn, -1 ; <i32> [#uses=1] 146 br i1 %C, label %ContLoop, label %Out1 147 ContLoop: 148 %tmp.1 = icmp ne i32 %N_addr.0.pn, 1 149 br i1 %tmp.1, label %Loop, label %Out2 150 Out1: ; preds = %Loop 151 ret i32 %tmp.7 152 Out2: ; preds = %ContLoop 153 ret i32 %tmp.7 154 ; CHECK-LABEL: @test7( 155 ; CHECK: Out1: 156 ; CHECK-NEXT: %[[LCSSAPHI:.*]] = phi i32 [ %N_addr.0.pn 157 ; CHECK-NEXT: mul i32 %N, %[[LCSSAPHI]] 158 ; CHECK-NEXT: sub i32 %tmp.6.le, %N 159 ; CHECK-NEXT: ret 160 ; CHECK: Out2: 161 ; CHECK-NEXT: %[[LCSSAPHI:.*]] = phi i32 [ %N_addr.0.pn 162 ; CHECK-NEXT: mul i32 %N, %[[LCSSAPHI]] 163 ; CHECK-NEXT: sub i32 %tmp.6.le4, %N 164 ; CHECK-NEXT: ret 165 } 166 167 168 ; This testcase checks to make sure we can sink values which are only live on 169 ; some exits out of the loop, and that we can do so without breaking dominator 170 ; info. 171 define i32 @test8(i1 %C1, i1 %C2, i32* %P, i32* %Q) { 172 Entry: 173 br label %Loop 174 Loop: ; preds = %Cont, %Entry 175 br i1 %C1, label %Cont, label %exit1 176 Cont: ; preds = %Loop 177 %X = load i32, i32* %P ; <i32> [#uses=2] 178 store i32 %X, i32* %Q 179 %V = add i32 %X, 1 ; <i32> [#uses=1] 180 br i1 %C2, label %Loop, label %exit2 181 exit1: ; preds = %Loop 182 ret i32 0 183 exit2: ; preds = %Cont 184 ret i32 %V 185 ; CHECK-LABEL: @test8( 186 ; CHECK: exit1: 187 ; CHECK-NEXT: ret i32 0 188 ; CHECK: exit2: 189 ; CHECK-NEXT: %[[LCSSAPHI:.*]] = phi i32 [ %X 190 ; CHECK-NEXT: %V.le = add i32 %[[LCSSAPHI]], 1 191 ; CHECK-NEXT: ret i32 %V.le 192 } 193 194 195 define void @test9() { 196 loopentry.2.i: 197 br i1 false, label %no_exit.1.i.preheader, label %loopentry.3.i.preheader 198 no_exit.1.i.preheader: ; preds = %loopentry.2.i 199 br label %no_exit.1.i 200 no_exit.1.i: ; preds = %endif.8.i, %no_exit.1.i.preheader 201 br i1 false, label %return.i, label %endif.8.i 202 endif.8.i: ; preds = %no_exit.1.i 203 %inc.1.i = add i32 0, 1 ; <i32> [#uses=1] 204 br i1 false, label %no_exit.1.i, label %loopentry.3.i.preheader.loopexit 205 loopentry.3.i.preheader.loopexit: ; preds = %endif.8.i 206 br label %loopentry.3.i.preheader 207 loopentry.3.i.preheader: ; preds = %loopentry.3.i.preheader.loopexit, %loopentry.2.i 208 %arg_num.0.i.ph13000 = phi i32 [ 0, %loopentry.2.i ], [ %inc.1.i, %loopentry.3.i.preheader.loopexit ] ; <i32> [#uses=0] 209 ret void 210 return.i: ; preds = %no_exit.1.i 211 ret void 212 213 ; CHECK-LABEL: @test9( 214 ; CHECK: loopentry.3.i.preheader.loopexit: 215 ; CHECK-NEXT: %inc.1.i.le = add i32 0, 1 216 ; CHECK-NEXT: br label %loopentry.3.i.preheader 217 } 218 219 220 ; Potentially trapping instructions may be sunk as long as they are guaranteed 221 ; to be executed. 222 define i32 @test10(i32 %N) { 223 Entry: 224 br label %Loop 225 Loop: ; preds = %Loop, %Entry 226 %N_addr.0.pn = phi i32 [ %dec, %Loop ], [ %N, %Entry ] ; <i32> [#uses=3] 227 %tmp.6 = sdiv i32 %N, %N_addr.0.pn ; <i32> [#uses=1] 228 %dec = add i32 %N_addr.0.pn, -1 ; <i32> [#uses=1] 229 %tmp.1 = icmp ne i32 %N_addr.0.pn, 0 ; <i1> [#uses=1] 230 br i1 %tmp.1, label %Loop, label %Out 231 Out: ; preds = %Loop 232 ret i32 %tmp.6 233 234 ; CHECK-LABEL: @test10( 235 ; CHECK: Out: 236 ; CHECK-NEXT: %[[LCSSAPHI:.*]] = phi i32 [ %N_addr.0.pn 237 ; CHECK-NEXT: %tmp.6.le = sdiv i32 %N, %[[LCSSAPHI]] 238 ; CHECK-NEXT: ret i32 %tmp.6.le 239 } 240 241 ; Should delete, not sink, dead instructions. 242 define void @test11() { 243 br label %Loop 244 Loop: 245 %dead = getelementptr %Ty, %Ty* @X2, i64 0, i32 0 246 br i1 false, label %Loop, label %Out 247 Out: 248 ret void 249 ; CHECK-LABEL: @test11( 250 ; CHECK: Out: 251 ; CHECK-NEXT: ret void 252 } 253 254 @c = common global [1 x i32] zeroinitializer, align 4 255 256 ; Test a *many* way nested loop with multiple exit blocks both of which exit 257 ; multiple loop nests. This exercises LCSSA corner cases. 258 define i32 @PR18753(i1* %a, i1* %b, i1* %c, i1* %d) { 259 entry: 260 br label %l1.header 261 262 l1.header: 263 %iv = phi i64 [ %iv.next, %l1.latch ], [ 0, %entry ] 264 %arrayidx.i = getelementptr inbounds [1 x i32], [1 x i32]* @c, i64 0, i64 %iv 265 br label %l2.header 266 267 l2.header: 268 %x0 = load i1, i1* %c, align 4 269 br i1 %x0, label %l1.latch, label %l3.preheader 270 271 l3.preheader: 272 br label %l3.header 273 274 l3.header: 275 %x1 = load i1, i1* %d, align 4 276 br i1 %x1, label %l2.latch, label %l4.preheader 277 278 l4.preheader: 279 br label %l4.header 280 281 l4.header: 282 %x2 = load i1, i1* %a 283 br i1 %x2, label %l3.latch, label %l4.body 284 285 l4.body: 286 call void @f(i32* %arrayidx.i) 287 %x3 = load i1, i1* %b 288 %l = trunc i64 %iv to i32 289 br i1 %x3, label %l4.latch, label %exit 290 291 l4.latch: 292 call void @g() 293 %x4 = load i1, i1* %b, align 4 294 br i1 %x4, label %l4.header, label %exit 295 296 l3.latch: 297 br label %l3.header 298 299 l2.latch: 300 br label %l2.header 301 302 l1.latch: 303 %iv.next = add nsw i64 %iv, 1 304 br label %l1.header 305 306 exit: 307 %lcssa = phi i32 [ %l, %l4.latch ], [ %l, %l4.body ] 308 ; CHECK-LABEL: @PR18753( 309 ; CHECK: exit: 310 ; CHECK-NEXT: %[[LCSSAPHI:.*]] = phi i64 [ %iv, %l4.latch ], [ %iv, %l4.body ] 311 ; CHECK-NEXT: %l.le = trunc i64 %[[LCSSAPHI]] to i32 312 ; CHECK-NEXT: ret i32 %l.le 313 314 ret i32 %lcssa 315 } 316 317 ; Can't sink stores out of exit blocks containing indirectbr instructions 318 ; because loop simplify does not create dedicated exits for such blocks. Test 319 ; that by sinking the store from lab21 to lab22, but not further. 320 define void @test12() { 321 ; CHECK-LABEL: @test12 322 br label %lab4 323 324 lab4: 325 br label %lab20 326 327 lab5: 328 br label %lab20 329 330 lab6: 331 br label %lab4 332 333 lab7: 334 br i1 undef, label %lab8, label %lab13 335 336 lab8: 337 br i1 undef, label %lab13, label %lab10 338 339 lab10: 340 br label %lab7 341 342 lab13: 343 ret void 344 345 lab20: 346 br label %lab21 347 348 lab21: 349 ; CHECK: lab21: 350 ; CHECK-NOT: store 351 ; CHECK: br i1 false, label %lab21, label %lab22 352 store i32 36127957, i32* undef, align 4 353 br i1 undef, label %lab21, label %lab22 354 355 lab22: 356 ; CHECK: lab22: 357 ; CHECK: store 358 ; CHECK-NEXT: indirectbr i8* undef 359 indirectbr i8* undef, [label %lab5, label %lab6, label %lab7] 360 } 361 362 ; Test that we don't crash when trying to sink stores and there's no preheader 363 ; available (which is used for creating loads that may be used by the SSA 364 ; updater) 365 define void @test13() { 366 ; CHECK-LABEL: @test13 367 br label %lab59 368 369 lab19: 370 br i1 undef, label %lab20, label %lab38 371 372 lab20: 373 br label %lab60 374 375 lab21: 376 br i1 undef, label %lab22, label %lab38 377 378 lab22: 379 br label %lab38 380 381 lab38: 382 ret void 383 384 lab59: 385 indirectbr i8* undef, [label %lab60, label %lab38] 386 387 lab60: 388 ; CHECK: lab60: 389 ; CHECK: store 390 ; CHECK-NEXT: indirectbr 391 store i32 2145244101, i32* undef, align 4 392 indirectbr i8* undef, [label %lab21, label %lab19] 393 } 394 395 declare void @f(i32*) 396 397 declare void @g() 398