208 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4declare void @use.i8(i8)5define i8 @test_add_nsw(i8 %x, i8 %y, i8 %z) {6; CHECK-LABEL: @test_add_nsw(7; CHECK-NEXT: [[LHS:%.*]] = add nsw i8 [[X:%.*]], [[Y:%.*]]8; CHECK-NEXT: [[RHS:%.*]] = add nsw i8 [[X]], [[Z:%.*]]9; CHECK-NEXT: call void @use.i8(i8 [[LHS]])10; CHECK-NEXT: call void @use.i8(i8 [[RHS]])11; CHECK-NEXT: [[R:%.*]] = sub nsw i8 [[Y]], [[Z]]12; CHECK-NEXT: ret i8 [[R]]13;14 %lhs = add nsw i8 %x, %y15 %rhs = add nsw i8 %x, %z16 call void @use.i8(i8 %lhs)17 call void @use.i8(i8 %rhs)18 %r = sub nsw i8 %lhs, %rhs19 ret i8 %r20}21 22define i8 @test_add_nsw_no_prop(i8 %x, i8 %y, i8 %z) {23; CHECK-LABEL: @test_add_nsw_no_prop(24; CHECK-NEXT: [[LHS:%.*]] = add nsw i8 [[X:%.*]], [[Y:%.*]]25; CHECK-NEXT: [[RHS:%.*]] = add nuw i8 [[X]], [[Z:%.*]]26; CHECK-NEXT: call void @use.i8(i8 [[LHS]])27; CHECK-NEXT: call void @use.i8(i8 [[RHS]])28; CHECK-NEXT: [[R:%.*]] = sub i8 [[Y]], [[Z]]29; CHECK-NEXT: ret i8 [[R]]30;31 %lhs = add nsw i8 %x, %y32 %rhs = add nuw i8 %x, %z33 call void @use.i8(i8 %lhs)34 call void @use.i8(i8 %rhs)35 %r = sub nsw i8 %lhs, %rhs36 ret i8 %r37}38 39define i8 @test_add(i8 %x, i8 %y, i8 %z) {40; CHECK-LABEL: @test_add(41; CHECK-NEXT: [[LHS:%.*]] = add i8 [[X:%.*]], [[Y:%.*]]42; CHECK-NEXT: [[RHS:%.*]] = add i8 [[X]], [[Z:%.*]]43; CHECK-NEXT: call void @use.i8(i8 [[LHS]])44; CHECK-NEXT: call void @use.i8(i8 [[RHS]])45; CHECK-NEXT: [[R:%.*]] = sub i8 [[Y]], [[Z]]46; CHECK-NEXT: ret i8 [[R]]47;48 %lhs = add i8 %x, %y49 %rhs = add i8 %x, %z50 call void @use.i8(i8 %lhs)51 call void @use.i8(i8 %rhs)52 %r = sub i8 %lhs, %rhs53 ret i8 %r54}55 56define i8 @test_add_fail(i8 %w, i8 %x, i8 %y, i8 %z) {57; CHECK-LABEL: @test_add_fail(58; CHECK-NEXT: [[LHS:%.*]] = add i8 [[W:%.*]], [[Y:%.*]]59; CHECK-NEXT: [[RHS:%.*]] = add i8 [[X:%.*]], [[Z:%.*]]60; CHECK-NEXT: call void @use.i8(i8 [[LHS]])61; CHECK-NEXT: call void @use.i8(i8 [[RHS]])62; CHECK-NEXT: [[R:%.*]] = sub i8 [[LHS]], [[RHS]]63; CHECK-NEXT: ret i8 [[R]]64;65 %lhs = add i8 %w, %y66 %rhs = add i8 %x, %z67 call void @use.i8(i8 %lhs)68 call void @use.i8(i8 %rhs)69 %r = sub i8 %lhs, %rhs70 ret i8 %r71}72 73define i8 @test_add_nuw(i8 %x, i8 %y, i8 %z) {74; CHECK-LABEL: @test_add_nuw(75; CHECK-NEXT: [[LHS:%.*]] = add i8 [[X:%.*]], [[Y:%.*]]76; CHECK-NEXT: [[RHS:%.*]] = or disjoint i8 [[X]], [[Z:%.*]]77; CHECK-NEXT: call void @use.i8(i8 [[LHS]])78; CHECK-NEXT: call void @use.i8(i8 [[RHS]])79; CHECK-NEXT: [[R:%.*]] = sub nuw i8 [[Y]], [[Z]]80; CHECK-NEXT: ret i8 [[R]]81;82 %lhs = add i8 %x, %y83 %rhs = or disjoint i8 %x, %z84 call void @use.i8(i8 %lhs)85 call void @use.i8(i8 %rhs)86 %r = sub nuw i8 %lhs, %rhs87 ret i8 %r88}89 90define i8 @test_add_nuw_no_prop(i8 %x, i8 %y, i8 %z) {91; CHECK-LABEL: @test_add_nuw_no_prop(92; CHECK-NEXT: [[LHS:%.*]] = add i8 [[X:%.*]], [[Y:%.*]]93; CHECK-NEXT: [[RHS:%.*]] = or disjoint i8 [[X]], [[Z:%.*]]94; CHECK-NEXT: call void @use.i8(i8 [[LHS]])95; CHECK-NEXT: call void @use.i8(i8 [[RHS]])96; CHECK-NEXT: [[R:%.*]] = sub i8 [[Y]], [[Z]]97; CHECK-NEXT: ret i8 [[R]]98;99 %lhs = add i8 %x, %y100 %rhs = or disjoint i8 %x, %z101 call void @use.i8(i8 %lhs)102 call void @use.i8(i8 %rhs)103 %r = sub i8 %lhs, %rhs104 ret i8 %r105}106 107define i8 @test_sub_nuw(i8 %x, i8 %y, i8 %z) {108; CHECK-LABEL: @test_sub_nuw(109; CHECK-NEXT: [[LHS:%.*]] = sub nuw i8 [[X:%.*]], [[Y:%.*]]110; CHECK-NEXT: [[RHS:%.*]] = sub nuw i8 [[Y]], [[Z:%.*]]111; CHECK-NEXT: call void @use.i8(i8 [[LHS]])112; CHECK-NEXT: call void @use.i8(i8 [[RHS]])113; CHECK-NEXT: [[R:%.*]] = sub nuw i8 [[X]], [[Z]]114; CHECK-NEXT: ret i8 [[R]]115;116 %lhs = sub nuw i8 %x, %y117 %rhs = sub nuw i8 %y, %z118 call void @use.i8(i8 %lhs)119 call void @use.i8(i8 %rhs)120 %r = add i8 %lhs, %rhs121 ret i8 %r122}123 124define i8 @test_sub_nuw_no_prop(i8 %x, i8 %y, i8 %z) {125; CHECK-LABEL: @test_sub_nuw_no_prop(126; CHECK-NEXT: [[LHS:%.*]] = sub nuw i8 [[X:%.*]], [[Y:%.*]]127; CHECK-NEXT: [[RHS:%.*]] = sub i8 [[Y]], [[Z:%.*]]128; CHECK-NEXT: call void @use.i8(i8 [[LHS]])129; CHECK-NEXT: call void @use.i8(i8 [[RHS]])130; CHECK-NEXT: [[R:%.*]] = sub i8 [[X]], [[Z]]131; CHECK-NEXT: ret i8 [[R]]132;133 %lhs = sub nuw i8 %x, %y134 %rhs = sub i8 %y, %z135 call void @use.i8(i8 %lhs)136 call void @use.i8(i8 %rhs)137 %r = add nuw i8 %lhs, %rhs138 ret i8 %r139}140 141define i8 @test_sub_nsw(i8 %x, i8 %y, i8 %z) {142; CHECK-LABEL: @test_sub_nsw(143; CHECK-NEXT: [[LHS:%.*]] = sub nsw i8 [[X:%.*]], [[Y:%.*]]144; CHECK-NEXT: [[RHS:%.*]] = sub nsw i8 [[Y]], [[Z:%.*]]145; CHECK-NEXT: call void @use.i8(i8 [[LHS]])146; CHECK-NEXT: call void @use.i8(i8 [[RHS]])147; CHECK-NEXT: [[R:%.*]] = sub nsw i8 [[X]], [[Z]]148; CHECK-NEXT: ret i8 [[R]]149;150 %lhs = sub nsw i8 %x, %y151 %rhs = sub nsw i8 %y, %z152 call void @use.i8(i8 %lhs)153 call void @use.i8(i8 %rhs)154 %r = or disjoint i8 %lhs, %rhs155 ret i8 %r156}157 158define i8 @test_sub_nsw_no_prop(i8 %x, i8 %y, i8 %z) {159; CHECK-LABEL: @test_sub_nsw_no_prop(160; CHECK-NEXT: [[LHS:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]]161; CHECK-NEXT: [[RHS:%.*]] = sub nsw i8 [[Y]], [[Z:%.*]]162; CHECK-NEXT: call void @use.i8(i8 [[LHS]])163; CHECK-NEXT: call void @use.i8(i8 [[RHS]])164; CHECK-NEXT: [[R:%.*]] = sub i8 [[X]], [[Z]]165; CHECK-NEXT: ret i8 [[R]]166;167 %lhs = sub i8 %x, %y168 %rhs = sub nsw i8 %y, %z169 call void @use.i8(i8 %lhs)170 call void @use.i8(i8 %rhs)171 %r = or disjoint i8 %lhs, %rhs172 ret i8 %r173}174 175define i8 @test_sub_none(i8 %x, i8 %y, i8 %z) {176; CHECK-LABEL: @test_sub_none(177; CHECK-NEXT: [[LHS:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]]178; CHECK-NEXT: [[RHS:%.*]] = sub i8 [[Y]], [[Z:%.*]]179; CHECK-NEXT: call void @use.i8(i8 [[LHS]])180; CHECK-NEXT: call void @use.i8(i8 [[RHS]])181; CHECK-NEXT: [[R:%.*]] = sub i8 [[X]], [[Z]]182; CHECK-NEXT: ret i8 [[R]]183;184 %lhs = sub i8 %x, %y185 %rhs = sub i8 %y, %z186 call void @use.i8(i8 %lhs)187 call void @use.i8(i8 %rhs)188 %r = add i8 %lhs, %rhs189 ret i8 %r190}191 192define i8 @test_sub_none_fail(i8 %x, i8 %y, i8 %z) {193; CHECK-LABEL: @test_sub_none_fail(194; CHECK-NEXT: [[LHS:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]]195; CHECK-NEXT: [[RHS:%.*]] = sub i8 [[Z:%.*]], [[Y]]196; CHECK-NEXT: call void @use.i8(i8 [[LHS]])197; CHECK-NEXT: call void @use.i8(i8 [[RHS]])198; CHECK-NEXT: [[R:%.*]] = add i8 [[LHS]], [[RHS]]199; CHECK-NEXT: ret i8 [[R]]200;201 %lhs = sub i8 %x, %y202 %rhs = sub i8 %z, %y203 call void @use.i8(i8 %lhs)204 call void @use.i8(i8 %rhs)205 %r = add i8 %lhs, %rhs206 ret i8 %r207}208