367 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s3 4define i1 @idx_known_positive_via_len_1(i8 %len, i8 %idx) {5; CHECK-LABEL: @idx_known_positive_via_len_1(6; CHECK-NEXT: entry:7; CHECK-NEXT: [[IDX_ULT_LEN:%.*]] = icmp samesign ult i8 [[IDX:%.*]], [[LEN:%.*]]8; CHECK-NEXT: [[AND_1:%.*]] = and i1 true, [[IDX_ULT_LEN]]9; CHECK-NEXT: br i1 [[AND_1]], label [[THEN_1:%.*]], label [[ELSE:%.*]]10; CHECK: then.1:11; CHECK-NEXT: [[R_1:%.*]] = xor i1 true, true12; CHECK-NEXT: [[C_1:%.*]] = icmp sge i8 [[IDX]], 113; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[C_1]]14; CHECK-NEXT: [[C_2:%.*]] = icmp sge i8 [[LEN]], 115; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], [[C_2]]16; CHECK-NEXT: ret i1 [[R_3]]17; CHECK: else:18; CHECK-NEXT: [[C_3:%.*]] = icmp sge i8 [[IDX]], 019; CHECK-NEXT: ret i1 [[C_3]]20;21entry:22 %len.pos = icmp samesign uge i8 %len, 023 %idx.ult.len = icmp samesign ult i8 %idx, %len24 %and.1 = and i1 %len.pos, %idx.ult.len25 br i1 %and.1, label %then.1, label %else26 27then.1:28 %t.1 = icmp slt i8 %idx, %len29 %t.2 = icmp samesign uge i8 %idx, 030 %r.1 = xor i1 %t.1, %t.231 32 %c.1 = icmp sge i8 %idx, 133 %r.2 = xor i1 %r.1, %c.134 35 %c.2 = icmp sge i8 %len, 136 %r.3 = xor i1 %r.2, %c.237 ret i1 %r.338 39else:40 %c.3 = icmp sge i8 %idx, 041 ret i1 %c.342}43 44; Like @idx_known_positive_via_len_1, but with a different order of known facts.45define i1 @idx_known_positive_via_len_2(i8 %len, i8 %idx) {46; CHECK-LABEL: @idx_known_positive_via_len_2(47; CHECK-NEXT: entry:48; CHECK-NEXT: [[IDX_ULT_LEN:%.*]] = icmp samesign ult i8 [[IDX:%.*]], [[LEN:%.*]]49; CHECK-NEXT: [[AND_1:%.*]] = and i1 true, [[IDX_ULT_LEN]]50; CHECK-NEXT: br i1 [[AND_1]], label [[THEN_1:%.*]], label [[ELSE:%.*]]51; CHECK: then.1:52; CHECK-NEXT: [[R_1:%.*]] = xor i1 true, true53; CHECK-NEXT: [[C_1:%.*]] = icmp sge i8 [[IDX]], 154; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[C_1]]55; CHECK-NEXT: [[C_2:%.*]] = icmp sge i8 [[LEN]], 156; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], [[C_2]]57; CHECK-NEXT: ret i1 [[R_3]]58; CHECK: else:59; CHECK-NEXT: [[C_3:%.*]] = icmp sge i8 [[IDX]], 060; CHECK-NEXT: ret i1 [[C_3]]61;62entry:63 %idx.ult.len = icmp samesign ult i8 %idx, %len64 %len.pos = icmp samesign uge i8 %len, 065 %and.1 = and i1 %len.pos, %idx.ult.len66 br i1 %and.1, label %then.1, label %else67 68then.1:69 %t.1 = icmp slt i8 %idx, %len70 %t.2 = icmp samesign uge i8 %idx, 071 %r.1 = xor i1 %t.1, %t.272 73 %c.1 = icmp sge i8 %idx, 174 %r.2 = xor i1 %r.1, %c.175 76 %c.2 = icmp sge i8 %len, 177 %r.3 = xor i1 %r.2, %c.278 ret i1 %r.379 80else:81 %c.3 = icmp sge i8 %idx, 082 ret i1 %c.383}84 85 86define i1 @idx_not_known_positive_via_len_uge(i8 %len, i8 %idx) {87; CHECK-LABEL: @idx_not_known_positive_via_len_uge(88; CHECK-NEXT: entry:89; CHECK-NEXT: [[IDX_ULT_LEN:%.*]] = icmp samesign ult i8 [[IDX:%.*]], [[LEN:%.*]]90; CHECK-NEXT: br i1 [[IDX_ULT_LEN]], label [[THEN_1:%.*]], label [[ELSE:%.*]]91; CHECK: then.1:92; CHECK-NEXT: [[C_2:%.*]] = icmp sge i8 [[IDX]], 093; CHECK-NEXT: [[R_1:%.*]] = xor i1 true, [[C_2]]94; CHECK-NEXT: [[C_3:%.*]] = icmp sge i8 [[IDX]], 195; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[C_3]]96; CHECK-NEXT: [[C_4:%.*]] = icmp sge i8 [[LEN]], 197; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], [[C_4]]98; CHECK-NEXT: ret i1 [[R_3]]99; CHECK: else:100; CHECK-NEXT: [[C_5:%.*]] = icmp sge i8 [[IDX]], 0101; CHECK-NEXT: ret i1 [[C_5]]102;103entry:104 %idx.ult.len = icmp samesign ult i8 %idx, %len105 br i1 %idx.ult.len, label %then.1, label %else106 107then.1:108 %c.1 = icmp slt i8 %idx, %len109 %c.2 = icmp sge i8 %idx, 0110 %r.1 = xor i1 %c.1, %c.2111 112 %c.3 = icmp sge i8 %idx, 1113 %r.2 = xor i1 %r.1, %c.3114 115 %c.4 = icmp sge i8 %len, 1116 %r.3 = xor i1 %r.2, %c.4117 ret i1 %r.3118 119else:120 %c.5 = icmp sge i8 %idx, 0121 ret i1 %c.5122}123 124define i1 @idx_not_known_positive_via_len(i8 %len, i8 %idx) {125; CHECK-LABEL: @idx_not_known_positive_via_len(126; CHECK-NEXT: entry:127; CHECK-NEXT: [[IDX_ULT_LEN:%.*]] = icmp samesign ult i8 [[IDX:%.*]], [[LEN:%.*]]128; CHECK-NEXT: br i1 [[IDX_ULT_LEN]], label [[THEN_1:%.*]], label [[ELSE:%.*]]129; CHECK: then.1:130; CHECK-NEXT: [[C_2:%.*]] = icmp sge i8 [[IDX]], 0131; CHECK-NEXT: [[R_1:%.*]] = xor i1 true, [[C_2]]132; CHECK-NEXT: [[C_3:%.*]] = icmp sge i8 [[IDX]], 1133; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[C_3]]134; CHECK-NEXT: [[C_4:%.*]] = icmp sge i8 [[LEN]], 1135; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], [[C_4]]136; CHECK-NEXT: ret i1 [[R_3]]137; CHECK: else:138; CHECK-NEXT: [[C_5:%.*]] = icmp sge i8 [[IDX]], 0139; CHECK-NEXT: ret i1 [[C_5]]140;141entry:142 %idx.ult.len = icmp samesign ult i8 %idx, %len143 br i1 %idx.ult.len, label %then.1, label %else144 145then.1:146 %c.1 = icmp slt i8 %idx, %len147 %c.2 = icmp sge i8 %idx, 0148 %r.1 = xor i1 %c.1, %c.2149 150 %c.3 = icmp sge i8 %idx, 1151 %r.2 = xor i1 %r.1, %c.3152 153 %c.4 = icmp sge i8 %len, 1154 %r.3 = xor i1 %r.2, %c.4155 ret i1 %r.3156 157else:158 %c.5 = icmp sge i8 %idx, 0159 ret i1 %c.5160}161 162define i1 @ult_signed_pos_constant(i8 %a) {163; CHECK-LABEL: @ult_signed_pos_constant(164; CHECK-NEXT: [[A_ULT_4:%.*]] = icmp samesign ult i8 [[A:%.*]], 4165; CHECK-NEXT: br i1 [[A_ULT_4]], label [[THEN:%.*]], label [[ELSE:%.*]]166; CHECK: then:167; CHECK-NEXT: [[RES_1:%.*]] = icmp sge i8 [[A]], 0168; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], true169; CHECK-NEXT: [[RES_5:%.*]] = xor i1 [[RES_2]], true170; CHECK-NEXT: ret i1 [[RES_5]]171; CHECK: else:172; CHECK-NEXT: [[RES_3:%.*]] = xor i1 true, false173; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[A]], 5174; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_4]]175; CHECK-NEXT: ret i1 [[RES_4]]176;177 %a.ult.4 = icmp samesign ult i8 %a, 4178 br i1 %a.ult.4, label %then, label %else179 180then:181 %t.0 = icmp sge i8 %a, 0182 %t.1 = icmp slt i8 %a, 4183 %res.1 = xor i1 %t.0, %t.1184 185 %c.0 = icmp slt i8 %a, 5186 %res.2 = xor i1 %res.1, %c.0187 ret i1 %res.2188 189else:190 %c.2 = icmp sge i8 %a, 0191 %c.3 = icmp slt i8 %a, 4192 %res.3 = xor i1 %c.2, %c.3193 194 %c.4 = icmp slt i8 %a, 5195 %res.4 = xor i1 %res.3, %c.4196 197 ret i1 %res.4198}199 200define i1 @ult_signed_neg_constant(i8 %a) {201; CHECK-LABEL: @ult_signed_neg_constant(202; CHECK-NEXT: [[A_ULT_4:%.*]] = icmp samesign ult i8 [[A:%.*]], -2203; CHECK-NEXT: br i1 [[A_ULT_4]], label [[THEN:%.*]], label [[ELSE:%.*]]204; CHECK: then:205; CHECK-NEXT: [[RES_1:%.*]] = xor i1 false, true206; CHECK-NEXT: ret i1 [[RES_1]]207; CHECK: else:208; CHECK-NEXT: ret i1 false209;210 %a.ult.4 = icmp samesign ult i8 %a, -2211 br i1 %a.ult.4, label %then, label %else212 213then:214 %c.0 = icmp sge i8 %a, 0215 %c.1 = icmp slt i8 %a, -2216 %res.1 = xor i1 %c.0, %c.1217 ret i1 %res.1218 219else:220 ret i1 0221}222 223define i1 @ule_signed_pos_constant_1(i8 %a, i8 %b) {224; CHECK-LABEL: @ule_signed_pos_constant_1(225; CHECK-NEXT: [[A_ULE_B:%.*]] = icmp samesign ule i8 [[A:%.*]], [[B:%.*]]226; CHECK-NEXT: call void @llvm.assume(i1 [[A_ULE_B]])227; CHECK-NEXT: [[SLT_TEST:%.*]] = icmp slt i8 [[A]], [[B]]228; CHECK-NEXT: [[RESULT_XOR:%.*]] = xor i1 true, [[SLT_TEST]]229; CHECK-NEXT: ret i1 [[RESULT_XOR]]230;231 %a_ule_b = icmp samesign ule i8 %a, %b232 call void @llvm.assume(i1 %a_ule_b)233 234 %sle_test = icmp sle i8 %a, %b235 %slt_test = icmp slt i8 %a, %b236 %result_xor = xor i1 %sle_test, %slt_test237 238 ret i1 %result_xor239}240 241define i1 @ule_signed_pos_constant_2(i8 %a) {242; CHECK-LABEL: @ule_signed_pos_constant_2(243; CHECK-NEXT: [[A_ULT_4:%.*]] = icmp samesign ule i8 [[A:%.*]], 4244; CHECK-NEXT: br i1 [[A_ULT_4]], label [[THEN:%.*]], label [[ELSE:%.*]]245; CHECK: then:246; CHECK-NEXT: [[RES_1:%.*]] = icmp sge i8 [[A]], 0247; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], true248; CHECK-NEXT: [[RES_5:%.*]] = xor i1 [[RES_2]], true249; CHECK-NEXT: ret i1 [[RES_5]]250; CHECK: else:251; CHECK-NEXT: [[RES_3:%.*]] = xor i1 true, false252; CHECK-NEXT: [[C_4:%.*]] = icmp sle i8 [[A]], 5253; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_4]]254; CHECK-NEXT: ret i1 [[RES_4]]255;256 %a.ult.4 = icmp samesign ule i8 %a, 4257 br i1 %a.ult.4, label %then, label %else258 259then:260 %t.0 = icmp sge i8 %a, 0261 %t.1 = icmp sle i8 %a, 4262 %res.1 = xor i1 %t.0, %t.1263 264 %c.0 = icmp sle i8 %a, 5265 %res.2 = xor i1 %res.1, %c.0266 ret i1 %res.2267 268else:269 %c.2 = icmp sge i8 %a, 0270 %c.3 = icmp sle i8 %a, 4271 %res.3 = xor i1 %c.2, %c.3272 273 %c.4 = icmp sle i8 %a, 5274 %res.4 = xor i1 %res.3, %c.4275 276 ret i1 %res.4277}278 279define i1 @uge_assumed_positive_values(i8 %a, i8 %b) {280; CHECK-LABEL: @uge_assumed_positive_values(281; CHECK-NEXT: [[A_UGT_B:%.*]] = icmp samesign uge i8 [[A:%.*]], [[B:%.*]]282; CHECK-NEXT: call void @llvm.assume(i1 [[A_UGT_B]])283; CHECK-NEXT: ret i1 true284;285 %a_ugt_b = icmp samesign uge i8 %a, %b286 call void @llvm.assume(i1 %a_ugt_b)287 288 %result = icmp sge i8 %a, %b289 290 ret i1 %result291}292 293define i1 @ugt_assumed_positive_values(i8 %a, i8 %b) {294; CHECK-LABEL: @ugt_assumed_positive_values(295; CHECK-NEXT: [[A_UGT_B:%.*]] = icmp samesign ugt i8 [[A:%.*]], [[B:%.*]]296; CHECK-NEXT: call void @llvm.assume(i1 [[A_UGT_B]])297; CHECK-NEXT: ret i1 true298;299 %a_ugt_b = icmp samesign ugt i8 %a, %b300 call void @llvm.assume(i1 %a_ugt_b)301 302 %result = icmp sgt i8 %a, %b303 304 ret i1 %result305}306 307define i1 @implied_condition_sgt_ugt(i8 %a, i8 %b) {308; CHECK-LABEL: @implied_condition_sgt_ugt(309; CHECK-NEXT: [[CMP_SGT:%.*]] = icmp sgt i8 [[A:%.*]], [[B:%.*]]310; CHECK-NEXT: br i1 [[CMP_SGT]], label [[GREATER:%.*]], label [[EXIT:%.*]]311; CHECK: greater:312; CHECK-NEXT: ret i1 true313; CHECK: exit:314; CHECK-NEXT: ret i1 false315;316 %cmp_sgt = icmp sgt i8 %a, %b317 br i1 %cmp_sgt, label %greater, label %exit318 319greater:320 %cmp_ugt = icmp samesign ugt i8 %a, %b321 ret i1 %cmp_ugt322 323exit:324 ret i1 false325}326 327define i1 @implied_condition_sle_ule(i8 %a) {328; CHECK-LABEL: @implied_condition_sle_ule(329; CHECK-NEXT: [[CMP_SLE:%.*]] = icmp sle i8 [[A:%.*]], 42330; CHECK-NEXT: br i1 [[CMP_SLE]], label [[LESS_OR_EQUAL:%.*]], label [[EXIT:%.*]]331; CHECK: less_or_equal:332; CHECK-NEXT: ret i1 true333; CHECK: exit:334; CHECK-NEXT: ret i1 false335;336 %cmp_sle = icmp sle i8 %a, 42337 br i1 %cmp_sle, label %less_or_equal, label %exit338 339less_or_equal:340 %cmp_ule = icmp samesign ule i8 %a, 42341 ret i1 %cmp_ule342 343exit:344 ret i1 false345}346 347define i1 @implied_condition_cannot_simplify(i8 %a, i8 %b) {348; CHECK-LABEL: @implied_condition_cannot_simplify(349; CHECK-NEXT: [[CMP_SGT:%.*]] = icmp ne i8 [[A:%.*]], [[B:%.*]]350; CHECK-NEXT: br i1 [[CMP_SGT]], label [[GREATER:%.*]], label [[EXIT:%.*]]351; CHECK: not_equal:352; CHECK-NEXT: [[CMP_UGT:%.*]] = icmp samesign ugt i8 [[A]], [[B]]353; CHECK-NEXT: ret i1 [[CMP_UGT]]354; CHECK: exit:355; CHECK-NEXT: ret i1 false356;357 %cmp_ne = icmp ne i8 %a, %b358 br i1 %cmp_ne, label %not_equal, label %exit359 360not_equal:361 %cmp_ugt = icmp samesign ugt i8 %a, %b362 ret i1 %cmp_ugt363 364exit:365 ret i1 false366}367