351 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4define i64 @src_2add_2sext_sub_1(i32 %x, i32 %y, i32 %z) {5; CHECK-LABEL: @src_2add_2sext_sub_1(6; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[Y:%.*]] to i647; CHECK-NEXT: [[TMP2:%.*]] = sext i32 [[Z:%.*]] to i648; CHECK-NEXT: [[SUB:%.*]] = sub nsw i64 [[TMP1]], [[TMP2]]9; CHECK-NEXT: ret i64 [[SUB]]10;11 %add1 = add nsw i32 %x, %y12 %add2 = add nsw i32 %x, %z13 %sext1 = sext i32 %add1 to i6414 %sext2 = sext i32 %add2 to i6415 %sub = sub i64 %sext1, %sext216 ret i64 %sub17}18 19define i64 @src_2add_2sext_sub_2(i32 %x, i32 %y, i32 %z) {20; CHECK-LABEL: @src_2add_2sext_sub_2(21; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[Y:%.*]] to i6422; CHECK-NEXT: [[TMP2:%.*]] = sext i32 [[Z:%.*]] to i6423; CHECK-NEXT: [[SUB:%.*]] = sub nsw i64 [[TMP1]], [[TMP2]]24; CHECK-NEXT: ret i64 [[SUB]]25;26 %add1 = add nsw i32 %x, %y27 %add2 = add nsw i32 %z, %x28 %sext1 = sext i32 %add1 to i6429 %sext2 = sext i32 %add2 to i6430 %sub = sub i64 %sext1, %sext231 ret i64 %sub32}33 34define i64 @src_2add_2sext_sub_3(i32 %x, i32 %y, i32 %z) {35; CHECK-LABEL: @src_2add_2sext_sub_3(36; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[Y:%.*]] to i6437; CHECK-NEXT: [[TMP2:%.*]] = sext i32 [[Z:%.*]] to i6438; CHECK-NEXT: [[SUB:%.*]] = sub nsw i64 [[TMP1]], [[TMP2]]39; CHECK-NEXT: ret i64 [[SUB]]40;41 %add1 = add nsw i32 %y, %x42 %add2 = add nsw i32 %z, %x43 %sext1 = sext i32 %add1 to i6444 %sext2 = sext i32 %add2 to i6445 %sub = sub i64 %sext1, %sext246 ret i64 %sub47}48 49define i64 @src_2add_2sext_sub_4(i32 %x, i32 %y, i32 %z) {50; CHECK-LABEL: @src_2add_2sext_sub_4(51; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[Y:%.*]] to i6452; CHECK-NEXT: [[TMP2:%.*]] = sext i32 [[Z:%.*]] to i6453; CHECK-NEXT: [[SUB:%.*]] = sub nsw i64 [[TMP1]], [[TMP2]]54; CHECK-NEXT: ret i64 [[SUB]]55;56 %add1 = add nsw i32 %y, %x57 %add2 = add nsw i32 %x, %z58 %sext1 = sext i32 %add1 to i6459 %sext2 = sext i32 %add2 to i6460 %sub = sub i64 %sext1, %sext261 ret i64 %sub62}63 64define i64 @src_2add_2sextlike_sub(i32 %x, i32 %y, i32 %z) {65; CHECK-LABEL: @src_2add_2sextlike_sub(66; CHECK-NEXT: [[SEXT1:%.*]] = sext i32 [[Y:%.*]] to i6467; CHECK-NEXT: [[SEXT2:%.*]] = sext i32 [[Z:%.*]] to i6468; CHECK-NEXT: [[SUB:%.*]] = sub nsw i64 [[SEXT1]], [[SEXT2]]69; CHECK-NEXT: ret i64 [[SUB]]70;71 %add1 = add nsw i32 %x, %y72 %add2 = add nsw i32 %x, %z73 %sext1 = zext nneg i32 %add1 to i6474 %sext2 = zext nneg i32 %add2 to i6475 %sub = sub i64 %sext1, %sext276 ret i64 %sub77}78 79define i64 @src_2add_2sext_sub_nsw(i32 %x, i32 %y, i32 %z) {80; CHECK-LABEL: @src_2add_2sext_sub_nsw(81; CHECK-NEXT: [[SEXT1:%.*]] = sext i32 [[Y:%.*]] to i6482; CHECK-NEXT: [[SEXT2:%.*]] = sext i32 [[Z:%.*]] to i6483; CHECK-NEXT: [[SUB:%.*]] = sub nsw i64 [[SEXT1]], [[SEXT2]]84; CHECK-NEXT: ret i64 [[SUB]]85;86 %add1 = add nsw i32 %x, %y87 %add2 = add nsw i32 %x, %z88 %sext1 = sext i32 %add1 to i6489 %sext2 = sext i32 %add2 to i6490 %sub = sub nsw i64 %sext1, %sext291 ret i64 %sub92}93 94define i64 @src_2add_2sext_sub_nuw(i32 %x, i32 %y, i32 %z) {95; CHECK-LABEL: @src_2add_2sext_sub_nuw(96; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[Y:%.*]] to i6497; CHECK-NEXT: [[TMP2:%.*]] = sext i32 [[Z:%.*]] to i6498; CHECK-NEXT: [[SUB:%.*]] = sub nsw i64 [[TMP1]], [[TMP2]]99; CHECK-NEXT: ret i64 [[SUB]]100;101 %add1 = add nsw i32 %x, %y102 %add2 = add nsw i32 %x, %z103 %sext1 = sext i32 %add1 to i64104 %sext2 = sext i32 %add2 to i64105 %sub = sub nuw i64 %sext1, %sext2106 ret i64 %sub107}108 109declare void @use_i32(i32, i32)110declare void @use_i64(i64, i64)111 112define i64 @src_2add_2sext_sub_multiple_uses_1(i32 %x, i32 %y, i32 %z) {113; CHECK-LABEL: @src_2add_2sext_sub_multiple_uses_1(114; CHECK-NEXT: [[ADD1:%.*]] = add nsw i32 [[X:%.*]], [[Y:%.*]]115; CHECK-NEXT: [[SEXT1:%.*]] = sext i32 [[ADD1]] to i64116; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[Y]] to i64117; CHECK-NEXT: [[TMP2:%.*]] = sext i32 [[Z:%.*]] to i64118; CHECK-NEXT: [[SUB:%.*]] = sub nsw i64 [[TMP1]], [[TMP2]]119; CHECK-NEXT: call void @use_i64(i64 [[SEXT1]], i64 [[SEXT1]])120; CHECK-NEXT: ret i64 [[SUB]]121;122 %add1 = add nsw i32 %x, %y123 %add2 = add nsw i32 %x, %z124 %sext1 = sext i32 %add1 to i64125 %sext2 = sext i32 %add2 to i64126 %sub = sub i64 %sext1, %sext2127 call void @use_i64(i64 %sext1, i64 %sext1)128 ret i64 %sub129}130 131define i64 @src_2add_2sext_sub_multiple_uses_2(i32 %x, i32 %y, i32 %z) {132; CHECK-LABEL: @src_2add_2sext_sub_multiple_uses_2(133; CHECK-NEXT: [[ADD2:%.*]] = add nsw i32 [[X:%.*]], [[Z:%.*]]134; CHECK-NEXT: [[SEXT2:%.*]] = sext i32 [[ADD2]] to i64135; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[Y:%.*]] to i64136; CHECK-NEXT: [[TMP2:%.*]] = sext i32 [[Z]] to i64137; CHECK-NEXT: [[SUB:%.*]] = sub nsw i64 [[TMP1]], [[TMP2]]138; CHECK-NEXT: call void @use_i64(i64 [[SEXT2]], i64 [[SEXT2]])139; CHECK-NEXT: ret i64 [[SUB]]140;141 %add1 = add nsw i32 %x, %y142 %add2 = add nsw i32 %x, %z143 %sext1 = sext i32 %add1 to i64144 %sext2 = sext i32 %add2 to i64145 %sub = sub i64 %sext1, %sext2146 call void @use_i64(i64 %sext2, i64 %sext2)147 ret i64 %sub148}149 150define i64 @src_2add_2sext_sub_multiple_uses_3(i32 %x, i32 %y, i32 %z) {151; CHECK-LABEL: @src_2add_2sext_sub_multiple_uses_3(152; CHECK-NEXT: [[ADD1:%.*]] = add nsw i32 [[X:%.*]], [[Y:%.*]]153; CHECK-NEXT: [[ADD2:%.*]] = add nsw i32 [[X]], [[Z:%.*]]154; CHECK-NEXT: [[SEXT1:%.*]] = sext i32 [[ADD1]] to i64155; CHECK-NEXT: [[SEXT2:%.*]] = sext i32 [[ADD2]] to i64156; CHECK-NEXT: [[SUB:%.*]] = sub nsw i64 [[SEXT1]], [[SEXT2]]157; CHECK-NEXT: call void @use_i64(i64 [[SEXT1]], i64 [[SEXT2]])158; CHECK-NEXT: ret i64 [[SUB]]159;160 %add1 = add nsw i32 %x, %y161 %add2 = add nsw i32 %x, %z162 %sext1 = sext i32 %add1 to i64163 %sext2 = sext i32 %add2 to i64164 %sub = sub i64 %sext1, %sext2165 call void @use_i64(i64 %sext1, i64 %sext2)166 ret i64 %sub167}168 169define i64 @src_2add_2sext_sub_multiple_uses_4(i32 %x, i32 %y, i32 %z) {170; CHECK-LABEL: @src_2add_2sext_sub_multiple_uses_4(171; CHECK-NEXT: [[ADD1:%.*]] = add nsw i32 [[X:%.*]], [[Y:%.*]]172; CHECK-NEXT: [[ADD2:%.*]] = add nsw i32 [[X]], [[Z:%.*]]173; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[Y]] to i64174; CHECK-NEXT: [[TMP2:%.*]] = sext i32 [[Z]] to i64175; CHECK-NEXT: [[SUB:%.*]] = sub nsw i64 [[TMP1]], [[TMP2]]176; CHECK-NEXT: call void @use_i32(i32 [[ADD1]], i32 [[ADD2]])177; CHECK-NEXT: ret i64 [[SUB]]178;179 %add1 = add nsw i32 %x, %y180 %add2 = add nsw i32 %x, %z181 %sext1 = sext i32 %add1 to i64182 %sext2 = sext i32 %add2 to i64183 %sub = sub i64 %sext1, %sext2184 call void @use_i32(i32 %add1, i32 %add2)185 ret i64 %sub186}187 188define i64 @src_2add_2sext_sub_multiple_uses_5(i32 %x, i32 %y, i32 %z) {189; CHECK-LABEL: @src_2add_2sext_sub_multiple_uses_5(190; CHECK-NEXT: [[ADD1:%.*]] = add nsw i32 [[X:%.*]], [[Y:%.*]]191; CHECK-NEXT: [[SEXT1:%.*]] = sext i32 [[ADD1]] to i64192; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[Y]] to i64193; CHECK-NEXT: [[TMP2:%.*]] = sext i32 [[Z:%.*]] to i64194; CHECK-NEXT: [[SUB:%.*]] = sub nsw i64 [[TMP1]], [[TMP2]]195; CHECK-NEXT: call void @use_i32(i32 [[ADD1]], i32 [[ADD1]])196; CHECK-NEXT: call void @use_i64(i64 [[SEXT1]], i64 [[SEXT1]])197; CHECK-NEXT: ret i64 [[SUB]]198;199 %add1 = add nsw i32 %x, %y200 %add2 = add nsw i32 %x, %z201 %sext1 = sext i32 %add1 to i64202 %sext2 = sext i32 %add2 to i64203 %sub = sub i64 %sext1, %sext2204 call void @use_i32(i32 %add1, i32 %add1)205 call void @use_i64(i64 %sext1, i64 %sext1)206 ret i64 %sub207}208 209define i64 @src_2add_2sext_sub_multiple_uses_6(i32 %x, i32 %y, i32 %z) {210; CHECK-LABEL: @src_2add_2sext_sub_multiple_uses_6(211; CHECK-NEXT: [[ADD2:%.*]] = add nsw i32 [[X:%.*]], [[Z:%.*]]212; CHECK-NEXT: [[SEXT2:%.*]] = sext i32 [[ADD2]] to i64213; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[Y:%.*]] to i64214; CHECK-NEXT: [[TMP2:%.*]] = sext i32 [[Z]] to i64215; CHECK-NEXT: [[SUB:%.*]] = sub nsw i64 [[TMP1]], [[TMP2]]216; CHECK-NEXT: call void @use_i32(i32 [[ADD2]], i32 [[ADD2]])217; CHECK-NEXT: call void @use_i64(i64 [[SEXT2]], i64 [[SEXT2]])218; CHECK-NEXT: ret i64 [[SUB]]219;220 %add1 = add nsw i32 %x, %y221 %add2 = add nsw i32 %x, %z222 %sext1 = sext i32 %add1 to i64223 %sext2 = sext i32 %add2 to i64224 %sub = sub i64 %sext1, %sext2225 call void @use_i32(i32 %add2, i32 %add2)226 call void @use_i64(i64 %sext2, i64 %sext2)227 ret i64 %sub228}229 230define i64 @src_2add_2sext_sub_multiple_uses_7(i32 %x, i32 %y, i32 %z) {231; CHECK-LABEL: @src_2add_2sext_sub_multiple_uses_7(232; CHECK-NEXT: [[ADD1:%.*]] = add nsw i32 [[X:%.*]], [[Y:%.*]]233; CHECK-NEXT: [[ADD2:%.*]] = add nsw i32 [[X]], [[Z:%.*]]234; CHECK-NEXT: [[SEXT1:%.*]] = sext i32 [[ADD1]] to i64235; CHECK-NEXT: [[SEXT2:%.*]] = sext i32 [[ADD2]] to i64236; CHECK-NEXT: [[SUB:%.*]] = sub nsw i64 [[SEXT1]], [[SEXT2]]237; CHECK-NEXT: call void @use_i32(i32 [[ADD1]], i32 [[ADD2]])238; CHECK-NEXT: call void @use_i64(i64 [[SEXT1]], i64 [[SEXT2]])239; CHECK-NEXT: ret i64 [[SUB]]240;241 %add1 = add nsw i32 %x, %y242 %add2 = add nsw i32 %x, %z243 %sext1 = sext i32 %add1 to i64244 %sext2 = sext i32 %add2 to i64245 %sub = sub i64 %sext1, %sext2246 call void @use_i32(i32 %add1, i32 %add2)247 call void @use_i64(i64 %sext1, i64 %sext2)248 ret i64 %sub249}250 251define i64 @src_2add_2sext_sub_multiple_uses_8(i32 %x, i32 %y) {252; CHECK-LABEL: @src_2add_2sext_sub_multiple_uses_8(253; CHECK-NEXT: [[ADD1:%.*]] = add nsw i32 [[X:%.*]], [[Y:%.*]]254; CHECK-NEXT: [[ADD2:%.*]] = add nsw i32 [[X]], 1255; CHECK-NEXT: [[SEXT1:%.*]] = sext i32 [[ADD1]] to i64256; CHECK-NEXT: [[SEXT2:%.*]] = sext i32 [[ADD2]] to i64257; CHECK-NEXT: [[SUB:%.*]] = sub nsw i64 [[SEXT1]], [[SEXT2]]258; CHECK-NEXT: call void @use_i32(i32 [[ADD1]], i32 [[ADD2]])259; CHECK-NEXT: call void @use_i64(i64 [[SEXT1]], i64 [[SEXT2]])260; CHECK-NEXT: ret i64 [[SUB]]261;262 %add1 = add nsw i32 %x, %y263 %add2 = add nsw i32 %x, 1264 %sext1 = sext i32 %add1 to i64265 %sext2 = sext i32 %add2 to i64266 %sub = sub i64 %sext1, %sext2267 call void @use_i32(i32 %add1, i32 %add2)268 call void @use_i64(i64 %sext1, i64 %sext2)269 ret i64 %sub270}271 272define i64 @src_2add_2sext_sub_multiple_uses_9(i32 %x) {273; CHECK-LABEL: @src_2add_2sext_sub_multiple_uses_9(274; CHECK-NEXT: [[ADD1:%.*]] = add nsw i32 [[X:%.*]], 2275; CHECK-NEXT: [[ADD2:%.*]] = add nsw i32 [[X]], 1276; CHECK-NEXT: [[SEXT1:%.*]] = sext i32 [[ADD1]] to i64277; CHECK-NEXT: [[SEXT2:%.*]] = sext i32 [[ADD2]] to i64278; CHECK-NEXT: call void @use_i32(i32 [[ADD1]], i32 [[ADD2]])279; CHECK-NEXT: call void @use_i64(i64 [[SEXT1]], i64 [[SEXT2]])280; CHECK-NEXT: ret i64 1281;282 %add1 = add nsw i32 %x, 2283 %add2 = add nsw i32 %x, 1284 %sext1 = sext i32 %add1 to i64285 %sext2 = sext i32 %add2 to i64286 %sub = sub i64 %sext1, %sext2287 call void @use_i32(i32 %add1, i32 %add2)288 call void @use_i64(i64 %sext1, i64 %sext2)289 ret i64 %sub290}291 292define i64 @src_x_add_2sext_sub_1(i32 %x, i32 %y) {293; CHECK-LABEL: @src_x_add_2sext_sub_1(294; CHECK-NEXT: [[SUB:%.*]] = sext i32 [[Y:%.*]] to i64295; CHECK-NEXT: ret i64 [[SUB]]296;297 %add1 = add nsw i32 %x, %y298 %sext1 = sext i32 %add1 to i64299 %sext2 = sext i32 %x to i64300 %sub = sub i64 %sext1, %sext2301 ret i64 %sub302}303 304define i64 @src_x_add_2sext_sub_2(i32 %x, i32 %y) {305; CHECK-LABEL: @src_x_add_2sext_sub_2(306; CHECK-NEXT: [[SUB:%.*]] = sext i32 [[Y:%.*]] to i64307; CHECK-NEXT: ret i64 [[SUB]]308;309 %add1 = add nsw i32 %y, %x310 %sext1 = sext i32 %add1 to i64311 %sext2 = sext i32 %x to i64312 %sub = sub i64 %sext1, %sext2313 ret i64 %sub314}315 316define i64 @src_x_add_2sextlike_sub(i32 %x, i32 %y) {317; CHECK-LABEL: @src_x_add_2sextlike_sub(318; CHECK-NEXT: [[SUB:%.*]] = sext i32 [[Y:%.*]] to i64319; CHECK-NEXT: ret i64 [[SUB]]320;321 %add1 = add nsw i32 %x, %y322 %sext1 = zext nneg i32 %add1 to i64323 %sext2 = zext nneg i32 %x to i64324 %sub = sub i64 %sext1, %sext2325 ret i64 %sub326}327 328define i64 @src_x_add_2sext_sub_nsw(i32 %x, i32 %y) {329; CHECK-LABEL: @src_x_add_2sext_sub_nsw(330; CHECK-NEXT: [[SUB:%.*]] = sext i32 [[Y:%.*]] to i64331; CHECK-NEXT: ret i64 [[SUB]]332;333 %add1 = add nsw i32 %x, %y334 %sext1 = sext i32 %add1 to i64335 %sext2 = sext i32 %x to i64336 %sub = sub nsw i64 %sext1, %sext2337 ret i64 %sub338}339 340define i64 @src_x_add_2sext_sub_nuw(i32 %x, i32 %y) {341; CHECK-LABEL: @src_x_add_2sext_sub_nuw(342; CHECK-NEXT: [[SUB:%.*]] = sext i32 [[Y:%.*]] to i64343; CHECK-NEXT: ret i64 [[SUB]]344;345 %add1 = add nsw i32 %x, %y346 %sext1 = sext i32 %add1 to i64347 %sext2 = sext i32 %x to i64348 %sub = sub nuw i64 %sext1, %sext2349 ret i64 %sub350}351