[sanitizer] Improve FreeBSD ASLR detection
[llvm-project.git] / llvm / test / Transforms / InstSimplify / ConstProp / icmp-global.ll
blob67f007982a624aee24e2320bb405d55156156793
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -instsimplify -S -verify | FileCheck %s
4 define i1 @ule_null_constexpr(i8* %x) {
5 ; CHECK-LABEL: @ule_null_constexpr(
6 ; CHECK-NEXT:    ret i1 true
8   %cmp = icmp ule i8 (...)* null, bitcast (i1 (i8*)* @ule_null_constexpr to i8 (...)*)
9   ret i1 %cmp
12 define i1 @ugt_null_constexpr(i8* %x) {
13 ; CHECK-LABEL: @ugt_null_constexpr(
14 ; CHECK-NEXT:    ret i1 false
16   %cmp = icmp ugt i8 (...)* null, bitcast (i1 (i8*)* @ugt_null_constexpr to i8 (...)*)
17   ret i1 %cmp
20 define i1 @uge_constexpr_null(i8* %x) {
21 ; CHECK-LABEL: @uge_constexpr_null(
22 ; CHECK-NEXT:    ret i1 true
24   %cmp = icmp uge i8 (...)* bitcast (i1 (i8*)* @ugt_null_constexpr to i8 (...)*), null
25   ret i1 %cmp
28 define i1 @ult_constexpr_null(i8* %x) {
29 ; CHECK-LABEL: @ult_constexpr_null(
30 ; CHECK-NEXT:    ret i1 false
32   %cmp = icmp ult i8 (...)* bitcast (i1 (i8*)* @ugt_null_constexpr to i8 (...)*), null
33   ret i1 %cmp
36 ; Negative test - we don't know if the constexpr is null.
38 define i1 @ule_constexpr_null(i8* %x) {
39 ; CHECK-LABEL: @ule_constexpr_null(
40 ; CHECK-NEXT:    ret i1 false
42   %cmp = icmp ule i8 (...)* bitcast (i1 (i8*)* @ugt_null_constexpr to i8 (...)*), null
43   ret i1 %cmp
46 ; Negative test - we don't know if the constexpr is *signed* less-than null.
48 define i1 @slt_constexpr_null(i8* %x) {
49 ; CHECK-LABEL: @slt_constexpr_null(
50 ; CHECK-NEXT:    ret i1 icmp slt (i8 (...)* bitcast (i1 (i8*)* @ugt_null_constexpr to i8 (...)*), i8 (...)* null)
52   %cmp = icmp slt i8 (...)* bitcast (i1 (i8*)* @ugt_null_constexpr to i8 (...)*), null
53   ret i1 %cmp
56 ; Negative test - we don't try to evaluate this comparison of constant expressions.
58 define i1 @ult_constexpr_constexpr_one(i8* %x) {
59 ; CHECK-LABEL: @ult_constexpr_constexpr_one(
60 ; CHECK-NEXT:    ret i1 icmp ult (i8 (...)* bitcast (i1 (i8*)* @ugt_null_constexpr to i8 (...)*), i8 (...)* inttoptr (i32 1 to i8 (...)*))
62   %cmp = icmp ult i8 (...)* bitcast (i1 (i8*)* @ugt_null_constexpr to i8 (...)*), inttoptr (i32 1 to i8 (...)*)
63   ret i1 %cmp
66 @g = global [2 x i32] [i32 1, i32 2]
67 @g2 = global i32 0
68 @g2_weak = extern_weak global i32
69 @g3 = global i8 0
71 define i1 @global_ne_null() {
72 ; CHECK-LABEL: @global_ne_null(
73 ; CHECK-NEXT:    ret i1 true
75   %cmp = icmp ne [2 x i32]* @g, null
76   ret i1 %cmp
79 define i1 @global_ugt_null() {
80 ; CHECK-LABEL: @global_ugt_null(
81 ; CHECK-NEXT:    ret i1 true
83   %cmp = icmp ugt [2 x i32]* @g, null
84   ret i1 %cmp
87 define i1 @global_sgt_null() {
88 ; CHECK-LABEL: @global_sgt_null(
89 ; CHECK-NEXT:    ret i1 icmp sgt ([2 x i32]* @g, [2 x i32]* null)
91   %cmp = icmp sgt [2 x i32]* @g, null
92   ret i1 %cmp
95 ; Should not fold to true, as the gep computes a null value.
96 define i1 @global_out_of_bounds_gep_ne_null() {
97 ; CHECK-LABEL: @global_out_of_bounds_gep_ne_null(
98 ; CHECK-NEXT:    ret i1 icmp ne (i8* getelementptr (i8, i8* @g3, i64 sub (i64 0, i64 ptrtoint (i8* @g3 to i64))), i8* null)
100   %cmp = icmp ne i8* getelementptr (i8, i8* @g3, i64 sub (i64 0, i64 ptrtoint (i8* @g3 to i64))), null
101   ret i1 %cmp
104 define i1 @global_inbounds_gep_ne_null() {
105 ; CHECK-LABEL: @global_inbounds_gep_ne_null(
106 ; CHECK-NEXT:    ret i1 true
108   %gep = getelementptr inbounds [2 x i32], [2 x i32]* @g, i64 1
109   %cmp = icmp ne [2 x i32]* %gep, null
110   ret i1 %cmp
113 define i1 @global_gep_ugt_null() {
114 ; CHECK-LABEL: @global_gep_ugt_null(
115 ; CHECK-NEXT:    ret i1 true
117   %gep = getelementptr inbounds [2 x i32], [2 x i32]* @g, i64 1
118   %cmp = icmp ugt [2 x i32]* %gep, null
119   ret i1 %cmp
122 define i1 @global_gep_sgt_null() {
123 ; CHECK-LABEL: @global_gep_sgt_null(
124 ; CHECK-NEXT:    ret i1 icmp sgt ([2 x i32]* getelementptr inbounds ([2 x i32], [2 x i32]* @g, i64 1), [2 x i32]* null)
126   %gep = getelementptr inbounds [2 x i32], [2 x i32]* @g, i64 1
127   %cmp = icmp sgt [2 x i32]* %gep, null
128   ret i1 %cmp
131 ; @g2_weak may be null, in which case this is a zero-index GEP and the pointers
132 ; are equal.
133 define i1 @null_gep_ne_null() {
134 ; CHECK-LABEL: @null_gep_ne_null(
135 ; CHECK-NEXT:    ret i1 icmp ne (i8* getelementptr (i8, i8* null, i64 ptrtoint (i32* @g2_weak to i64)), i8* null)
137   %gep = getelementptr i8, i8* null, i64 ptrtoint (i32* @g2_weak to i64)
138   %cmp = icmp ne i8* %gep, null
139   ret i1 %cmp
142 define i1 @null_gep_ugt_null() {
143 ; CHECK-LABEL: @null_gep_ugt_null(
144 ; CHECK-NEXT:    ret i1 icmp ugt (i8* getelementptr (i8, i8* null, i64 ptrtoint (i32* @g2_weak to i64)), i8* null)
146   %gep = getelementptr i8, i8* null, i64 ptrtoint (i32* @g2_weak to i64)
147   %cmp = icmp ugt i8* %gep, null
148   ret i1 %cmp
151 define i1 @null_gep_sgt_null() {
152 ; CHECK-LABEL: @null_gep_sgt_null(
153 ; CHECK-NEXT:    ret i1 icmp sgt (i8* getelementptr (i8, i8* null, i64 ptrtoint (i32* @g2_weak to i64)), i8* null)
155   %gep = getelementptr i8, i8* null, i64 ptrtoint (i32* @g2_weak to i64)
156   %cmp = icmp sgt i8* %gep, null
157   ret i1 %cmp
160 define i1 @null_gep_ne_null_constant_int() {
161 ; CHECK-LABEL: @null_gep_ne_null_constant_int(
162 ; CHECK-NEXT:    ret i1 true
164   %gep = getelementptr i8, i8* null, i64 1
165   %cmp = icmp ne i8* %gep, null
166   ret i1 %cmp
169 define i1 @null_gep_ugt_null_constant_int() {
170 ; CHECK-LABEL: @null_gep_ugt_null_constant_int(
171 ; CHECK-NEXT:    ret i1 true
173   %gep = getelementptr i8, i8* null, i64 1
174   %cmp = icmp ugt i8* %gep, null
175   ret i1 %cmp
178 define i1 @null_gep_ne_global() {
179 ; CHECK-LABEL: @null_gep_ne_global(
180 ; CHECK-NEXT:    ret i1 icmp ne (i8* getelementptr (i8, i8* null, i64 ptrtoint (i8* @g3 to i64)), i8* @g3)
182   %gep = getelementptr i8, i8* null, i64 ptrtoint (i8* @g3 to i64)
183   %cmp = icmp ne i8* %gep, @g3
184   ret i1 %cmp
187 define i1 @null_gep_ult_global() {
188 ; CHECK-LABEL: @null_gep_ult_global(
189 ; CHECK-NEXT:    ret i1 icmp ult (i8* getelementptr (i8, i8* null, i64 ptrtoint (i8* @g3 to i64)), i8* @g3)
191   %gep = getelementptr i8, i8* null, i64 ptrtoint (i8* @g3 to i64)
192   %cmp = icmp ult i8* %gep, @g3
193   ret i1 %cmp
196 define i1 @null_gep_slt_global() {
197 ; CHECK-LABEL: @null_gep_slt_global(
198 ; CHECK-NEXT:    ret i1 icmp slt ([2 x i32]* getelementptr ([2 x i32], [2 x i32]* null, i64 ptrtoint (i32* @g2 to i64)), [2 x i32]* @g)
200   %gep = getelementptr [2 x i32], [2 x i32]* null, i64 ptrtoint (i32* @g2 to i64)
201   %cmp = icmp slt [2 x i32]* %gep, @g
202   ret i1 %cmp
205 define i1 @global_gep_ne_global() {
206 ; CHECK-LABEL: @global_gep_ne_global(
207 ; CHECK-NEXT:    ret i1 true
209   %gep = getelementptr inbounds [2 x i32], [2 x i32]* @g, i64 1
210   %cmp = icmp ne [2 x i32]* %gep, @g
211   ret i1 %cmp
214 define i1 @global_gep_ugt_global() {
215 ; CHECK-LABEL: @global_gep_ugt_global(
216 ; CHECK-NEXT:    ret i1 true
218   %gep = getelementptr inbounds [2 x i32], [2 x i32]* @g, i64 1
219   %cmp = icmp ugt [2 x i32]* %gep, @g
220   ret i1 %cmp
223 define i1 @global_gep_sgt_global() {
224 ; CHECK-LABEL: @global_gep_sgt_global(
225 ; CHECK-NEXT:    ret i1 icmp sgt ([2 x i32]* getelementptr inbounds ([2 x i32], [2 x i32]* @g, i64 1), [2 x i32]* @g)
227   %gep = getelementptr inbounds [2 x i32], [2 x i32]* @g, i64 1
228   %cmp = icmp sgt [2 x i32]* %gep, @g
229   ret i1 %cmp
232 ; This should not fold to true, as the offset is negative.
233 define i1 @global_gep_ugt_global_neg_offset() {
234 ; CHECK-LABEL: @global_gep_ugt_global_neg_offset(
235 ; CHECK-NEXT:    ret i1 icmp ugt ([2 x i32]* getelementptr ([2 x i32], [2 x i32]* @g, i64 -1), [2 x i32]* @g)
237   %gep = getelementptr [2 x i32], [2 x i32]* @g, i64 -1
238   %cmp = icmp ugt [2 x i32]* %gep, @g
239   ret i1 %cmp
242 define i1 @global_gep_sgt_global_neg_offset() {
243 ; CHECK-LABEL: @global_gep_sgt_global_neg_offset(
244 ; CHECK-NEXT:    ret i1 icmp sgt ([2 x i32]* getelementptr ([2 x i32], [2 x i32]* @g, i64 -1), [2 x i32]* @g)
246   %gep = getelementptr [2 x i32], [2 x i32]* @g, i64 -1
247   %cmp = icmp sgt [2 x i32]* %gep, @g
248   ret i1 %cmp
251 define i1 @global_gep_ugt_global_gep() {
252 ; CHECK-LABEL: @global_gep_ugt_global_gep(
253 ; CHECK-NEXT:    ret i1 true
255   %gep1 = getelementptr inbounds [2 x i32], [2 x i32]* @g, i64 0, i64 0
256   %gep2 = getelementptr inbounds [2 x i32], [2 x i32]* @g, i64 0, i64 1
257   %cmp = icmp ugt i32* %gep2, %gep1
258   ret i1 %cmp
261 ; Should not fold due to signed comparison.
262 define i1 @global_gep_sgt_global_gep() {
263 ; CHECK-LABEL: @global_gep_sgt_global_gep(
264 ; CHECK-NEXT:    ret i1 icmp sgt (i32* getelementptr inbounds ([2 x i32], [2 x i32]* @g, i64 0, i64 1), i32* getelementptr inbounds ([2 x i32], [2 x i32]* @g, i64 0, i64 0))
266   %gep1 = getelementptr inbounds [2 x i32], [2 x i32]* @g, i64 0, i64 0
267   %gep2 = getelementptr inbounds [2 x i32], [2 x i32]* @g, i64 0, i64 1
268   %cmp = icmp sgt i32* %gep2, %gep1
269   ret i1 %cmp
272 define i1 @global_gep_ugt_global_gep_complex() {
273 ; CHECK-LABEL: @global_gep_ugt_global_gep_complex(
274 ; CHECK-NEXT:    ret i1 true
276   %gep1 = getelementptr inbounds [2 x i32], [2 x i32]* @g, i64 0, i64 0
277   %gep2 = getelementptr inbounds [2 x i32], [2 x i32]* @g, i64 0, i64 0
278   %gep2.cast = bitcast i32* %gep2 to i8*
279   %gep3 = getelementptr inbounds i8, i8* %gep2.cast, i64 2
280   %gep3.cast = bitcast i8* %gep3 to i32*
281   %cmp = icmp ugt i32* %gep3.cast, %gep1
282   ret i1 %cmp