[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / LoopUnswitch / callbr.ll
bloba07d0c20103bb623138a42c5c191e6114f0c3a36
1 ; RUN: opt -loop-unswitch -enable-new-pm=0 %s -S | FileCheck %s
3 ; We want to check that the loop does not get split (so only 2 callbr's not 4).
4 ; It's ok to modify this test in the future should we allow the loop containing
5 ; callbr to be unswitched and are able to do so correctly.
7 ; CHECK: callbr void asm sideeffect "# ${0:l}", "X,~{dirflag},~{fpsr},~{flags}"(i8* blockaddress(@foo, %10))
8 ; CHECK: to label %7 [label %10]
9 ; CHECK: callbr void asm sideeffect "# ${0:l}", "X,~{dirflag},~{fpsr},~{flags}"(i8* blockaddress(@foo, %10))
10 ; CHECK: to label %9 [label %10]
12 ; CHECK-NOT: callbr void asm sideeffect "# ${0:l}", "X,~{dirflag},~{fpsr},~{flags}"(i8* blockaddress(@foo, %10))
13 ; CHECK-NOT: to label %7 [label %10]
14 ; CHECK-NOT: callbr void asm sideeffect "# ${0:l}", "X,~{dirflag},~{fpsr},~{flags}"(i8* blockaddress(@foo, %10))
15 ; CHECK-NOT: to label %9 [label %10]
16 ; CHECK-NOT: callbr void asm sideeffect "# ${0:l}", "X,~{dirflag},~{fpsr},~{flags}"(i8* blockaddress(@foo, %19))
17 ; CHECK-NOT: to label %16 [label %19]
18 ; CHECK-NOT: callbr void asm sideeffect "# ${0:l}", "X,~{dirflag},~{fpsr},~{flags}"(i8* blockaddress(@foo, %19))
19 ; CHECK-NOT: to label %18 [label %19]
21 ; This test is essentially:
22 ; void foo(int n) {
23 ;   for (int i = 0; i < 1000; ++i)
24 ;     if (n) {
25 ;       asm goto("# %l0"::::bar);
26 ;       bar:;
27 ;     } else {
28 ;       asm goto("# %l0"::::baz);
29 ;       baz:;
30 ;     }
33 define dso_local void @foo(i32) #0 {
34   br label %2
36 2:                                                ; preds = %10, %1
37   %.0 = phi i32 [ 0, %1 ], [ %11, %10 ]
38   %3 = icmp ult i32 %.0, 1000
39   br i1 %3, label %4, label %12
41 4:                                                ; preds = %2
42   %5 = icmp eq i32 %0, 0
43   br i1 %5, label %8, label %6
45 6:                                                ; preds = %4
46   callbr void asm sideeffect "# ${0:l}", "X,~{dirflag},~{fpsr},~{flags}"(i8* blockaddress(@foo, %10)) #0
47     to label %7 [label %10]
49 7:                                                ; preds = %6
50   br label %10
52 8:                                                ; preds = %4
53   callbr void asm sideeffect "# ${0:l}", "X,~{dirflag},~{fpsr},~{flags}"(i8* blockaddress(@foo, %10)) #0
54     to label %9 [label %10]
56 9:                                                ; preds = %8
57   br label %10
59 10:                                               ; preds = %7, %6, %9, %8
60   %11 = add nuw nsw i32 %.0, 1
61   br label %2
63 12:                                               ; preds = %2
64   ret void