brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.1 KiB · 71e91f9 Raw
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