brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.7 KiB · 44565f8 Raw
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