Taints the non-acquire RMW's store address with the load part
[oota-llvm.git] / test / Transforms / GVN / edge.ll
1 ; RUN: opt -gvn -S < %s | FileCheck %s
2
3 define i32 @f1(i32 %x) {
4   ; CHECK-LABEL: define i32 @f1(
5 bb0:
6   %cmp = icmp eq i32 %x, 0
7   br i1 %cmp, label %bb2, label %bb1
8 bb1:
9   br label %bb2
10 bb2:
11   %cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
12   %foo = add i32 %cond, %x
13   ret i32 %foo
14   ; CHECK: bb2:
15   ; CHECK: ret i32 %x
16 }
17
18 define i32 @f2(i32 %x) {
19   ; CHECK-LABEL: define i32 @f2(
20 bb0:
21   %cmp = icmp ne i32 %x, 0
22   br i1 %cmp, label %bb1, label %bb2
23 bb1:
24   br label %bb2
25 bb2:
26   %cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
27   %foo = add i32 %cond, %x
28   ret i32 %foo
29   ; CHECK: bb2:
30   ; CHECK: ret i32 %x
31 }
32
33 define i32 @f3(i32 %x) {
34   ; CHECK-LABEL: define i32 @f3(
35 bb0:
36   switch i32 %x, label %bb1 [ i32 0, label %bb2]
37 bb1:
38   br label %bb2
39 bb2:
40   %cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
41   %foo = add i32 %cond, %x
42   ret i32 %foo
43   ; CHECK: bb2:
44   ; CHECK: ret i32 %x
45 }
46
47 declare void @g(i1)
48 define void @f4(i8 * %x)  {
49 ; CHECK-LABEL: define void @f4(
50 bb0:
51   %y = icmp eq i8* null, %x
52   br i1 %y, label %bb2, label %bb1
53 bb1:
54   br label %bb2
55 bb2:
56   %zed = icmp eq i8* null, %x
57   call void @g(i1 %zed)
58 ; CHECK: call void @g(i1 %y)
59   ret void
60 }
61
62 define double @fcmp_oeq_not_zero(double %x, double %y) {
63 entry:
64   %cmp = fcmp oeq double %y, 2.0
65   br i1 %cmp, label %if, label %return
66
67 if:
68   %div = fdiv double %x, %y
69   br label %return
70
71 return:
72   %retval = phi double [ %div, %if ], [ %x, %entry ]
73   ret double %retval
74
75 ; CHECK-LABEL: define double @fcmp_oeq_not_zero(
76 ; CHECK: %div = fdiv double %x, 2.0
77 }
78
79 define double @fcmp_une_not_zero(double %x, double %y) {
80 entry:
81   %cmp = fcmp une double %y, 2.0
82   br i1 %cmp, label %return, label %else
83
84 else:
85   %div = fdiv double %x, %y
86   br label %return
87
88 return:
89   %retval = phi double [ %div, %else ], [ %x, %entry ]
90   ret double %retval
91
92 ; CHECK-LABEL: define double @fcmp_une_not_zero(
93 ; CHECK: %div = fdiv double %x, 2.0
94 }
95
96 ; PR22376 - We can't propagate zero constants because -0.0 
97 ; compares equal to 0.0. If %y is -0.0 in this test case,
98 ; we would produce the wrong sign on the infinity return value.
99 define double @fcmp_oeq_zero(double %x, double %y) {
100 entry:
101   %cmp = fcmp oeq double %y, 0.0
102   br i1 %cmp, label %if, label %return
103
104 if:
105   %div = fdiv double %x, %y
106   br label %return
107
108 return:
109   %retval = phi double [ %div, %if ], [ %x, %entry ]
110   ret double %retval
111
112 ; CHECK-LABEL: define double @fcmp_oeq_zero(
113 ; CHECK: %div = fdiv double %x, %y
114 }
115
116 define double @fcmp_une_zero(double %x, double %y) {
117 entry:
118   %cmp = fcmp une double %y, -0.0
119   br i1 %cmp, label %return, label %else
120
121 else:
122   %div = fdiv double %x, %y
123   br label %return
124
125 return:
126   %retval = phi double [ %div, %else ], [ %x, %entry ]
127   ret double %retval
128
129 ; CHECK-LABEL: define double @fcmp_une_zero(
130 ; CHECK: %div = fdiv double %x, %y
131 }
132
133 ; We also cannot propagate a value if it's not a constant.
134 ; This is because the value could be 0.0 or -0.0.
135
136 define double @fcmp_oeq_maybe_zero(double %x, double %y, double %z1, double %z2) {
137 entry:
138  %z = fadd double %z1, %z2
139  %cmp = fcmp oeq double %y, %z
140  br i1 %cmp, label %if, label %return
141
142 if:
143  %div = fdiv double %x, %z
144  br label %return
145
146 return:
147  %retval = phi double [ %div, %if ], [ %x, %entry ]
148  ret double %retval
149
150 ; CHECK-LABEL: define double @fcmp_oeq_maybe_zero(
151 ; CHECK: %div = fdiv double %x, %z
152 }
153
154 define double @fcmp_une_maybe_zero(double %x, double %y, double %z1, double %z2) {
155 entry:
156  %z = fadd double %z1, %z2
157  %cmp = fcmp une double %y, %z
158  br i1 %cmp, label %return, label %else
159
160 else:
161  %div = fdiv double %x, %z
162  br label %return
163
164 return:
165  %retval = phi double [ %div, %else ], [ %x, %entry ]
166  ret double %retval
167
168 ; CHECK-LABEL: define double @fcmp_une_maybe_zero(
169 ; CHECK: %div = fdiv double %x, %z
170 }