151 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s3 4declare void @llvm.assume(i1)5 6define i1 @sge_0_unsigned_a_ne_0(i8 %a) {7; CHECK-LABEL: @sge_0_unsigned_a_ne_0(8; CHECK-NEXT: [[A_NE_0:%.*]] = icmp ne i8 [[A:%.*]], 09; CHECK-NEXT: call void @llvm.assume(i1 [[A_NE_0]])10; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[A]] to i1611; CHECK-NEXT: ret i1 true12;13 %a.ne.0 = icmp ne i8 %a, 014 call void @llvm.assume(i1 %a.ne.0)15 %ext = zext i8 %a to i1616 %t = icmp sge i16 %ext, 017 ret i1 %t18}19 20define i1 @sgt_0_unsigned_a_ne_0(i8 %a) {21; CHECK-LABEL: @sgt_0_unsigned_a_ne_0(22; CHECK-NEXT: [[A_NE_0:%.*]] = icmp ne i8 [[A:%.*]], 023; CHECK-NEXT: call void @llvm.assume(i1 [[A_NE_0]])24; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[A]] to i1625; CHECK-NEXT: ret i1 true26;27 %a.ne.0 = icmp ne i8 %a, 028 call void @llvm.assume(i1 %a.ne.0)29 %ext = zext i8 %a to i1630 %t = icmp sgt i16 %ext, 031 ret i1 %t32}33 34define i1 @sgt_0_unsigned_a_sgt_0(i8 %a) {35; CHECK-LABEL: @sgt_0_unsigned_a_sgt_0(36; CHECK-NEXT: [[A_SGT_0:%.*]] = icmp sgt i8 [[A:%.*]], 037; CHECK-NEXT: call void @llvm.assume(i1 [[A_SGT_0]])38; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[A]] to i1639; CHECK-NEXT: ret i1 true40;41 %a.sgt.0 = icmp sgt i8 %a, 042 call void @llvm.assume(i1 %a.sgt.0)43 %ext = zext i8 %a to i1644 %t = icmp sgt i16 %ext, 045 ret i1 %t46}47 48define i1 @sge_0_unsigned_a_sge_0(i8 %a) {49; CHECK-LABEL: @sge_0_unsigned_a_sge_0(50; CHECK-NEXT: [[A_SGE_0:%.*]] = icmp sge i8 [[A:%.*]], 051; CHECK-NEXT: call void @llvm.assume(i1 [[A_SGE_0]])52; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[A]] to i1653; CHECK-NEXT: ret i1 true54;55 %a.sge.0 = icmp sge i8 %a, 056 call void @llvm.assume(i1 %a.sge.0)57 %ext = zext i8 %a to i1658 %t = icmp sge i16 %ext, 059 ret i1 %t60}61 62define i1 @sgt_0_unsigned_a_ugt_0(i8 %a) {63; CHECK-LABEL: @sgt_0_unsigned_a_ugt_0(64; CHECK-NEXT: [[A_UGT_0:%.*]] = icmp ugt i8 [[A:%.*]], 065; CHECK-NEXT: call void @llvm.assume(i1 [[A_UGT_0]])66; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[A]] to i1667; CHECK-NEXT: ret i1 true68;69 %a.ugt.0 = icmp ugt i8 %a, 070 call void @llvm.assume(i1 %a.ugt.0)71 %ext = zext i8 %a to i1672 %t = icmp sgt i16 %ext, 073 ret i1 %t74}75 76define i1 @sgt_1_unsigned_a_ne_0(i8 %a) {77; CHECK-LABEL: @sgt_1_unsigned_a_ne_0(78; CHECK-NEXT: [[A_NE_0:%.*]] = icmp ne i8 [[A:%.*]], 079; CHECK-NEXT: call void @llvm.assume(i1 [[A_NE_0]])80; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[A]] to i1681; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i16 [[EXT]], 182; CHECK-NEXT: ret i1 [[CMP]]83;84 %a.ne.0 = icmp ne i8 %a, 085 call void @llvm.assume(i1 %a.ne.0)86 %ext = zext i8 %a to i1687 %cmp = icmp sgt i16 %ext, 188 ret i1 %cmp89}90 91define i1 @sgt_1_unsigned_a_ugt_1(i8 %a) {92; CHECK-LABEL: @sgt_1_unsigned_a_ugt_1(93; CHECK-NEXT: [[A_UGT_1:%.*]] = icmp ugt i8 [[A:%.*]], 194; CHECK-NEXT: call void @llvm.assume(i1 [[A_UGT_1]])95; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[A]] to i1696; CHECK-NEXT: ret i1 true97;98 %a.ugt.1 = icmp ugt i8 %a, 199 call void @llvm.assume(i1 %a.ugt.1)100 %ext = zext i8 %a to i16101 %t = icmp sgt i16 %ext, 1102 ret i1 %t103}104 105define i1 @sge_no_const_unsigned_uge(i8 %a, i16 %b) {106; CHECK-LABEL: @sge_no_const_unsigned_uge(107; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[A:%.*]] to i16108; CHECK-NEXT: [[A_UGE_B:%.*]] = icmp uge i16 [[EXT]], [[B:%.*]]109; CHECK-NEXT: call void @llvm.assume(i1 [[A_UGE_B]])110; CHECK-NEXT: [[B_POS:%.*]] = icmp sge i16 [[B]], 0111; CHECK-NEXT: call void @llvm.assume(i1 [[B_POS]])112; CHECK-NEXT: ret i1 true113;114 %ext = zext i8 %a to i16115 %a.uge.b = icmp uge i16 %ext, %b116 call void @llvm.assume(i1 %a.uge.b)117 118 %b.pos = icmp sge i16 %b, 0119 call void @llvm.assume(i1 %b.pos)120 %cmp = icmp sge i16 %ext, %b121 ret i1 %cmp122}123 124define i1 @sgt_0_unsigned_a_ugt_neg_10(i8 %a) {125; CHECK-LABEL: @sgt_0_unsigned_a_ugt_neg_10(126; CHECK-NEXT: [[A_UGT_0:%.*]] = icmp ugt i8 [[A:%.*]], 10127; CHECK-NEXT: call void @llvm.assume(i1 [[A_UGT_0]])128; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[A]] to i16129; CHECK-NEXT: ret i1 true130;131 %a.ugt.0 = icmp ugt i8 %a, 10132 call void @llvm.assume(i1 %a.ugt.0)133 %ext = zext i8 %a to i16134 %cmp = icmp sgt i16 %ext, 0135 ret i1 %cmp136}137 138define i1 @sge_neg_1_sge_0_known(i8 %a) {139; CHECK-LABEL: @sge_neg_1_sge_0_known(140; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[A:%.*]] to i16141; CHECK-NEXT: [[A_NE_0:%.*]] = icmp sge i16 [[EXT]], 0142; CHECK-NEXT: call void @llvm.assume(i1 [[A_NE_0]])143; CHECK-NEXT: ret i1 true144;145 %ext = zext i8 %a to i16146 %a.ne.0 = icmp sge i16 %ext, 0147 call void @llvm.assume(i1 %a.ne.0)148 %t = icmp sge i16 %ext, -1149 ret i1 %t150}151