brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.1 KiB · 254a6a6 Raw
352 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s3 4declare { i8, i1 } @llvm.ssub.with.overflow.i8(i8, i8)5 6define i8 @ssub_no_overflow_due_to_or_conds(i8 %a, i8 %b) {7; CHECK-LABEL: @ssub_no_overflow_due_to_or_conds(8; CHECK-NEXT:  entry:9; CHECK-NEXT:    [[C_1:%.*]] = icmp sle i8 [[B:%.*]], [[A:%.*]]10; CHECK-NEXT:    [[C_2:%.*]] = icmp slt i8 [[A]], 011; CHECK-NEXT:    [[OR_COND:%.*]] = or i1 [[C_2]], [[C_1]]12; CHECK-NEXT:    br i1 [[OR_COND]], label [[EXIT_FAIL:%.*]], label [[MATH:%.*]]13; CHECK:       math:14; CHECK-NEXT:    [[TMP0:%.*]] = sub i8 [[B]], [[A]]15; CHECK-NEXT:    br i1 false, label [[EXIT_FAIL]], label [[EXIT_OK:%.*]]16; CHECK:       exit.ok:17; CHECK-NEXT:    ret i8 [[TMP0]]18; CHECK:       exit.fail:19; CHECK-NEXT:    ret i8 020;21entry:22  %c.1 = icmp sle i8 %b, %a23  %c.2 = icmp slt i8 %a, 024  %or.cond = or i1 %c.2, %c.125  br i1 %or.cond, label %exit.fail, label %math26 27math:28  %op = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %b, i8 %a)29  %status = extractvalue { i8, i1 } %op, 130  br i1 %status, label %exit.fail, label %exit.ok31 32exit.ok:33  %res = extractvalue { i8, i1 } %op, 034  ret i8 %res35 36exit.fail:37  ret i8 038}39 40declare void @use_res({ i8, i1 })41 42define i8 @ssub_no_overflow_due_to_or_conds_result_used(i8 %a, i8 %b) {43; CHECK-LABEL: @ssub_no_overflow_due_to_or_conds_result_used(44; CHECK-NEXT:  entry:45; CHECK-NEXT:    [[C_1:%.*]] = icmp sle i8 [[B:%.*]], [[A:%.*]]46; CHECK-NEXT:    [[C_2:%.*]] = icmp slt i8 [[A]], 047; CHECK-NEXT:    [[OR_COND:%.*]] = or i1 [[C_2]], [[C_1]]48; CHECK-NEXT:    br i1 [[OR_COND]], label [[EXIT_FAIL:%.*]], label [[MATH:%.*]]49; CHECK:       math:50; CHECK-NEXT:    [[TMP0:%.*]] = sub i8 [[B]], [[A]]51; CHECK-NEXT:    [[OP:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[B]], i8 [[A]])52; CHECK-NEXT:    call void @use_res({ i8, i1 } [[OP]])53; CHECK-NEXT:    br i1 false, label [[EXIT_FAIL]], label [[EXIT_OK:%.*]]54; CHECK:       exit.ok:55; CHECK-NEXT:    ret i8 [[TMP0]]56; CHECK:       exit.fail:57; CHECK-NEXT:    ret i8 058;59entry:60  %c.1 = icmp sle i8 %b, %a61  %c.2 = icmp slt i8 %a, 062  %or.cond = or i1 %c.2, %c.163  br i1 %or.cond, label %exit.fail, label %math64 65math:66  %op = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %b, i8 %a)67  call void @use_res({ i8, i1 } %op)68  %status = extractvalue { i8, i1 } %op, 169  br i1 %status, label %exit.fail, label %exit.ok70 71exit.ok:72  %res = extractvalue { i8, i1 } %op, 073  ret i8 %res74 75exit.fail:76  ret i8 077}78 79define i8 @ssub_no_overflow_due_to_and_conds(i8 %a, i8 %b) {80; CHECK-LABEL: @ssub_no_overflow_due_to_and_conds(81; CHECK-NEXT:  entry:82; CHECK-NEXT:    [[C_1:%.*]] = icmp sge i8 [[B:%.*]], [[A:%.*]]83; CHECK-NEXT:    [[C_2:%.*]] = icmp sge i8 [[A]], 084; CHECK-NEXT:    [[AND:%.*]] = and i1 [[C_2]], [[C_1]]85; CHECK-NEXT:    br i1 [[AND]], label [[MATH:%.*]], label [[EXIT_FAIL:%.*]]86; CHECK:       math:87; CHECK-NEXT:    [[TMP0:%.*]] = sub i8 [[B]], [[A]]88; CHECK-NEXT:    br i1 false, label [[EXIT_FAIL]], label [[EXIT_OK:%.*]]89; CHECK:       exit.ok:90; CHECK-NEXT:    ret i8 [[TMP0]]91; CHECK:       exit.fail:92; CHECK-NEXT:    ret i8 093;94entry:95  %c.1 = icmp sge i8 %b, %a96  %c.2 = icmp sge i8 %a, 097  %and = and i1 %c.2, %c.198  br i1 %and, label %math, label %exit.fail99 100math:101  %op = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %b, i8 %a)102  %status = extractvalue { i8, i1 } %op, 1103  br i1 %status, label %exit.fail, label %exit.ok104 105exit.ok:106  %res = extractvalue { i8, i1 } %op, 0107  ret i8 %res108 109exit.fail:110  ret i8 0111}112 113define i8 @ssub_no_overflow_due_to_and_conds_sub_result_not_used(i8 %a, i8 %b) {114; CHECK-LABEL: @ssub_no_overflow_due_to_and_conds_sub_result_not_used(115; CHECK-NEXT:  entry:116; CHECK-NEXT:    [[C_1:%.*]] = icmp sge i8 [[B:%.*]], [[A:%.*]]117; CHECK-NEXT:    [[C_2:%.*]] = icmp sge i8 [[A]], 0118; CHECK-NEXT:    [[AND:%.*]] = and i1 [[C_2]], [[C_1]]119; CHECK-NEXT:    br i1 [[AND]], label [[MATH:%.*]], label [[EXIT_FAIL:%.*]]120; CHECK:       math:121; CHECK-NEXT:    br i1 false, label [[EXIT_FAIL]], label [[EXIT_OK:%.*]]122; CHECK:       exit.ok:123; CHECK-NEXT:    ret i8 20124; CHECK:       exit.fail:125; CHECK-NEXT:    ret i8 0126;127entry:128  %c.1 = icmp sge i8 %b, %a129  %c.2 = icmp sge i8 %a, 0130  %and = and i1 %c.2, %c.1131  br i1 %and, label %math, label %exit.fail132 133math:134  %op = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %b, i8 %a)135  %status = extractvalue { i8, i1 } %op, 1136  br i1 %status, label %exit.fail, label %exit.ok137 138exit.ok:139  ret i8 20140 141exit.fail:142  ret i8 0143}144 145define i8 @ssub_may_overflow1(i8 %a, i8 %b) {146; CHECK-LABEL: @ssub_may_overflow1(147; CHECK-NEXT:  entry:148; CHECK-NEXT:    [[C_1:%.*]] = icmp sge i8 [[B:%.*]], [[A:%.*]]149; CHECK-NEXT:    br i1 [[C_1]], label [[MATH:%.*]], label [[EXIT_FAIL:%.*]]150; CHECK:       math:151; CHECK-NEXT:    [[OP:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[B]], i8 [[A]])152; CHECK-NEXT:    [[STATUS:%.*]] = extractvalue { i8, i1 } [[OP]], 1153; CHECK-NEXT:    br i1 [[STATUS]], label [[EXIT_FAIL]], label [[EXIT_OK:%.*]]154; CHECK:       exit.ok:155; CHECK-NEXT:    [[RES:%.*]] = extractvalue { i8, i1 } [[OP]], 0156; CHECK-NEXT:    ret i8 [[RES]]157; CHECK:       exit.fail:158; CHECK-NEXT:    ret i8 0159;160entry:161  %c.1 = icmp sge i8 %b, %a162  br i1 %c.1, label %math, label %exit.fail163 164math:165  %op = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %b, i8 %a)166  %status = extractvalue { i8, i1 } %op, 1167  br i1 %status, label %exit.fail, label %exit.ok168 169exit.ok:170  %res = extractvalue { i8, i1 } %op, 0171  ret i8 %res172 173exit.fail:174  ret i8 0175}176 177define i8 @ssub_may_overflow2(i8 %a, i8 %b) {178; CHECK-LABEL: @ssub_may_overflow2(179; CHECK-NEXT:  entry:180; CHECK-NEXT:    [[C_1:%.*]] = icmp sge i8 [[A:%.*]], 0181; CHECK-NEXT:    br i1 [[C_1]], label [[MATH:%.*]], label [[EXIT_FAIL:%.*]]182; CHECK:       math:183; CHECK-NEXT:    [[OP:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[B:%.*]], i8 [[A]])184; CHECK-NEXT:    [[STATUS:%.*]] = extractvalue { i8, i1 } [[OP]], 1185; CHECK-NEXT:    br i1 [[STATUS]], label [[EXIT_FAIL]], label [[EXIT_OK:%.*]]186; CHECK:       exit.ok:187; CHECK-NEXT:    [[RES:%.*]] = extractvalue { i8, i1 } [[OP]], 0188; CHECK-NEXT:    ret i8 [[RES]]189; CHECK:       exit.fail:190; CHECK-NEXT:    ret i8 0191;192entry:193  %c.1 = icmp sge i8 %a, 0194  br i1 %c.1, label %math, label %exit.fail195 196math:197  %op = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %b, i8 %a)198  %status = extractvalue { i8, i1 } %op, 1199  br i1 %status, label %exit.fail, label %exit.ok200 201exit.ok:202  %res = extractvalue { i8, i1 } %op, 0203  ret i8 %res204 205exit.fail:206  ret i8 0207}208 209define i8 @ssub_may_overflow3(i8 %a, i8 %b) {210; CHECK-LABEL: @ssub_may_overflow3(211; CHECK-NEXT:  entry:212; CHECK-NEXT:    [[C_1:%.*]] = icmp sge i8 [[B:%.*]], [[A:%.*]]213; CHECK-NEXT:    [[C_2:%.*]] = icmp sge i8 [[A]], -1214; CHECK-NEXT:    [[AND:%.*]] = and i1 [[C_2]], [[C_1]]215; CHECK-NEXT:    br i1 [[AND]], label [[MATH:%.*]], label [[EXIT_FAIL:%.*]]216; CHECK:       math:217; CHECK-NEXT:    [[OP:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[B]], i8 [[A]])218; CHECK-NEXT:    [[STATUS:%.*]] = extractvalue { i8, i1 } [[OP]], 1219; CHECK-NEXT:    br i1 [[STATUS]], label [[EXIT_FAIL]], label [[EXIT_OK:%.*]]220; CHECK:       exit.ok:221; CHECK-NEXT:    [[RES:%.*]] = extractvalue { i8, i1 } [[OP]], 0222; CHECK-NEXT:    ret i8 [[RES]]223; CHECK:       exit.fail:224; CHECK-NEXT:    ret i8 0225;226entry:227  %c.1 = icmp sge i8 %b, %a228  %c.2 = icmp sge i8 %a, -1229  %and = and i1 %c.2, %c.1230  br i1 %and, label %math, label %exit.fail231 232math:233  %op = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %b, i8 %a)234  %status = extractvalue { i8, i1 } %op, 1235  br i1 %status, label %exit.fail, label %exit.ok236 237exit.ok:238  %res = extractvalue { i8, i1 } %op, 0239  ret i8 %res240 241exit.fail:242  ret i8 0243}244 245define i8 @ssub_may_overflow4(i8 %a, i8 %b) {246; CHECK-LABEL: @ssub_may_overflow4(247; CHECK-NEXT:  entry:248; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[B:%.*]], [[A:%.*]]249; CHECK-NEXT:    [[C_2:%.*]] = icmp sge i8 [[A]], 0250; CHECK-NEXT:    [[AND:%.*]] = and i1 [[C_2]], [[C_1]]251; CHECK-NEXT:    br i1 [[AND]], label [[MATH:%.*]], label [[EXIT_FAIL:%.*]]252; CHECK:       math:253; CHECK-NEXT:    [[OP:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[B]], i8 [[A]])254; CHECK-NEXT:    [[STATUS:%.*]] = extractvalue { i8, i1 } [[OP]], 1255; CHECK-NEXT:    br i1 [[STATUS]], label [[EXIT_FAIL]], label [[EXIT_OK:%.*]]256; CHECK:       exit.ok:257; CHECK-NEXT:    [[RES:%.*]] = extractvalue { i8, i1 } [[OP]], 0258; CHECK-NEXT:    ret i8 [[RES]]259; CHECK:       exit.fail:260; CHECK-NEXT:    ret i8 0261;262entry:263  %c.1 = icmp uge i8 %b, %a264  %c.2 = icmp sge i8 %a, 0265  %and = and i1 %c.2, %c.1266  br i1 %and, label %math, label %exit.fail267 268math:269  %op = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %b, i8 %a)270  %status = extractvalue { i8, i1 } %op, 1271  br i1 %status, label %exit.fail, label %exit.ok272 273exit.ok:274  %res = extractvalue { i8, i1 } %op, 0275  ret i8 %res276 277exit.fail:278  ret i8 0279}280 281define i8 @ssub_may_overflow5(i8 %a, i8 %b) {282; CHECK-LABEL: @ssub_may_overflow5(283; CHECK-NEXT:  entry:284; CHECK-NEXT:    [[C_1:%.*]] = icmp sge i8 [[B:%.*]], [[A:%.*]]285; CHECK-NEXT:    [[C_2:%.*]] = icmp sge i8 [[B]], 0286; CHECK-NEXT:    [[AND:%.*]] = and i1 [[C_2]], [[C_1]]287; CHECK-NEXT:    br i1 [[AND]], label [[MATH:%.*]], label [[EXIT_FAIL:%.*]]288; CHECK:       math:289; CHECK-NEXT:    [[OP:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[B]], i8 [[A]])290; CHECK-NEXT:    [[STATUS:%.*]] = extractvalue { i8, i1 } [[OP]], 1291; CHECK-NEXT:    br i1 [[STATUS]], label [[EXIT_FAIL]], label [[EXIT_OK:%.*]]292; CHECK:       exit.ok:293; CHECK-NEXT:    [[RES:%.*]] = extractvalue { i8, i1 } [[OP]], 0294; CHECK-NEXT:    ret i8 [[RES]]295; CHECK:       exit.fail:296; CHECK-NEXT:    ret i8 0297;298entry:299  %c.1 = icmp sge i8 %b, %a300  %c.2 = icmp sge i8 %b, 0301  %and = and i1 %c.2, %c.1302  br i1 %and, label %math, label %exit.fail303 304math:305  %op = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %b, i8 %a)306  %status = extractvalue { i8, i1 } %op, 1307  br i1 %status, label %exit.fail, label %exit.ok308 309exit.ok:310  %res = extractvalue { i8, i1 } %op, 0311  ret i8 %res312 313exit.fail:314  ret i8 0315}316 317define i8 @ssub_may_overflow6(i8 %a, i8 %b) {318; CHECK-LABEL: @ssub_may_overflow6(319; CHECK-NEXT:  entry:320; CHECK-NEXT:    [[C_1:%.*]] = icmp sle i8 [[B:%.*]], [[A:%.*]]321; CHECK-NEXT:    [[C_2:%.*]] = icmp slt i8 [[B]], 0322; CHECK-NEXT:    [[OR_COND:%.*]] = or i1 [[C_2]], [[C_1]]323; CHECK-NEXT:    br i1 [[OR_COND]], label [[EXIT_FAIL:%.*]], label [[MATH:%.*]]324; CHECK:       math:325; CHECK-NEXT:    [[OP:%.*]] = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 [[B]], i8 [[A]])326; CHECK-NEXT:    [[STATUS:%.*]] = extractvalue { i8, i1 } [[OP]], 1327; CHECK-NEXT:    br i1 [[STATUS]], label [[EXIT_FAIL]], label [[EXIT_OK:%.*]]328; CHECK:       exit.ok:329; CHECK-NEXT:    [[RES:%.*]] = extractvalue { i8, i1 } [[OP]], 0330; CHECK-NEXT:    ret i8 [[RES]]331; CHECK:       exit.fail:332; CHECK-NEXT:    ret i8 0333;334entry:335  %c.1 = icmp sle i8 %b, %a336  %c.2 = icmp slt i8 %b, 0337  %or.cond = or i1 %c.2, %c.1338  br i1 %or.cond, label %exit.fail, label %math339 340math:341  %op = tail call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %b, i8 %a)342  %status = extractvalue { i8, i1 } %op, 1343  br i1 %status, label %exit.fail, label %exit.ok344 345exit.ok:346  %res = extractvalue { i8, i1 } %op, 0347  ret i8 %res348 349exit.fail:350  ret i8 0351}352