[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / Transforms / EarlyCSE / edge.ll
blobdd8c1b7671f6ef0925733110b1b756ebf3f460af
1 ; RUN: opt -early-cse -S < %s | FileCheck %s
2 ; RUN: opt -basicaa -early-cse-memssa -S < %s | FileCheck %s
3 ; Same as GVN/edge.ll, but updated to reflect EarlyCSE's less powerful
4 ; implementation.  EarlyCSE currently doesn't exploit equality comparisons
5 ; against constants.
7 define i32 @f1(i32 %x) {
8   ; CHECK-LABEL: define i32 @f1(
9 bb0:
10   %cmp = icmp eq i32 %x, 0
11   br i1 %cmp, label %bb2, label %bb1
12 bb1:
13   br label %bb2
14 bb2:
15   %cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
16   %foo = add i32 %cond, %x
17   ret i32 %foo
18   ; CHECK: bb2:
19   ; CHECK: %cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
22 define i32 @f2(i32 %x) {
23   ; CHECK-LABEL: define i32 @f2(
24 bb0:
25   %cmp = icmp ne i32 %x, 0
26   br i1 %cmp, label %bb1, label %bb2
27 bb1:
28   br label %bb2
29 bb2:
30   %cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
31   %foo = add i32 %cond, %x
32   ret i32 %foo
33   ; CHECK: bb2:
34   ; CHECK: %cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
37 define i32 @f3(i32 %x) {
38   ; CHECK-LABEL: define i32 @f3(
39 bb0:
40   switch i32 %x, label %bb1 [ i32 0, label %bb2]
41 bb1:
42   br label %bb2
43 bb2:
44   %cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
45   %foo = add i32 %cond, %x
46   ret i32 %foo
47   ; CHECK: bb2:
48   ; CHECK: %cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
51 declare void @g(i1)
52 define void @f4(i8 * %x)  {
53 ; CHECK-LABEL: define void @f4(
54 bb0:
55   %y = icmp eq i8* null, %x
56   br i1 %y, label %bb2, label %bb1
57 bb1:
58   br label %bb2
59 bb2:
60   %zed = icmp eq i8* null, %x
61   call void @g(i1 %zed)
62 ; CHECK: call void @g(i1 %y)
63   ret void
66 define double @fcmp_oeq_not_zero(double %x, double %y) {
67 entry:
68   %cmp = fcmp oeq double %y, 2.0
69   br i1 %cmp, label %if, label %return
71 if:
72   %div = fdiv double %x, %y
73   br label %return
75 return:
76   %retval = phi double [ %div, %if ], [ %x, %entry ]
77   ret double %retval
79 ; CHECK-LABEL: define double @fcmp_oeq_not_zero(
80 ; CHECK: %div = fdiv double %x, %y
83 define double @fcmp_une_not_zero(double %x, double %y) {
84 entry:
85   %cmp = fcmp une double %y, 2.0
86   br i1 %cmp, label %return, label %else
88 else:
89   %div = fdiv double %x, %y
90   br label %return
92 return:
93   %retval = phi double [ %div, %else ], [ %x, %entry ]
94   ret double %retval
96 ; CHECK-LABEL: define double @fcmp_une_not_zero(
97 ; CHECK: %div = fdiv double %x, %y
100 ; PR22376 - We can't propagate zero constants because -0.0 
101 ; compares equal to 0.0. If %y is -0.0 in this test case,
102 ; we would produce the wrong sign on the infinity return value.
103 define double @fcmp_oeq_zero(double %x, double %y) {
104 entry:
105   %cmp = fcmp oeq double %y, 0.0
106   br i1 %cmp, label %if, label %return
109   %div = fdiv double %x, %y
110   br label %return
112 return:
113   %retval = phi double [ %div, %if ], [ %x, %entry ]
114   ret double %retval
116 ; CHECK-LABEL: define double @fcmp_oeq_zero(
117 ; CHECK: %div = fdiv double %x, %y
120 define double @fcmp_une_zero(double %x, double %y) {
121 entry:
122   %cmp = fcmp une double %y, -0.0
123   br i1 %cmp, label %return, label %else
125 else:
126   %div = fdiv double %x, %y
127   br label %return
129 return:
130   %retval = phi double [ %div, %else ], [ %x, %entry ]
131   ret double %retval
133 ; CHECK-LABEL: define double @fcmp_une_zero(
134 ; CHECK: %div = fdiv double %x, %y
137 ; We also cannot propagate a value if it's not a constant.
138 ; This is because the value could be 0.0 or -0.0.
140 define double @fcmp_oeq_maybe_zero(double %x, double %y, double %z1, double %z2) {
141 entry:
142  %z = fadd double %z1, %z2
143  %cmp = fcmp oeq double %y, %z
144  br i1 %cmp, label %if, label %return
147  %div = fdiv double %x, %z
148  br label %return
150 return:
151  %retval = phi double [ %div, %if ], [ %x, %entry ]
152  ret double %retval
154 ; CHECK-LABEL: define double @fcmp_oeq_maybe_zero(
155 ; CHECK: %div = fdiv double %x, %z
158 define double @fcmp_une_maybe_zero(double %x, double %y, double %z1, double %z2) {
159 entry:
160  %z = fadd double %z1, %z2
161  %cmp = fcmp une double %y, %z
162  br i1 %cmp, label %return, label %else
164 else:
165  %div = fdiv double %x, %z
166  br label %return
168 return:
169  %retval = phi double [ %div, %else ], [ %x, %entry ]
170  ret double %retval
172 ; CHECK-LABEL: define double @fcmp_une_maybe_zero(
173 ; CHECK: %div = fdiv double %x, %z