112 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4define i1 @test-same-operands-sub-add-nsw-icmp-sgt(i8 %a, i8 %b) {5; CHECK-LABEL: define i1 @test-same-operands-sub-add-nsw-icmp-sgt(6; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {7; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[B]], 08; CHECK-NEXT: ret i1 [[CMP]]9;10 %sub = sub nsw i8 %a, %b11 %add = add nsw i8 %a, %b12 %cmp = icmp sgt i8 %sub, %add13 ret i1 %cmp14}15 16define i1 @test-same-operands-sub-add-nsw-icmp-slt(i8 %a, i8 %b) {17; CHECK-LABEL: define i1 @test-same-operands-sub-add-nsw-icmp-slt(18; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {19; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[B]], 020; CHECK-NEXT: ret i1 [[CMP]]21;22 %sub = sub nsw i8 %a, %b23 %add = add nsw i8 %a, %b24 %cmp = icmp slt i8 %sub, %add25 ret i1 %cmp26}27 28define i1 @test-same-operands-sub-add-nsw-icmp-sle(i8 %a, i8 %b) {29; CHECK-LABEL: define i1 @test-same-operands-sub-add-nsw-icmp-sle(30; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {31; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[B]], -132; CHECK-NEXT: ret i1 [[CMP]]33;34 %sub = sub nsw i8 %a, %b35 %add = add nsw i8 %a, %b36 %cmp = icmp sle i8 %sub, %add37 ret i1 %cmp38}39 40define i1 @test-same-operands-sub-add-nsw-nuw-icmp-eq(i8 %a, i8 %b) {41; CHECK-LABEL: define i1 @test-same-operands-sub-add-nsw-nuw-icmp-eq(42; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {43; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[B]], 044; CHECK-NEXT: ret i1 [[CMP]]45;46 %sub = sub nsw i8 %a, %b47 %add = add nuw i8 %a, %b48 %cmp = icmp eq i8 %sub, %add49 ret i1 %cmp50}51 52define i1 @test-same-operands-sub-add-nsw-icmp-eq(i8 %a, i8 %b) {53; CHECK-LABEL: define i1 @test-same-operands-sub-add-nsw-icmp-eq(54; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {55; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[B]], 056; CHECK-NEXT: ret i1 [[CMP]]57;58 %sub = sub nsw i8 %a, %b59 %add = add nsw i8 %a, %b60 %cmp = icmp eq i8 %sub, %add61 ret i1 %cmp62}63 64define i1 @test-add-sub-nsw-icmp-sgt(i8 %a, i8 %b) {65; CHECK-LABEL: define i1 @test-add-sub-nsw-icmp-sgt(66; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {67; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[B]], 068; CHECK-NEXT: ret i1 [[CMP]]69;70 %sub = sub nsw i8 %a, %b71 %add = add nsw i8 %a, %b72 %cmp = icmp sgt i8 %add, %sub73 ret i1 %cmp74}75 76define i1 @test-add-sub-nuw-icmp-uge(i8 %a, i8 %b) {77; CHECK-LABEL: define i1 @test-add-sub-nuw-icmp-uge(78; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {79; CHECK-NEXT: ret i1 true80;81 %sub = sub nuw i8 %a, %b82 %add = add nuw i8 %a, %b83 %cmp = icmp uge i8 %add, %sub84 ret i1 %cmp85}86 87; Check not folded88define i1 @test-add-sub-nuw-icmp-sge(i8 %a, i8 %b) {89; CHECK-LABEL: define i1 @test-add-sub-nuw-icmp-sge(90; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {91; CHECK-NEXT: [[SUB:%.*]] = sub nuw i8 [[A]], [[B]]92; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[A]], [[B]]93; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[ADD]], [[SUB]]94; CHECK-NEXT: ret i1 [[CMP]]95;96 %sub = sub nuw i8 %a, %b97 %add = add nuw i8 %a, %b98 %cmp = icmp sge i8 %add, %sub99 ret i1 %cmp100}101 102define i1 @test-add-swap-sub-nuw-icmp-uge(i8 %a, i8 %b) {103; CHECK-LABEL: define i1 @test-add-swap-sub-nuw-icmp-uge(104; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {105; CHECK-NEXT: ret i1 true106;107 %sub = sub nuw i8 %a, %b108 %add = add nuw i8 %b, %a109 %cmp = icmp uge i8 %add, %sub110 ret i1 %cmp111}112