154 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 %s3declare void @subroutine(i16)4 5define void @test_as_arg(i8 %a, i8 %b) {6; CHECK-LABEL: define void @test_as_arg(7; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {8; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[A]], [[B]]9; CHECK-NEXT: br i1 [[CMP]], label %[[COND_END:.*]], label %[[COND_FALSE:.*]]10; CHECK: [[COND_FALSE]]:11; CHECK-NEXT: [[SUB:%.*]] = sub nsw i8 [[B]], [[A]]12; CHECK-NEXT: [[CONV:%.*]] = zext nneg i8 [[SUB]] to i1613; CHECK-NEXT: call void @subroutine(i16 [[CONV]])14; CHECK-NEXT: br label %[[COND_END]]15; CHECK: [[COND_END]]:16; CHECK-NEXT: ret void17;18 %cmp = icmp sgt i8 %a, %b19 br i1 %cmp, label %cond.end, label %cond.false20 21cond.false:22 %sub = sub nsw i8 %b, %a23 %conv = sext i8 %sub to i1624 call void @subroutine(i16 %conv)25 br label %cond.end26 27cond.end:28 ret void29}30 31define i16 @test_as_retval(i8 %a, i8 %b) {32; CHECK-LABEL: define i16 @test_as_retval(33; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {34; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[A]], [[B]]35; CHECK-NEXT: br i1 [[CMP]], label %[[COND_TRUE:.*]], label %[[COND_FALSE:.*]]36; CHECK: [[COND_TRUE]]:37; CHECK-NEXT: ret i16 038; CHECK: [[COND_FALSE]]:39; CHECK-NEXT: [[SUB:%.*]] = sub nsw i8 [[B]], [[A]]40; CHECK-NEXT: [[CONV:%.*]] = zext nneg i8 [[SUB]] to i1641; CHECK-NEXT: ret i16 [[CONV]]42;43 %cmp = icmp sgt i8 %a, %b44 br i1 %cmp, label %cond.true, label %cond.false45 46cond.true:47 ret i16 048 49cond.false:50 %sub = sub nsw i8 %b, %a51 %conv = sext i8 %sub to i1652 ret i16 %conv53}54 55define void @test_as_arg_wrong_icmp(i8 %a, i8 %b) {56; CHECK-LABEL: define void @test_as_arg_wrong_icmp(57; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {58; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[A]], [[B]]59; CHECK-NEXT: br i1 [[CMP]], label %[[COND_END:.*]], label %[[COND_FALSE:.*]]60; CHECK: [[COND_FALSE]]:61; CHECK-NEXT: [[SUB:%.*]] = sub nsw i8 [[B]], [[A]]62; CHECK-NEXT: [[CONV:%.*]] = sext i8 [[SUB]] to i1663; CHECK-NEXT: call void @subroutine(i16 [[CONV]])64; CHECK-NEXT: br label %[[COND_END]]65; CHECK: [[COND_END]]:66; CHECK-NEXT: ret void67;68 %cmp = icmp slt i8 %a, %b69 br i1 %cmp, label %cond.end, label %cond.false70 71cond.false:72 %sub = sub nsw i8 %b, %a73 %conv = sext i8 %sub to i1674 call void @subroutine(i16 %conv)75 br label %cond.end76 77cond.end:78 ret void79}80 81define void @test_as_arg_missing_nsw(i8 %a, i8 %b) {82; CHECK-LABEL: define void @test_as_arg_missing_nsw(83; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {84; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[A]], [[B]]85; CHECK-NEXT: br i1 [[CMP]], label %[[COND_END:.*]], label %[[COND_FALSE:.*]]86; CHECK: [[COND_FALSE]]:87; CHECK-NEXT: [[SUB:%.*]] = sub i8 [[B]], [[A]]88; CHECK-NEXT: [[CONV:%.*]] = sext i8 [[SUB]] to i1689; CHECK-NEXT: call void @subroutine(i16 [[CONV]])90; CHECK-NEXT: br label %[[COND_END]]91; CHECK: [[COND_END]]:92; CHECK-NEXT: ret void93;94 %cmp = icmp sgt i8 %a, %b95 br i1 %cmp, label %cond.end, label %cond.false96 97cond.false:98 %sub = sub i8 %b, %a99 %conv = sext i8 %sub to i16100 call void @subroutine(i16 %conv)101 br label %cond.end102 103cond.end:104 ret void105}106 107define i16 @test_as_retval_wrong_icmp(i8 %a, i8 %b) {108; CHECK-LABEL: define i16 @test_as_retval_wrong_icmp(109; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {110; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[A]], [[B]]111; CHECK-NEXT: br i1 [[CMP]], label %[[COND_TRUE:.*]], label %[[COND_FALSE:.*]]112; CHECK: [[COND_TRUE]]:113; CHECK-NEXT: ret i16 0114; CHECK: [[COND_FALSE]]:115; CHECK-NEXT: [[SUB:%.*]] = sub nsw i8 [[B]], [[A]]116; CHECK-NEXT: [[CONV:%.*]] = sext i8 [[SUB]] to i16117; CHECK-NEXT: ret i16 [[CONV]]118;119 %cmp = icmp slt i8 %a, %b120 br i1 %cmp, label %cond.true, label %cond.false121 122cond.true:123 ret i16 0124 125cond.false:126 %sub = sub nsw i8 %b, %a127 %conv = sext i8 %sub to i16128 ret i16 %conv129}130 131define i16 @test_as_retval_missing_nsw(i8 %a, i8 %b) {132; CHECK-LABEL: define i16 @test_as_retval_missing_nsw(133; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {134; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[A]], [[B]]135; CHECK-NEXT: br i1 [[CMP]], label %[[COND_TRUE:.*]], label %[[COND_FALSE:.*]]136; CHECK: [[COND_TRUE]]:137; CHECK-NEXT: ret i16 0138; CHECK: [[COND_FALSE]]:139; CHECK-NEXT: [[SUB:%.*]] = sub i8 [[B]], [[A]]140; CHECK-NEXT: [[CONV:%.*]] = sext i8 [[SUB]] to i16141; CHECK-NEXT: ret i16 [[CONV]]142;143 %cmp = icmp sgt i8 %a, %b144 br i1 %cmp, label %cond.true, label %cond.false145 146cond.true:147 ret i16 0148 149cond.false:150 %sub = sub i8 %b, %a151 %conv = sext i8 %sub to i16152 ret i16 %conv153}154