[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / GVNSink / indirect-call.ll
blobdb84fe7410fde890c66d297c73df56255e2cc4b9
1 ; RUN: opt < %s -gvn-sink -simplifycfg -simplifycfg-require-and-preserve-domtree=1 -hoist-common-insts=true -simplifycfg-sink-common=false -S | FileCheck %s
3 declare i8 @ext(i1)
5 define zeroext i1 @test1(i1 zeroext %flag, i32 %blksA, i32 %blksB, i32 %nblks, i8(i1)* %ext) {
6 entry:
7   %cmp = icmp uge i32 %blksA, %nblks
8   br i1 %flag, label %if.then, label %if.else
10 ; CHECK-LABEL: test1
11 ; CHECK: call i8 @ext
12 ; CHECK: call i8 %ext
13 if.then:
14   %frombool1 = call i8 @ext(i1 %cmp)
15   br label %if.end
17 if.else:
18   %frombool3 = call i8 %ext(i1 %cmp)
19   br label %if.end
21 if.end:
22   %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.else ]
23   %tobool4 = icmp ne i8 %obeys.0, 0
24   ret i1 %tobool4
27 define zeroext i1 @test2(i1 zeroext %flag, i32 %blksA, i32 %blksB, i32 %nblks, i8(i1)* %ext) {
28 entry:
29   %cmp = icmp uge i32 %blksA, %nblks
30   br i1 %flag, label %if.then, label %if.else
32 ; CHECK-LABEL: test2
33 ; CHECK: call i8 %ext
34 ; CHECK-NOT: call
35 if.then:
36   %frombool1 = call i8 %ext(i1 %cmp)
37   br label %if.end
39 if.else:
40   %frombool3 = call i8 %ext(i1 %cmp)
41   br label %if.end
43 if.end:
44   %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.else ]
45   %tobool4 = icmp ne i8 %obeys.0, 0
46   ret i1 %tobool4
49 define zeroext i1 @test3(i1 zeroext %flag, i32 %blksA, i32 %blksB, i32 %nblks, i8(i1)* %ext1, i8(i1)* %ext2) {
50 entry:
51   %cmp = icmp uge i32 %blksA, %nblks
52   br i1 %flag, label %if.then, label %if.else
54 ; CHECK-LABEL: test3
55 ; CHECK: %[[x:.*]] = select i1 %flag, i8 (i1)* %ext1, i8 (i1)* %ext2
56 ; CHECK: call i8 %[[x]](i1 %cmp)
57 ; CHECK-NOT: call
58 if.then:
59   %frombool1 = call i8 %ext1(i1 %cmp)
60   br label %if.end
62 if.else:
63   %frombool3 = call i8 %ext2(i1 %cmp)
64   br label %if.end
66 if.end:
67   %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.else ]
68   %tobool4 = icmp ne i8 %obeys.0, 0
69   ret i1 %tobool4
72 ; Make sure no indirect call is introduced from direct calls
73 declare i8 @ext2(i1)
74 define zeroext i1 @test4(i1 zeroext %flag, i32 %blksA, i32 %blksB, i32 %nblks) {
75 entry:
76   %cmp = icmp uge i32 %blksA, %nblks
77   br i1 %flag, label %if.then, label %if.else
79 ; CHECK-LABEL: test4
80 ; CHECK: call i8 @ext(
81 ; CHECK: call i8 @ext2(
82 if.then:
83   %frombool1 = call i8 @ext(i1 %cmp)
84   br label %if.end
86 if.else:
87   %frombool3 = call i8 @ext2(i1 %cmp)
88   br label %if.end
90 if.end:
91   %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.else ]
92   %tobool4 = icmp ne i8 %obeys.0, 0
93   ret i1 %tobool4