@@ -147,3 +147,79 @@ define { <2 x i32>, <2 x i1> } @fold_simple_splat_constant_with_or_fail(<2 x i32
147147 %b = tail call { <2 x i32 >, <2 x i1 > } @llvm.uadd.with.overflow.v2i32 (<2 x i32 > %a , <2 x i32 > <i32 30 , i32 30 >)
148148 ret { <2 x i32 >, <2 x i1 > } %b
149149}
150+
151+ define i32 @uadd_with_zext (i32 %x , i32 %y ) {
152+ ; CHECK-LABEL: @uadd_with_zext(
153+ ; CHECK-NEXT: [[CONV:%.*]] = zext i32 [[X:%.*]] to i64
154+ ; CHECK-NEXT: [[CONV1:%.*]] = zext i32 [[Y:%.*]] to i64
155+ ; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[CONV]], [[CONV1]]
156+ ; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ugt i64 [[ADD]], 4294967295
157+ ; CHECK-NEXT: [[COND:%.*]] = zext i1 [[CMP]] to i32
158+ ; CHECK-NEXT: ret i32 [[COND]]
159+ ;
160+ %conv = zext i32 %x to i64
161+ %conv1 = zext i32 %y to i64
162+ %add = add i64 %conv , %conv1
163+ %cmp = icmp ugt i64 %add , 4294967295
164+ %cond = zext i1 %cmp to i32
165+ ret i32 %cond
166+ }
167+
168+ define i32 @uadd_with_zext_use_and (i32 %x , i32 %y ) {
169+ ; CHECK-LABEL: @uadd_with_zext_use_and(
170+ ; CHECK-NEXT: [[CONV:%.*]] = zext i32 [[X:%.*]] to i64
171+ ; CHECK-NEXT: [[CONV1:%.*]] = zext i32 [[Y:%.*]] to i64
172+ ; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[CONV]], [[CONV1]]
173+ ; CHECK-NEXT: [[AND:%.*]] = and i64 [[ADD]], 65535
174+ ; CHECK-NEXT: call void @usei64(i64 [[AND]])
175+ ; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ugt i64 [[ADD]], 4294967295
176+ ; CHECK-NEXT: [[COND:%.*]] = zext i1 [[CMP]] to i32
177+ ; CHECK-NEXT: ret i32 [[COND]]
178+ ;
179+ %conv = zext i32 %x to i64
180+ %conv1 = zext i32 %y to i64
181+ %add = add i64 %conv , %conv1
182+ %and = and i64 %add , 65535
183+ call void @usei64 (i64 %and )
184+ %cmp = icmp ugt i64 %add , 4294967295
185+ %cond = zext i1 %cmp to i32
186+ ret i32 %cond
187+ }
188+
189+ define i32 @uadd_with_zext_inverse (i32 %x , i32 %y ) {
190+ ; CHECK-LABEL: @uadd_with_zext_inverse(
191+ ; CHECK-NEXT: [[CONV:%.*]] = zext i32 [[X:%.*]] to i64
192+ ; CHECK-NEXT: [[CONV1:%.*]] = zext i32 [[Y:%.*]] to i64
193+ ; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[CONV]], [[CONV1]]
194+ ; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[ADD]], 4294967296
195+ ; CHECK-NEXT: [[COND:%.*]] = zext i1 [[CMP]] to i32
196+ ; CHECK-NEXT: ret i32 [[COND]]
197+ ;
198+ %conv = zext i32 %x to i64
199+ %conv1 = zext i32 %y to i64
200+ %add = add i64 %conv , %conv1
201+ %cmp = icmp ule i64 %add , 4294967295
202+ %cond = zext i1 %cmp to i32
203+ ret i32 %cond
204+ }
205+
206+ define i32 @uadd_with_zext_neg_use (i32 %x , i32 %y ) {
207+ ; CHECK-LABEL: @uadd_with_zext_neg_use(
208+ ; CHECK-NEXT: [[CONV:%.*]] = zext i32 [[X:%.*]] to i64
209+ ; CHECK-NEXT: [[CONV1:%.*]] = zext i32 [[Y:%.*]] to i64
210+ ; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[CONV]], [[CONV1]]
211+ ; CHECK-NEXT: call void @usei64(i64 [[ADD]])
212+ ; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ugt i64 [[ADD]], 4294967295
213+ ; CHECK-NEXT: [[COND:%.*]] = zext i1 [[CMP]] to i32
214+ ; CHECK-NEXT: ret i32 [[COND]]
215+ ;
216+ %conv = zext i32 %x to i64
217+ %conv1 = zext i32 %y to i64
218+ %add = add i64 %conv , %conv1
219+ call void @usei64 (i64 %add )
220+ %cmp = icmp ugt i64 %add , 4294967295
221+ %cond = zext i1 %cmp to i32
222+ ret i32 %cond
223+ }
224+
225+ declare void @usei64 (i64 )
0 commit comments