329 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: [[LEN_POS:%.*]] = icmp sge i8 [[LEN:%.*]], 08; CHECK-NEXT: [[IDX_ULT_LEN:%.*]] = icmp ult i8 [[IDX:%.*]], [[LEN]]9; CHECK-NEXT: [[AND_1:%.*]] = and i1 [[LEN_POS]], [[IDX_ULT_LEN]]10; CHECK-NEXT: br i1 [[AND_1]], label [[THEN_1:%.*]], label [[ELSE:%.*]]11; CHECK: then.1:12; CHECK-NEXT: [[R_1:%.*]] = xor i1 true, true13; CHECK-NEXT: [[C_1:%.*]] = icmp sge i8 [[IDX]], 114; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[C_1]]15; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], true16; 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 sge i8 %len, 023 %idx.ult.len = icmp 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 ult i8 %idx, %len29 %t.2 = icmp sge 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 ult i8 [[IDX:%.*]], [[LEN:%.*]]49; CHECK-NEXT: [[LEN_POS:%.*]] = icmp sge i8 [[LEN]], 050; CHECK-NEXT: [[AND_1:%.*]] = and i1 [[IDX_ULT_LEN]], [[LEN_POS]]51; CHECK-NEXT: br i1 [[AND_1]], label [[THEN_1:%.*]], label [[ELSE:%.*]]52; CHECK: then.1:53; CHECK-NEXT: [[R_1:%.*]] = xor i1 true, true54; CHECK-NEXT: [[C_1:%.*]] = icmp sge i8 [[IDX]], 155; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[C_1]]56; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], true57; 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 ult i8 %idx, %len64 %len.pos = icmp sge i8 %len, 065 %and.1 = and i1 %idx.ult.len, %len.pos66 br i1 %and.1, label %then.1, label %else67 68then.1:69 %t.1 = icmp ult i8 %idx, %len70 %t.2 = icmp sge 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 86; %len >=u 0 is not enough to determine idx >=s 0.87define i1 @idx_not_known_positive_via_len_uge(i8 %len, i8 %idx) {88; CHECK-LABEL: @idx_not_known_positive_via_len_uge(89; CHECK-NEXT: entry:90; CHECK-NEXT: [[IDX_ULT_LEN:%.*]] = icmp ult i8 [[IDX:%.*]], [[LEN:%.*]]91; CHECK-NEXT: [[AND_1:%.*]] = and i1 true, [[IDX_ULT_LEN]]92; CHECK-NEXT: br i1 [[AND_1]], label [[THEN_1:%.*]], label [[ELSE:%.*]]93; CHECK: then.1:94; CHECK-NEXT: [[C_2:%.*]] = icmp sge i8 [[IDX]], 095; CHECK-NEXT: [[R_1:%.*]] = xor i1 true, [[C_2]]96; CHECK-NEXT: [[C_3:%.*]] = icmp sge i8 [[IDX]], 197; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[C_3]]98; CHECK-NEXT: [[C_4:%.*]] = icmp sge i8 [[LEN]], 199; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], [[C_4]]100; CHECK-NEXT: ret i1 [[R_3]]101; CHECK: else:102; CHECK-NEXT: [[C_5:%.*]] = icmp sge i8 [[IDX]], 0103; CHECK-NEXT: ret i1 [[C_5]]104;105entry:106 %len.pos = icmp uge i8 %len, 0107 %idx.ult.len = icmp ult i8 %idx, %len108 %and.1 = and i1 %len.pos, %idx.ult.len109 br i1 %and.1, label %then.1, label %else110 111then.1:112 %c.1 = icmp ult i8 %idx, %len113 %c.2 = icmp sge i8 %idx, 0114 %r.1 = xor i1 %c.1, %c.2115 116 %c.3 = icmp sge i8 %idx, 1117 %r.2 = xor i1 %r.1, %c.3118 119 %c.4 = icmp sge i8 %len, 1120 %r.3 = xor i1 %r.2, %c.4121 ret i1 %r.3122 123else:124 %c.5 = icmp sge i8 %idx, 0125 ret i1 %c.5126}127 128; There's no information about %len which could be used to determine %len >=s 0.129define i1 @idx_not_known_positive_via_len(i8 %len, i8 %idx) {130; CHECK-LABEL: @idx_not_known_positive_via_len(131; CHECK-NEXT: entry:132; CHECK-NEXT: [[IDX_ULT_LEN:%.*]] = icmp ult i8 [[IDX:%.*]], [[LEN:%.*]]133; CHECK-NEXT: br i1 [[IDX_ULT_LEN]], label [[THEN_1:%.*]], label [[ELSE:%.*]]134; CHECK: then.1:135; CHECK-NEXT: [[C_2:%.*]] = icmp sge i8 [[IDX]], 0136; CHECK-NEXT: [[R_1:%.*]] = xor i1 true, [[C_2]]137; CHECK-NEXT: [[C_3:%.*]] = icmp sge i8 [[IDX]], 1138; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[C_3]]139; CHECK-NEXT: [[C_4:%.*]] = icmp sge i8 [[LEN]], 1140; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], [[C_4]]141; CHECK-NEXT: ret i1 [[R_3]]142; CHECK: else:143; CHECK-NEXT: [[C_5:%.*]] = icmp sge i8 [[IDX]], 0144; CHECK-NEXT: ret i1 [[C_5]]145;146entry:147 %idx.ult.len = icmp ult i8 %idx, %len148 br i1 %idx.ult.len, label %then.1, label %else149 150then.1:151 %c.1 = icmp ult i8 %idx, %len152 %c.2 = icmp sge i8 %idx, 0153 %r.1 = xor i1 %c.1, %c.2154 155 %c.3 = icmp sge i8 %idx, 1156 %r.2 = xor i1 %r.1, %c.3157 158 %c.4 = icmp sge i8 %len, 1159 %r.3 = xor i1 %r.2, %c.4160 ret i1 %r.3161 162else:163 %c.5 = icmp sge i8 %idx, 0164 ret i1 %c.5165}166 167define i1 @ult_signed_pos_constant(i8 %a) {168; CHECK-LABEL: @ult_signed_pos_constant(169; CHECK-NEXT: [[A_ULT_4:%.*]] = icmp ult i8 [[A:%.*]], 4170; CHECK-NEXT: br i1 [[A_ULT_4]], label [[THEN:%.*]], label [[ELSE:%.*]]171; CHECK: then:172; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, true173; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], true174; CHECK-NEXT: ret i1 [[RES_2]]175; CHECK: else:176; CHECK-NEXT: [[C_2:%.*]] = icmp sge i8 [[A]], 0177; CHECK-NEXT: [[C_3:%.*]] = icmp slt i8 [[A]], 4178; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[C_2]], [[C_3]]179; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[A]], 5180; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_4]]181; CHECK-NEXT: ret i1 [[RES_4]]182;183 %a.ult.4 = icmp ult i8 %a, 4184 br i1 %a.ult.4, label %then, label %else185 186then:187 %t.0 = icmp sge i8 %a, 0188 %t.1 = icmp slt i8 %a, 4189 %res.1 = xor i1 %t.0, %t.1190 191 %c.0 = icmp slt i8 %a, 5192 %res.2 = xor i1 %res.1, %c.0193 ret i1 %res.2194 195else:196 %c.2 = icmp sge i8 %a, 0197 %c.3 = icmp slt i8 %a, 4198 %res.3 = xor i1 %c.2, %c.3199 200 %c.4 = icmp slt i8 %a, 5201 %res.4 = xor i1 %res.3, %c.4202 203 ret i1 %res.4204}205 206define i1 @ult_signed_neg_constant(i8 %a) {207; CHECK-LABEL: @ult_signed_neg_constant(208; CHECK-NEXT: [[A_ULT_4:%.*]] = icmp ult i8 [[A:%.*]], -2209; CHECK-NEXT: br i1 [[A_ULT_4]], label [[THEN:%.*]], label [[ELSE:%.*]]210; CHECK: then:211; CHECK-NEXT: [[C_0:%.*]] = icmp sge i8 [[A]], 0212; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[A]], -2213; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[C_0]], [[C_1]]214; CHECK-NEXT: ret i1 [[RES_1]]215; CHECK: else:216; CHECK-NEXT: ret i1 false217;218 %a.ult.4 = icmp ult i8 %a, -2219 br i1 %a.ult.4, label %then, label %else220 221then:222 %c.0 = icmp sge i8 %a, 0223 %c.1 = icmp slt i8 %a, -2224 %res.1 = xor i1 %c.0, %c.1225 ret i1 %res.1226 227else:228 ret i1 0229}230 231define i1 @ule_signed_pos_constant_1(i8 %a, i8 %b) {232; CHECK-LABEL: @ule_signed_pos_constant_1(233; CHECK-NEXT: [[B_NON_NEG:%.*]] = icmp sge i8 [[B:%.*]], 0234; CHECK-NEXT: call void @llvm.assume(i1 [[B_NON_NEG]])235; CHECK-NEXT: [[A_ULE_B:%.*]] = icmp ule i8 [[A:%.*]], [[B]]236; CHECK-NEXT: call void @llvm.assume(i1 [[A_ULE_B]])237; CHECK-NEXT: [[SLT_TEST:%.*]] = icmp slt i8 [[A]], [[B]]238; CHECK-NEXT: [[RESULT_XOR:%.*]] = xor i1 true, [[SLT_TEST]]239; CHECK-NEXT: ret i1 [[RESULT_XOR]]240;241 %b_non_neg = icmp sge i8 %b, 0242 call void @llvm.assume(i1 %b_non_neg)243 %a_ule_b = icmp ule i8 %a, %b244 call void @llvm.assume(i1 %a_ule_b)245 246 %sle_test = icmp sle i8 %a, %b247 %slt_test = icmp slt i8 %a, %b248 %result_xor = xor i1 %sle_test, %slt_test249 250 ret i1 %result_xor251}252 253define i1 @ule_signed_pos_constant_2(i8 %a) {254; CHECK-LABEL: @ule_signed_pos_constant_2(255; CHECK-NEXT: [[A_ULT_4:%.*]] = icmp ule i8 [[A:%.*]], 4256; CHECK-NEXT: br i1 [[A_ULT_4]], label [[THEN:%.*]], label [[ELSE:%.*]]257; CHECK: then:258; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, true259; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], true260; CHECK-NEXT: ret i1 [[RES_2]]261; CHECK: else:262; CHECK-NEXT: [[C_2:%.*]] = icmp sge i8 [[A]], 0263; CHECK-NEXT: [[C_3:%.*]] = icmp sle i8 [[A]], 4264; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[C_2]], [[C_3]]265; CHECK-NEXT: [[C_4:%.*]] = icmp sle i8 [[A]], 5266; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_4]]267; CHECK-NEXT: ret i1 [[RES_4]]268;269 %a.ult.4 = icmp ule i8 %a, 4270 br i1 %a.ult.4, label %then, label %else271 272then:273 %t.0 = icmp sge i8 %a, 0274 %t.1 = icmp sle i8 %a, 4275 %res.1 = xor i1 %t.0, %t.1276 277 %c.0 = icmp sle i8 %a, 5278 %res.2 = xor i1 %res.1, %c.0279 ret i1 %res.2280 281else:282 %c.2 = icmp sge i8 %a, 0283 %c.3 = icmp sle i8 %a, 4284 %res.3 = xor i1 %c.2, %c.3285 286 %c.4 = icmp sle i8 %a, 5287 %res.4 = xor i1 %res.3, %c.4288 289 ret i1 %res.4290}291 292define i1 @uge_assumed_positive_values(i8 %a, i8 %b) {293; CHECK-LABEL: @uge_assumed_positive_values(294; CHECK-NEXT: [[A_NON_NEG:%.*]] = icmp sge i8 [[A:%.*]], 0295; CHECK-NEXT: call void @llvm.assume(i1 [[A_NON_NEG]])296; CHECK-NEXT: [[A_UGT_B:%.*]] = icmp uge i8 [[A]], [[B:%.*]]297; CHECK-NEXT: call void @llvm.assume(i1 [[A_UGT_B]])298; CHECK-NEXT: ret i1 true299;300 %a_non_neg = icmp sge i8 %a, 0301 call void @llvm.assume(i1 %a_non_neg)302 %a_ugt_b = icmp uge i8 %a, %b303 call void @llvm.assume(i1 %a_ugt_b)304 305 %result = icmp sge i8 %a, %b306 307 ret i1 %result308}309 310define i1 @ugt_assumed_positive_values(i8 %a, i8 %b) {311; CHECK-LABEL: @ugt_assumed_positive_values(312; CHECK-NEXT: [[A_NON_NEG:%.*]] = icmp sge i8 [[A:%.*]], 0313; CHECK-NEXT: call void @llvm.assume(i1 [[A_NON_NEG]])314; CHECK-NEXT: [[A_UGT_B:%.*]] = icmp ugt i8 [[A]], [[B:%.*]]315; CHECK-NEXT: call void @llvm.assume(i1 [[A_UGT_B]])316; CHECK-NEXT: ret i1 true317;318 %a_non_neg = icmp sge i8 %a, 0319 call void @llvm.assume(i1 %a_non_neg)320 %a_ugt_b = icmp ugt i8 %a, %b321 call void @llvm.assume(i1 %a_ugt_b)322 323 %result = icmp sgt i8 %a, %b324 325 ret i1 %result326}327 328declare void @llvm.assume(i1)329