[sanitizer] Improve FreeBSD ASLR detection
[llvm-project.git] / llvm / test / Transforms / InstCombine / icmp-mul-and.ll
blobb15404c0aaa2f725bcd8118ae4ffd1ed0a139215
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -instcombine -S | FileCheck %s
4 define i1 @pr40493(i32 %area) {
5 ; CHECK-LABEL: @pr40493(
6 ; CHECK-NEXT:  entry:
7 ; CHECK-NEXT:    [[MUL:%.*]] = mul i32 [[AREA:%.*]], 12
8 ; CHECK-NEXT:    [[REM:%.*]] = and i32 [[MUL]], 4
9 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[REM]], 0
10 ; CHECK-NEXT:    ret i1 [[CMP]]
12 entry:
13   %mul = mul i32 %area, 12
14   %rem = and i32 %mul, 4
15   %cmp = icmp eq i32 %rem, 0
16   ret i1 %cmp
19 define i1 @pr40493_neg1(i32 %area) {
20 ; CHECK-LABEL: @pr40493_neg1(
21 ; CHECK-NEXT:  entry:
22 ; CHECK-NEXT:    [[MUL:%.*]] = mul i32 [[AREA:%.*]], 11
23 ; CHECK-NEXT:    [[REM:%.*]] = and i32 [[MUL]], 4
24 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[REM]], 0
25 ; CHECK-NEXT:    ret i1 [[CMP]]
27 entry:
28   %mul = mul i32 %area, 11
29   %rem = and i32 %mul, 4
30   %cmp = icmp eq i32 %rem, 0
31   ret i1 %cmp
34 define i1 @pr40493_neg2(i32 %area) {
35 ; CHECK-LABEL: @pr40493_neg2(
36 ; CHECK-NEXT:  entry:
37 ; CHECK-NEXT:    [[MUL:%.*]] = mul i32 [[AREA:%.*]], 12
38 ; CHECK-NEXT:    [[REM:%.*]] = and i32 [[MUL]], 12
39 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[REM]], 0
40 ; CHECK-NEXT:    ret i1 [[CMP]]
42 entry:
43   %mul = mul i32 %area, 12
44   %rem = and i32 %mul, 15
45   %cmp = icmp eq i32 %rem, 0
46   ret i1 %cmp
49 define i32 @pr40493_neg3(i32 %area) {
50 ; CHECK-LABEL: @pr40493_neg3(
51 ; CHECK-NEXT:  entry:
52 ; CHECK-NEXT:    [[MUL:%.*]] = mul i32 [[AREA:%.*]], 12
53 ; CHECK-NEXT:    [[REM:%.*]] = and i32 [[MUL]], 4
54 ; CHECK-NEXT:    ret i32 [[REM]]
56 entry:
57   %mul = mul i32 %area, 12
58   %rem = and i32 %mul, 4
59   ret i32 %rem
62 define <4 x i1> @pr40493_vec1(<4 x i32> %area) {
63 ; CHECK-LABEL: @pr40493_vec1(
64 ; CHECK-NEXT:  entry:
65 ; CHECK-NEXT:    [[MUL:%.*]] = mul <4 x i32> [[AREA:%.*]], <i32 12, i32 12, i32 12, i32 12>
66 ; CHECK-NEXT:    [[REM:%.*]] = and <4 x i32> [[MUL]], <i32 4, i32 4, i32 4, i32 4>
67 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq <4 x i32> [[REM]], zeroinitializer
68 ; CHECK-NEXT:    ret <4 x i1> [[CMP]]
70 entry:
71   %mul = mul <4 x i32> %area, <i32 12, i32 12, i32 12, i32 12>
72   %rem = and <4 x i32> %mul, <i32 4, i32 4, i32 4, i32 4>
73   %cmp = icmp eq <4 x i32> %rem, zeroinitializer
74   ret <4 x i1> %cmp
77 define <4 x i1> @pr40493_vec2(<4 x i32> %area) {
78 ; CHECK-LABEL: @pr40493_vec2(
79 ; CHECK-NEXT:  entry:
80 ; CHECK-NEXT:    [[MUL:%.*]] = mul <4 x i32> [[AREA:%.*]], <i32 12, i32 12, i32 12, i32 undef>
81 ; CHECK-NEXT:    [[REM:%.*]] = and <4 x i32> [[MUL]], <i32 4, i32 4, i32 4, i32 4>
82 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq <4 x i32> [[REM]], zeroinitializer
83 ; CHECK-NEXT:    ret <4 x i1> [[CMP]]
85 entry:
86   %mul = mul <4 x i32> %area, <i32 12, i32 12, i32 12, i32 undef>
87   %rem = and <4 x i32> %mul, <i32 4, i32 4, i32 4, i32 4>
88   %cmp = icmp eq <4 x i32> %rem, zeroinitializer
89   ret <4 x i1> %cmp
92 define <4 x i1> @pr40493_vec3(<4 x i32> %area) {
93 ; CHECK-LABEL: @pr40493_vec3(
94 ; CHECK-NEXT:  entry:
95 ; CHECK-NEXT:    [[MUL:%.*]] = mul <4 x i32> [[AREA:%.*]], <i32 12, i32 12, i32 12, i32 12>
96 ; CHECK-NEXT:    [[REM:%.*]] = and <4 x i32> [[MUL]], <i32 4, i32 4, i32 4, i32 undef>
97 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq <4 x i32> [[REM]], zeroinitializer
98 ; CHECK-NEXT:    ret <4 x i1> [[CMP]]
100 entry:
101   %mul = mul <4 x i32> %area, <i32 12, i32 12, i32 12, i32 12>
102   %rem = and <4 x i32> %mul, <i32 4, i32 4, i32 4, i32 undef>
103   %cmp = icmp eq <4 x i32> %rem, zeroinitializer
104   ret <4 x i1> %cmp
107 define <4 x i1> @pr40493_vec4(<4 x i32> %area) {
108 ; CHECK-LABEL: @pr40493_vec4(
109 ; CHECK-NEXT:  entry:
110 ; CHECK-NEXT:    [[MUL:%.*]] = mul <4 x i32> [[AREA:%.*]], <i32 12, i32 12, i32 12, i32 undef>
111 ; CHECK-NEXT:    [[REM:%.*]] = and <4 x i32> [[MUL]], <i32 4, i32 4, i32 4, i32 undef>
112 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq <4 x i32> [[REM]], zeroinitializer
113 ; CHECK-NEXT:    ret <4 x i1> [[CMP]]
115 entry:
116   %mul = mul <4 x i32> %area, <i32 12, i32 12, i32 12, i32 undef>
117   %rem = and <4 x i32> %mul, <i32 4, i32 4, i32 4, i32 undef>
118   %cmp = icmp eq <4 x i32> %rem, zeroinitializer
119   ret <4 x i1> %cmp
122 define <4 x i1> @pr40493_vec5(<4 x i32> %area) {
123 ; CHECK-LABEL: @pr40493_vec5(
124 ; CHECK-NEXT:  entry:
125 ; CHECK-NEXT:    [[MUL:%.*]] = mul <4 x i32> [[AREA:%.*]], <i32 12, i32 12, i32 20, i32 20>
126 ; CHECK-NEXT:    [[REM:%.*]] = and <4 x i32> [[MUL]], <i32 2, i32 4, i32 2, i32 4>
127 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq <4 x i32> [[REM]], zeroinitializer
128 ; CHECK-NEXT:    ret <4 x i1> [[CMP]]
130 entry:
131   %mul = mul <4 x i32> %area, <i32 12, i32 12, i32 20, i32 20>
132   %rem = and <4 x i32> %mul, <i32 2, i32 4, i32 2, i32 4>
133   %cmp = icmp eq <4 x i32> %rem, zeroinitializer
134   ret <4 x i1> %cmp
137 define i1 @pr51551(i32 %x, i32 %y) {
138 ; CHECK-LABEL: @pr51551(
139 ; CHECK-NEXT:  entry:
140 ; CHECK-NEXT:    [[TMP0:%.*]] = and i32 [[Y:%.*]], -8
141 ; CHECK-NEXT:    [[TMP1:%.*]] = or i32 [[TMP0]], 1
142 ; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP1]], [[X:%.*]]
143 ; CHECK-NEXT:    [[AND:%.*]] = and i32 [[MUL]], 3
144 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[AND]], 0
145 ; CHECK-NEXT:    ret i1 [[CMP]]
147 entry:
148   %0 = and i32 %y, -7
149   %1 = or i32 %0, 1
150   %mul = mul nsw i32 %1, %x
151   %and = and i32 %mul, 3
152   %cmp = icmp eq i32 %and, 0
153   ret i1 %cmp
156 define i1 @pr51551_2(i32 %x, i32 %y) {
157 ; CHECK-LABEL: @pr51551_2(
158 ; CHECK-NEXT:  entry:
159 ; CHECK-NEXT:    [[TMP0:%.*]] = and i32 [[Y:%.*]], -8
160 ; CHECK-NEXT:    [[TMP1:%.*]] = or i32 [[TMP0]], 1
161 ; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP1]], [[X:%.*]]
162 ; CHECK-NEXT:    [[AND:%.*]] = and i32 [[MUL]], 1
163 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[AND]], 0
164 ; CHECK-NEXT:    ret i1 [[CMP]]
166 entry:
167   %0 = and i32 %y, -7
168   %1 = or i32 %0, 1
169   %mul = mul nsw i32 %1, %x
170   %and = and i32 %mul, 1
171   %cmp = icmp eq i32 %and, 0
172   ret i1 %cmp
175 define i1 @pr51551_neg1(i32 %x, i32 %y) {
176 ; CHECK-LABEL: @pr51551_neg1(
177 ; CHECK-NEXT:  entry:
178 ; CHECK-NEXT:    [[TMP0:%.*]] = and i32 [[Y:%.*]], -4
179 ; CHECK-NEXT:    [[TMP1:%.*]] = or i32 [[TMP0]], 1
180 ; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP1]], [[X:%.*]]
181 ; CHECK-NEXT:    [[AND:%.*]] = and i32 [[MUL]], 7
182 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[AND]], 0
183 ; CHECK-NEXT:    ret i1 [[CMP]]
185 entry:
186   %0 = and i32 %y, -3
187   %1 = or i32 %0, 1
188   %mul = mul nsw i32 %1, %x
189   %and = and i32 %mul, 7
190   %cmp = icmp eq i32 %and, 0
191   ret i1 %cmp
194 define i1 @pr51551_neg2(i32 %x, i32 %y) {
195 ; CHECK-LABEL: @pr51551_neg2(
196 ; CHECK-NEXT:  entry:
197 ; CHECK-NEXT:    [[TMP0:%.*]] = and i32 [[Y:%.*]], -7
198 ; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP0]], [[X:%.*]]
199 ; CHECK-NEXT:    [[AND:%.*]] = and i32 [[MUL]], 7
200 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[AND]], 0
201 ; CHECK-NEXT:    ret i1 [[CMP]]
203 entry:
204   %0 = and i32 %y, -7
205   %mul = mul nsw i32 %0, %x
206   %and = and i32 %mul, 7
207   %cmp = icmp eq i32 %and, 0
208   ret i1 %cmp
211 define i32 @pr51551_neg3(i32 %x, i32 %y) {
212 ; CHECK-LABEL: @pr51551_neg3(
213 ; CHECK-NEXT:  entry:
214 ; CHECK-NEXT:    [[TMP0:%.*]] = and i32 [[Y:%.*]], -8
215 ; CHECK-NEXT:    [[TMP1:%.*]] = or i32 [[TMP0]], 1
216 ; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP1]], [[X:%.*]]
217 ; CHECK-NEXT:    [[AND:%.*]] = and i32 [[MUL]], 7
218 ; CHECK-NEXT:    ret i32 [[AND]]
220 entry:
221   %0 = and i32 %y, -7
222   %1 = or i32 %0, 1
223   %mul = mul nsw i32 %1, %x
224   %and = and i32 %mul, 7
225   ret i32 %and