[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / GVNHoist / hoist-convergent.ll
blobf5bf03f39b58e84407ab9a1289d27d9cfbea72c0
1 ; RUN: opt -gvn-hoist -S < %s | FileCheck %s
3 ; Check that convergent calls are not hoisted.
5 ; CHECK-LABEL: @no_convergent_func_hoisting(
6 ; CHECK: if.then:
7 ; CHECK: call float @convergent_func(
9 ; CHECK: if.else:
10 ; CHECK: call float @convergent_func(
11 define float @no_convergent_func_hoisting(float %d, float %min, float %max, float %a) {
12 entry:
13   %div = fdiv float 1.000000e+00, %d
14   %cmp = fcmp oge float %div, 0.000000e+00
15   br i1 %cmp, label %if.then, label %if.else
17 if.then:
18   %sub1 = fsub float %max, %a
19   %mul2 = call float @convergent_func(float %sub1, float %div)
20   br label %if.end
22 if.else:
23   %sub5 = fsub float %max, %a
24   %mul6 = call float @convergent_func(float %sub5, float %div)
25   br label %if.end
27 if.end:
28   %tmax.0 = phi float [ %mul2, %if.then ], [ %mul6, %if.else ]
29   %add = fadd float %tmax.0, 10.0
30   ret float %add
33 ; The call site is convergent but the declaration is not.
34 ; CHECK-LABEL: @no_convergent_call_hoisting(
36 ; CHECK: if.then:
37 ; CHECK: call float @func(
39 ; CHECK: if.else:
40 ; CHECK: call float @func(
41 define float @no_convergent_call_hoisting(float %d, float %min, float %max, float %a) {
42 entry:
43   %div = fdiv float 1.000000e+00, %d
44   %cmp = fcmp oge float %div, 0.000000e+00
45   br i1 %cmp, label %if.then, label %if.else
47 if.then:
48   %sub1 = fsub float %max, %a
49   %mul2 = call float @func(float %sub1, float %div) #0
50   br label %if.end
52 if.else:
53   %sub5 = fsub float %max, %a
54   %mul6 = call float @func(float %sub5, float %div) #0
55   br label %if.end
57 if.end:
58   %tmax.0 = phi float [ %mul2, %if.then ], [ %mul6, %if.else ]
59   %add = fadd float %tmax.0, 10.0
60   ret float %add
63 ; The call site is convergent but the declaration is not.
64 ; CHECK-LABEL: @call_hoisting(
65 ; CHECK: call float @func(
66 ; CHECK-NOT: call float @func(
67 define float @call_hoisting(float %d, float %min, float %max, float %a) {
68 entry:
69   %div = fdiv float 1.000000e+00, %d
70   %cmp = fcmp oge float %div, 0.000000e+00
71   br i1 %cmp, label %if.then, label %if.else
73 if.then:
74   %sub1 = fsub float %max, %a
75   %mul2 = call float @func(float %sub1, float %div)
76   br label %if.end
78 if.else:
79   %sub5 = fsub float %max, %a
80   %mul6 = call float @func(float %sub5, float %div)
81   br label %if.end
83 if.end:
84   %tmax.0 = phi float [ %mul2, %if.then ], [ %mul6, %if.else ]
85   %add = fadd float %tmax.0, 10.0
86   ret float %add
89 declare float @convergent_func(float, float) #0
90 declare float @func(float, float) #1
92 attributes #0 = { nounwind readnone convergent willreturn }
93 attributes #1 = { nounwind readnone willreturn }