brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.9 KiB · 23953f1 Raw
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