[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / InstCombine / phi-preserve-ir-flags.ll
blob77a7ce5685dd13f72b0e523d82b69b5bd5345793
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -instcombine -S -o - | FileCheck %s
4 target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
6 define float @func1(float %a, float %b, float %c, i1 %cond) {
7 ; CHECK-LABEL: @func1(
8 ; CHECK-NEXT:  entry:
9 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
10 ; CHECK:       cond.true:
11 ; CHECK-NEXT:    br label [[COND_END:%.*]]
12 ; CHECK:       cond.false:
13 ; CHECK-NEXT:    br label [[COND_END]]
14 ; CHECK:       cond.end:
15 ; CHECK-NEXT:    [[B_PN:%.*]] = phi float [ [[B:%.*]], [[COND_TRUE]] ], [ [[C:%.*]], [[COND_FALSE]] ]
16 ; CHECK-NEXT:    [[E:%.*]] = fsub fast float [[A:%.*]], [[B_PN]]
17 ; CHECK-NEXT:    ret float [[E]]
19 entry:
20   br i1 %cond, label %cond.true, label %cond.false
22 cond.true:
23   %sub0 = fsub fast float %a, %b
24   br label %cond.end
26 cond.false:
27   %sub1 = fsub fast float %a, %c
28   br label %cond.end
30 ; The fast-math flags should always be transfered if possible.
31 cond.end:
32   %e = phi float [ %sub0, %cond.true ], [ %sub1, %cond.false ]
33   ret float %e
36 define float @func2(float %a, float %b, float %c, i1 %cond) {
37 ; CHECK-LABEL: @func2(
38 ; CHECK-NEXT:  entry:
39 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
40 ; CHECK:       cond.true:
41 ; CHECK-NEXT:    br label [[COND_END:%.*]]
42 ; CHECK:       cond.false:
43 ; CHECK-NEXT:    br label [[COND_END]]
44 ; CHECK:       cond.end:
45 ; CHECK-NEXT:    [[B_PN:%.*]] = phi float [ [[B:%.*]], [[COND_TRUE]] ], [ [[C:%.*]], [[COND_FALSE]] ]
46 ; CHECK-NEXT:    [[E:%.*]] = fsub float [[A:%.*]], [[B_PN]]
47 ; CHECK-NEXT:    ret float [[E]]
49 entry:
50   br i1 %cond, label %cond.true, label %cond.false
52 cond.true:
53   %sub0 = fsub fast float %a, %b
54   br label %cond.end
56 cond.false:
57   %sub1 = fsub float %a, %c
58   br label %cond.end
60 ; The fast-math flags should always be transfered if possible.
61 cond.end:
62   %e = phi float [ %sub0, %cond.true ], [ %sub1, %cond.false ]
63   ret float %e
66 define float @func3(float %a, float %b, float %c, i1 %cond) {
67 ; CHECK-LABEL: @func3(
68 ; CHECK-NEXT:  entry:
69 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
70 ; CHECK:       cond.true:
71 ; CHECK-NEXT:    br label [[COND_END:%.*]]
72 ; CHECK:       cond.false:
73 ; CHECK-NEXT:    br label [[COND_END]]
74 ; CHECK:       cond.end:
75 ; CHECK-NEXT:    [[E_IN:%.*]] = phi float [ [[A:%.*]], [[COND_TRUE]] ], [ [[B:%.*]], [[COND_FALSE]] ]
76 ; CHECK-NEXT:    [[E:%.*]] = fadd fast float [[E_IN]], -2.000000e+00
77 ; CHECK-NEXT:    ret float [[E]]
79 entry:
80   br i1 %cond, label %cond.true, label %cond.false
82 cond.true:
83   %sub0 = fsub fast float %a, 2.0
84   br label %cond.end
86 cond.false:
87   %sub1 = fsub fast float %b, 2.0
88   br label %cond.end
90 cond.end:
91   %e = phi float [ %sub0, %cond.true ], [ %sub1, %cond.false ]
92   ret float %e
95 define float @func4(float %a, float %b, float %c, i1 %cond) {
96 ; CHECK-LABEL: @func4(
97 ; CHECK-NEXT:  entry:
98 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
99 ; CHECK:       cond.true:
100 ; CHECK-NEXT:    br label [[COND_END:%.*]]
101 ; CHECK:       cond.false:
102 ; CHECK-NEXT:    br label [[COND_END]]
103 ; CHECK:       cond.end:
104 ; CHECK-NEXT:    [[E_IN:%.*]] = phi float [ [[A:%.*]], [[COND_TRUE]] ], [ [[B:%.*]], [[COND_FALSE]] ]
105 ; CHECK-NEXT:    [[E:%.*]] = fadd float [[E_IN]], -2.000000e+00
106 ; CHECK-NEXT:    ret float [[E]]
108 entry:
109   br i1 %cond, label %cond.true, label %cond.false
111 cond.true:
112   %sub0 = fsub fast float %a, 2.0
113   br label %cond.end
115 cond.false:
116   %sub1 = fsub float %b, 2.0
117   br label %cond.end
119 cond.end:
120   %e = phi float [ %sub0, %cond.true ], [ %sub1, %cond.false ]
121   ret float %e