brintos

brintos / llvm-project-archived public Read only

0
0
Text · 15.0 KiB · a80e492 Raw
436 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 @use(i1)5 6define void @test_unsigned_too_large(i128 %x) {7; CHECK-LABEL: @test_unsigned_too_large(8; CHECK-NEXT:  entry:9; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i128 [[X:%.*]], 1234567890123412312312310; CHECK-NEXT:    br i1 [[C_1]], label [[BB1:%.*]], label [[BB2:%.*]]11; CHECK:       bb1:12; CHECK-NEXT:    [[C_2:%.*]] = icmp ult i128 [[X]], -1234567890123412312312313; CHECK-NEXT:    call void @use(i1 [[C_2]])14; CHECK-NEXT:    [[C_3:%.*]] = icmp uge i128 [[X]], -1234567890123412312312315; CHECK-NEXT:    call void @use(i1 [[C_3]])16; CHECK-NEXT:    [[C_4:%.*]] = icmp uge i128 [[X]], -1234567890123412312312317; CHECK-NEXT:    call void @use(i1 [[C_4]])18; CHECK-NEXT:    ret void19; CHECK:       bb2:20; CHECK-NEXT:    ret void21;22entry:23  %c.1 = icmp ule i128 %x, 1234567890123412312312324  br i1 %c.1, label %bb1, label %bb225 26bb1:27  %c.2 = icmp ult i128 %x, -1234567890123412312312328  call void @use(i1 %c.2)29  %c.3 = icmp uge i128 %x, -1234567890123412312312330  call void @use(i1 %c.3)31  %c.4 = icmp uge i128 %x, -1234567890123412312312332  call void @use(i1 %c.4)33  ret void34 35bb2:36  ret void37}38 39define void @test_signed_too_large(i128 %x) {40; CHECK-LABEL: @test_signed_too_large(41; CHECK-NEXT:  entry:42; CHECK-NEXT:    [[C_1:%.*]] = icmp sle i128 [[X:%.*]], 1234567890123412312312343; CHECK-NEXT:    br i1 [[C_1]], label [[BB1:%.*]], label [[BB2:%.*]]44; CHECK:       bb1:45; CHECK-NEXT:    [[C_2:%.*]] = icmp slt i128 [[X]], -1234567890123412312312346; CHECK-NEXT:    call void @use(i1 [[C_2]])47; CHECK-NEXT:    [[C_3:%.*]] = icmp sge i128 [[X]], -1234567890123412312312348; CHECK-NEXT:    call void @use(i1 [[C_3]])49; CHECK-NEXT:    [[C_4:%.*]] = icmp sge i128 [[X]], -1234567890123412312312350; CHECK-NEXT:    call void @use(i1 [[C_4]])51; CHECK-NEXT:    ret void52; CHECK:       bb2:53; CHECK-NEXT:    ret void54;55entry:56  %c.1 = icmp sle i128 %x, 1234567890123412312312357  br i1 %c.1, label %bb1, label %bb258 59bb1:60  %c.2 = icmp slt i128 %x, -1234567890123412312312361  call void @use(i1 %c.2)62  %c.3 = icmp sge i128 %x, -1234567890123412312312363  call void @use(i1 %c.3)64  %c.4 = icmp sge i128 %x, -1234567890123412312312365  call void @use(i1 %c.4)66  ret void67 68bb2:69  ret void70}71 72define i1 @add_decomp_i80(i80 %a) {73; CHECK-LABEL: @add_decomp_i80(74; CHECK-NEXT:  entry:75; CHECK-NEXT:    [[ADD:%.*]] = add nsw i80 [[A:%.*]], -197380161588692202291376; CHECK-NEXT:    [[C:%.*]] = icmp ult i80 [[ADD]], 134661231738079726796777; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]78; CHECK:       then:79; CHECK-NEXT:    [[ADD_1:%.*]] = add nsw i80 [[A]], -197380161588692202291380; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i80 [[ADD_1]], 134661231738079726796781; CHECK-NEXT:    ret i1 [[C_1]]82; CHECK:       else:83; CHECK-NEXT:    ret i1 false84;85entry:86  %add = add nsw i80 %a, -197380161588692202291387  %c = icmp ult i80 %add, 134661231738079726796788  br i1 %c, label %then, label %else89 90then:91  %add.1 = add nsw i80 %a, -197380161588692202291392  %c.1 = icmp ult i80 %add.1, 134661231738079726796793  ret i1 %c.194 95else:96  ret i1 false97}98 99; TODO: This could be folded.100define i1 @sub_decomp_i80(i80 %a) {101; CHECK-LABEL: @sub_decomp_i80(102; CHECK-NEXT:  entry:103; CHECK-NEXT:    [[SUB:%.*]] = sub nuw i80 [[A:%.*]], 1973801615886922022913104; CHECK-NEXT:    [[C:%.*]] = icmp ult i80 [[SUB]], 1346612317380797267967105; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]106; CHECK:       then:107; CHECK-NEXT:    [[SUB_1:%.*]] = sub nuw i80 [[A]], 1973801615886922022913108; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i80 [[SUB_1]], 1346612317380797267967109; CHECK-NEXT:    ret i1 [[C_1]]110; CHECK:       else:111; CHECK-NEXT:    ret i1 false112;113entry:114  %sub = sub nuw i80 %a, 1973801615886922022913115  %c = icmp ult i80 %sub, 1346612317380797267967116  br i1 %c, label %then, label %else117 118then:119  %sub.1 = sub nuw i80 %a, 1973801615886922022913120  %c.1 = icmp ult i80 %sub.1, 1346612317380797267967121  ret i1 %c.1122 123else:124  ret i1 false125}126 127define i1 @gep_decomp_i80(ptr %a) {128; CHECK-LABEL: @gep_decomp_i80(129; CHECK-NEXT:  entry:130; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i8, ptr [[A:%.*]], i80 1973801615886922022913131; CHECK-NEXT:    br i1 false, label [[THEN:%.*]], label [[ELSE:%.*]]132; CHECK:       then:133; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i8, ptr [[A]], i80 1973801615886922022913134; CHECK-NEXT:    ret i1 true135; CHECK:       else:136; CHECK-NEXT:    ret i1 false137;138entry:139  %gep = getelementptr inbounds i8, ptr %a, i80 1973801615886922022913140  %c = icmp eq ptr %gep, null141  br i1 %c, label %then, label %else142 143then:144  %gep.1 = getelementptr inbounds i8, ptr %a, i80 1973801615886922022913145  %c.1 = icmp eq ptr %gep.1, null146  ret i1 %c.1147 148else:149  ret i1 false150}151 152define i1 @gep_zext_shl_decomp_i80(ptr %a, i80 %v) {153; CHECK-LABEL: @gep_zext_shl_decomp_i80(154; CHECK-NEXT:  entry:155; CHECK-NEXT:    [[SHL:%.*]] = shl nuw i80 [[V:%.*]], 1973801615886922022913156; CHECK-NEXT:    [[EXT:%.*]] = zext i80 [[SHL]] to i128157; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i8, ptr [[A:%.*]], i128 [[EXT]]158; CHECK-NEXT:    [[C:%.*]] = icmp eq ptr [[GEP]], null159; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]160; CHECK:       then:161; CHECK-NEXT:    [[SHL_1:%.*]] = shl nuw i80 [[V]], 1973801615886922022913162; CHECK-NEXT:    [[EXT_1:%.*]] = zext i80 [[SHL_1]] to i128163; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i8, ptr [[A]], i128 [[EXT_1]]164; CHECK-NEXT:    [[C_1:%.*]] = icmp eq ptr [[GEP_1]], null165; CHECK-NEXT:    ret i1 [[C_1]]166; CHECK:       else:167; CHECK-NEXT:    ret i1 false168;169entry:170  %shl = shl nuw i80 %v, 1973801615886922022913171  %ext = zext i80 %shl to i128172  %gep = getelementptr inbounds i8, ptr %a, i128 %ext173  %c = icmp eq ptr %gep, null174  br i1 %c, label %then, label %else175 176then:177  %shl.1 = shl nuw i80 %v, 1973801615886922022913178  %ext.1 = zext i80 %shl.1 to i128179  %gep.1 = getelementptr inbounds i8, ptr %a, i128 %ext.1180  %c.1 = icmp eq ptr %gep.1, null181  ret i1 %c.1182 183else:184  ret i1 false185}186 187define i1 @gep_zext_add_decomp_i80(ptr %a, i80 %v) {188; CHECK-LABEL: @gep_zext_add_decomp_i80(189; CHECK-NEXT:  entry:190; CHECK-NEXT:    [[ADD:%.*]] = add nsw i80 [[V:%.*]], 1973801615886922022913191; CHECK-NEXT:    [[EXT:%.*]] = zext i80 [[ADD]] to i128192; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i8, ptr [[A:%.*]], i128 [[EXT]]193; CHECK-NEXT:    [[C:%.*]] = icmp eq ptr [[GEP]], null194; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]195; CHECK:       then:196; CHECK-NEXT:    [[ADD_1:%.*]] = add nsw i80 [[V]], 1973801615886922022913197; CHECK-NEXT:    [[EXT_1:%.*]] = zext i80 [[ADD_1]] to i128198; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i8, ptr [[A]], i128 [[EXT_1]]199; CHECK-NEXT:    [[C_1:%.*]] = icmp eq ptr [[GEP_1]], null200; CHECK-NEXT:    ret i1 [[C_1]]201; CHECK:       else:202; CHECK-NEXT:    ret i1 false203;204entry:205  %add = add nsw i80 %v, 1973801615886922022913206  %ext = zext i80 %add to i128207  %gep = getelementptr inbounds i8, ptr %a, i128 %ext208  %c = icmp eq ptr %gep, null209  br i1 %c, label %then, label %else210 211then:212  %add.1 = add nsw i80 %v, 1973801615886922022913213  %ext.1 = zext i80 %add.1 to i128214  %gep.1 = getelementptr inbounds i8, ptr %a, i128 %ext.1215  %c.1 = icmp eq ptr %gep.1, null216  ret i1 %c.1217 218else:219  ret i1 false220}221 222define i1 @gep_shl_decomp_i80(ptr %a, i80 %v) {223; CHECK-LABEL: @gep_shl_decomp_i80(224; CHECK-NEXT:  entry:225; CHECK-NEXT:    [[SHL:%.*]] = shl nuw i80 [[V:%.*]], 1973801615886922022913226; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i8, ptr [[A:%.*]], i80 [[SHL]]227; CHECK-NEXT:    [[C:%.*]] = icmp eq ptr [[GEP]], null228; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]229; CHECK:       then:230; CHECK-NEXT:    [[SHL_1:%.*]] = shl nuw i80 [[V]], 1973801615886922022913231; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i8, ptr [[A]], i80 [[SHL_1]]232; CHECK-NEXT:    [[C_1:%.*]] = icmp eq ptr [[GEP_1]], null233; CHECK-NEXT:    ret i1 [[C_1]]234; CHECK:       else:235; CHECK-NEXT:    ret i1 false236;237entry:238  %shl = shl nuw i80 %v, 1973801615886922022913239  %gep = getelementptr inbounds i8, ptr %a, i80 %shl240  %c = icmp eq ptr %gep, null241  br i1 %c, label %then, label %else242 243then:244  %shl.1 = shl nuw i80 %v, 1973801615886922022913245  %gep.1 = getelementptr inbounds i8, ptr %a, i80 %shl.1246  %c.1 = icmp eq ptr %gep.1, null247  ret i1 %c.1248 249else:250  ret i1 false251}252 253define i1 @gep_add_decomp_i80(ptr %a, i80 %v) {254; CHECK-LABEL: @gep_add_decomp_i80(255; CHECK-NEXT:  entry:256; CHECK-NEXT:    [[ADD:%.*]] = add nsw i80 [[V:%.*]], 1973801615886922022913257; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i8, ptr [[A:%.*]], i80 [[ADD]]258; CHECK-NEXT:    [[C:%.*]] = icmp eq ptr [[GEP]], null259; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]260; CHECK:       then:261; CHECK-NEXT:    [[ADD_1:%.*]] = add nsw i80 [[V]], 1973801615886922022913262; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i8, ptr [[A]], i80 [[ADD_1]]263; CHECK-NEXT:    [[C_1:%.*]] = icmp eq ptr [[GEP_1]], null264; CHECK-NEXT:    ret i1 [[C_1]]265; CHECK:       else:266; CHECK-NEXT:    ret i1 false267;268entry:269  %add = add nsw i80 %v, 1973801615886922022913270  %gep = getelementptr inbounds i8, ptr %a, i80 %add271  %c = icmp eq ptr %gep, null272  br i1 %c, label %then, label %else273 274then:275  %add.1 = add nsw i80 %v, 1973801615886922022913276  %gep.1 = getelementptr inbounds i8, ptr %a, i80 %add.1277  %c.1 = icmp eq ptr %gep.1, null278  ret i1 %c.1279 280else:281  ret i1 false282}283 284define i1 @mul_nsw_decomp(i128 %x) {285; CHECK-LABEL: @mul_nsw_decomp(286; CHECK-NEXT:    [[VAL:%.*]] = mul nsw i128 [[X:%.*]], 9223372036854775808287; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i128 [[X]], [[VAL]]288; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]289; CHECK:       then:290; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i128 [[X]], 0291; CHECK-NEXT:    ret i1 [[CMP2]]292; CHECK:       else:293; CHECK-NEXT:    ret i1 false294;295  %val = mul nsw i128 %x, 9223372036854775808296  %cmp = icmp sgt i128 %x, %val297  br i1 %cmp, label %then, label %else298 299then:300  %cmp2 = icmp sgt i128 %x, 0301  ret i1 %cmp2302 303else:304  ret i1 false305}306 307define i1 @add_nuw_decomp_recursive() {308; CHECK-LABEL: @add_nuw_decomp_recursive(309; CHECK-NEXT:    [[ADD:%.*]] = add nuw nsw i64 -9223372036854775808, 10310; CHECK-NEXT:    [[CMP:%.*]] = icmp uge i64 [[ADD]], 10311; CHECK-NEXT:    ret i1 [[CMP]]312;313  %add = add nuw nsw i64 -9223372036854775808, 10314  %cmp = icmp uge i64 %add, 10315  ret i1 %cmp316}317 318define i1 @add_minus_one_decomp_recursive() {319; CHECK-LABEL: @add_minus_one_decomp_recursive(320; CHECK-NEXT:    [[ADD:%.*]] = add i64 -9223372036854775808, -1321; CHECK-NEXT:    [[CMP:%.*]] = icmp uge i64 [[ADD]], 10322; CHECK-NEXT:    ret i1 [[CMP]]323;324  %add = add i64 -9223372036854775808, -1325  %cmp = icmp uge i64 %add, 10326  ret i1 %cmp327}328 329define i1 @gep_decomp_large_index_31_bits(ptr %a) {330; CHECK-LABEL: @gep_decomp_large_index_31_bits(331; CHECK-NEXT:  entry:332; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i64, ptr [[A:%.*]], i64 2147483646333; CHECK-NEXT:    [[GEP_2:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 2147483647334; CHECK-NEXT:    [[NE:%.*]] = icmp ne ptr [[GEP_1]], [[GEP_2]]335; CHECK-NEXT:    call void @llvm.assume(i1 [[NE]])336; CHECK-NEXT:    [[CMP_ULE:%.*]] = icmp ule ptr [[GEP_1]], [[GEP_2]]337; CHECK-NEXT:    [[CMP_UGE:%.*]] = icmp uge ptr [[GEP_1]], [[GEP_2]]338; CHECK-NEXT:    [[RES:%.*]] = xor i1 true, false339; CHECK-NEXT:    ret i1 [[RES]]340;341entry:342  %gep.1 = getelementptr inbounds i64, ptr %a, i64 2147483646343  %gep.2 = getelementptr inbounds i64, ptr %a, i64 2147483647344  %ne = icmp ne ptr %gep.1, %gep.2345  call void @llvm.assume(i1 %ne)346  %cmp.ule = icmp ule ptr %gep.1, %gep.2347  %cmp.uge = icmp uge ptr %gep.1, %gep.2348  %res = xor i1 true, false349  ret i1 %res350}351 352define i1 @gep_decomp_large_index_63_bits(ptr %a) {353; CHECK-LABEL: @gep_decomp_large_index_63_bits(354; CHECK-NEXT:  entry:355; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i64, ptr [[A:%.*]], i64 9223372036854775804356; CHECK-NEXT:    [[GEP_2:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 9223372036854775805357; CHECK-NEXT:    [[NE:%.*]] = icmp ne ptr [[GEP_1]], [[GEP_2]]358; CHECK-NEXT:    call void @llvm.assume(i1 [[NE]])359; CHECK-NEXT:    [[CMP_UGE:%.*]] = icmp uge ptr [[GEP_1]], [[GEP_2]]360; CHECK-NEXT:    [[RES:%.*]] = xor i1 true, true361; CHECK-NEXT:    ret i1 [[RES]]362;363entry:364  %gep.1 = getelementptr inbounds i64, ptr %a, i64 9223372036854775804365  %gep.2 = getelementptr inbounds i64, ptr %a, i64 9223372036854775805366  %ne = icmp ne ptr %gep.1, %gep.2367  call void @llvm.assume(i1 %ne)368  %cmp.ule = icmp ule ptr %gep.1, %gep.2369  %cmp.uge = icmp uge ptr %gep.1, %gep.2370  %res = xor i1 %cmp.ule, %cmp.ule371  ret i1 %res372}373 374define i1 @gep_decomp_large_index_63_bits_chained_overflow(ptr %a) {375; CHECK-LABEL: @gep_decomp_large_index_63_bits_chained_overflow(376; CHECK-NEXT:  entry:377; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i64, ptr [[A:%.*]], i64 9223372036854775804378; CHECK-NEXT:    [[GEP_2:%.*]] = getelementptr inbounds ptr, ptr [[A]], i64 1152921504606846976379; CHECK-NEXT:    [[GEP_3:%.*]] = getelementptr inbounds i64, ptr [[GEP_2]], i64 1152921504606846976380; CHECK-NEXT:    [[NE:%.*]] = icmp ne ptr [[GEP_1]], [[GEP_3]]381; CHECK-NEXT:    call void @llvm.assume(i1 [[NE]])382; CHECK-NEXT:    [[CMP_UGE:%.*]] = icmp uge ptr [[GEP_1]], [[GEP_3]]383; CHECK-NEXT:    [[RES:%.*]] = xor i1 true, true384; CHECK-NEXT:    ret i1 [[RES]]385;386entry:387  %gep.1 = getelementptr inbounds i64, ptr %a, i64 9223372036854775804388  %gep.2 = getelementptr inbounds ptr, ptr %a, i64 1152921504606846976389  %gep.3 = getelementptr inbounds i64, ptr %gep.2, i64 1152921504606846976390  %ne = icmp ne ptr %gep.1, %gep.3391  call void @llvm.assume(i1 %ne)392  %cmp.ule = icmp ule ptr %gep.1, %gep.3393  %cmp.uge = icmp uge ptr %gep.1, %gep.3394  %res = xor i1 %cmp.ule, %cmp.ule395  ret i1 %res396}397 398%struct = type { [128 x i64], [2 x i32] }399 400define i1 @gep_decomp_large_index_63_bits_overflow_struct(ptr %a) {401; CHECK-LABEL: @gep_decomp_large_index_63_bits_overflow_struct(402; CHECK-NEXT:  entry:403; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i64, ptr [[A:%.*]], i64 9223372036854775804404; CHECK-NEXT:    [[GEP_2:%.*]] = getelementptr inbounds [[STRUCT:%.*]], ptr [[A]], i64 8937376004704240, i32 1, i32 1405; CHECK-NEXT:    [[NE:%.*]] = icmp ne ptr [[GEP_1]], [[GEP_2]]406; CHECK-NEXT:    call void @llvm.assume(i1 [[NE]])407; CHECK-NEXT:    [[CMP_UGE:%.*]] = icmp uge ptr [[GEP_1]], [[GEP_2]]408; CHECK-NEXT:    [[RES:%.*]] = xor i1 false, false409; CHECK-NEXT:    ret i1 [[RES]]410;411entry:412  %gep.1 = getelementptr inbounds i64, ptr %a, i64 9223372036854775804413  %gep.2 = getelementptr inbounds %struct, ptr %a, i64 8937376004704240, i32 1, i32 1414  %ne = icmp ne ptr %gep.1, %gep.2415  call void @llvm.assume(i1 %ne)416  %cmp.ule = icmp ule ptr %gep.1, %gep.2417  %cmp.uge = icmp uge ptr %gep.1, %gep.2418  %res = xor i1 %cmp.ule, %cmp.ule419  ret i1 %res420}421 422define i1 @pr68751(i128 %arg) {423; CHECK-LABEL: @pr68751(424; CHECK-NEXT:    [[SHL1:%.*]] = shl nuw nsw i128 [[ARG:%.*]], 32425; CHECK-NEXT:    [[SHL2:%.*]] = shl nuw nsw i128 [[SHL1]], 32426; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i128 [[SHL2]], 0427; CHECK-NEXT:    ret i1 [[CMP]]428;429  %shl1 = shl nuw nsw i128 %arg, 32430  %shl2 = shl nuw nsw i128 %shl1, 32431  %cmp = icmp eq i128 %shl2, 0432  ret i1 %cmp433}434 435declare void @llvm.assume(i1)436