xref: /llvm-project/llvm/test/Transforms/InstCombine/phi-preserve-ir-flags.ll (revision acdc419c897f8a9414c7a00c8908ac32312afee2)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instcombine -S -o - | FileCheck %s
3
4target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5
6define 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]]
18;
19entry:
20  br i1 %cond, label %cond.true, label %cond.false
21
22cond.true:
23  %sub0 = fsub fast float %a, %b
24  br label %cond.end
25
26cond.false:
27  %sub1 = fsub fast float %a, %c
28  br label %cond.end
29
30; The fast-math flags should always be transfered if possible.
31cond.end:
32  %e = phi float [ %sub0, %cond.true ], [ %sub1, %cond.false ]
33  ret float %e
34}
35
36define 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]]
48;
49entry:
50  br i1 %cond, label %cond.true, label %cond.false
51
52cond.true:
53  %sub0 = fsub fast float %a, %b
54  br label %cond.end
55
56cond.false:
57  %sub1 = fsub float %a, %c
58  br label %cond.end
59
60; The fast-math flags should always be transfered if possible.
61cond.end:
62  %e = phi float [ %sub0, %cond.true ], [ %sub1, %cond.false ]
63  ret float %e
64}
65
66define 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]]
78;
79entry:
80  br i1 %cond, label %cond.true, label %cond.false
81
82cond.true:
83  %sub0 = fsub fast float %a, 2.0
84  br label %cond.end
85
86cond.false:
87  %sub1 = fsub fast float %b, 2.0
88  br label %cond.end
89
90cond.end:
91  %e = phi float [ %sub0, %cond.true ], [ %sub1, %cond.false ]
92  ret float %e
93}
94
95define 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]]
107;
108entry:
109  br i1 %cond, label %cond.true, label %cond.false
110
111cond.true:
112  %sub0 = fsub fast float %a, 2.0
113  br label %cond.end
114
115cond.false:
116  %sub1 = fsub float %b, 2.0
117  br label %cond.end
118
119cond.end:
120  %e = phi float [ %sub0, %cond.true ], [ %sub1, %cond.false ]
121  ret float %e
122}
123