brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.2 KiB · 2074190 Raw
166 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4declare { i64, i1 } @llvm.usub.with.overflow.i64(i64, i64)5declare { i8, i1 } @llvm.usub.with.overflow.i8(i8, i8)6 7declare void @use(i1)8 9define i1 @test_generic(i64 %a, i64 %b) {10; CHECK-LABEL: @test_generic(11; CHECK-NEXT:    [[OVERFLOW:%.*]] = icmp ult i64 [[A:%.*]], [[B:%.*]]12; CHECK-NEXT:    ret i1 [[OVERFLOW]]13;14  %res = tail call { i64, i1 } @llvm.usub.with.overflow.i64(i64 %a, i64 %b)15  %overflow = extractvalue { i64, i1 } %res, 116  ret i1 %overflow17}18 19define i1 @test_constant0(i8 %a) {20; CHECK-LABEL: @test_constant0(21; CHECK-NEXT:    ret i1 false22;23  %res = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %a, i8 0)24  %overflow = extractvalue { i8, i1 } %res, 125  ret i1 %overflow26}27 28define i1 @test_constant1(i8 %a) {29; CHECK-LABEL: @test_constant1(30; CHECK-NEXT:    [[OVERFLOW:%.*]] = icmp eq i8 [[A:%.*]], 031; CHECK-NEXT:    ret i1 [[OVERFLOW]]32;33  %res = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %a, i8 1)34  %overflow = extractvalue { i8, i1 } %res, 135  ret i1 %overflow36}37 38define i1 @test_constant2(i8 %a) {39; CHECK-LABEL: @test_constant2(40; CHECK-NEXT:    [[OVERFLOW:%.*]] = icmp ult i8 [[A:%.*]], 241; CHECK-NEXT:    ret i1 [[OVERFLOW]]42;43  %res = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %a, i8 2)44  %overflow = extractvalue { i8, i1 } %res, 145  ret i1 %overflow46}47 48define i1 @test_constant3(i8 %a) {49; CHECK-LABEL: @test_constant3(50; CHECK-NEXT:    [[OVERFLOW:%.*]] = icmp ult i8 [[A:%.*]], 351; CHECK-NEXT:    ret i1 [[OVERFLOW]]52;53  %res = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %a, i8 3)54  %overflow = extractvalue { i8, i1 } %res, 155  ret i1 %overflow56}57 58define i1 @test_constant4(i8 %a) {59; CHECK-LABEL: @test_constant4(60; CHECK-NEXT:    [[OVERFLOW:%.*]] = icmp ult i8 [[A:%.*]], 461; CHECK-NEXT:    ret i1 [[OVERFLOW]]62;63  %res = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %a, i8 4)64  %overflow = extractvalue { i8, i1 } %res, 165  ret i1 %overflow66}67 68 69define i1 @test_constant127(i8 %a) {70; CHECK-LABEL: @test_constant127(71; CHECK-NEXT:    [[OVERFLOW:%.*]] = icmp ult i8 [[A:%.*]], 12772; CHECK-NEXT:    ret i1 [[OVERFLOW]]73;74  %res = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %a, i8 127)75  %overflow = extractvalue { i8, i1 } %res, 176  ret i1 %overflow77}78 79define i1 @test_constant128(i8 %a) {80; CHECK-LABEL: @test_constant128(81; CHECK-NEXT:    [[OVERFLOW:%.*]] = icmp sgt i8 [[A:%.*]], -182; CHECK-NEXT:    ret i1 [[OVERFLOW]]83;84  %res = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %a, i8 128)85  %overflow = extractvalue { i8, i1 } %res, 186  ret i1 %overflow87}88 89define i1 @test_constant255(i8 %a) {90; CHECK-LABEL: @test_constant255(91; CHECK-NEXT:    [[OVERFLOW:%.*]] = icmp ne i8 [[A:%.*]], -192; CHECK-NEXT:    ret i1 [[OVERFLOW]]93;94  %res = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %a, i8 255)95  %overflow = extractvalue { i8, i1 } %res, 196  ret i1 %overflow97}98 99define i1 @sub_eq0(i8 %x, i8 %y, i1 %b) {100; CHECK-LABEL: @sub_eq0(101; CHECK-NEXT:    [[OV:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]]102; CHECK-NEXT:    call void @use(i1 [[OV]])103; CHECK-NEXT:    [[EQ0:%.*]] = icmp eq i8 [[X]], [[Y]]104; CHECK-NEXT:    ret i1 [[EQ0]]105;106  %us = call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %x, i8 %y)107  %ov = extractvalue { i8, i1 } %us, 1108  call void @use(i1 %ov)109  %sub = extractvalue { i8, i1 } %us, 0110  %eq0 = icmp eq i8 %sub, 0111  ret i1 %eq0112}113 114define i1 @sub_ne0(i8 %x, i8 %y, i1 %b) {115; CHECK-LABEL: @sub_ne0(116; CHECK-NEXT:    [[OV:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]]117; CHECK-NEXT:    call void @use(i1 [[OV]])118; CHECK-NEXT:    [[NE0:%.*]] = icmp ne i8 [[X]], [[Y]]119; CHECK-NEXT:    ret i1 [[NE0]]120;121  %us = call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %x, i8 %y)122  %ov = extractvalue { i8, i1 } %us, 1123  call void @use(i1 %ov)124  %sub = extractvalue { i8, i1 } %us, 0125  %ne0 = icmp ne i8 %sub, 0126  ret i1 %ne0127}128 129; negative test - need zero130 131define i1 @sub_eq1(i8 %x, i8 %y, i1 %b) {132; CHECK-LABEL: @sub_eq1(133; CHECK-NEXT:    [[SS:%.*]] = call { i8, i1 } @llvm.usub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])134; CHECK-NEXT:    [[OV:%.*]] = extractvalue { i8, i1 } [[SS]], 1135; CHECK-NEXT:    call void @use(i1 [[OV]])136; CHECK-NEXT:    [[SUB:%.*]] = extractvalue { i8, i1 } [[SS]], 0137; CHECK-NEXT:    [[EQ1:%.*]] = icmp eq i8 [[SUB]], 1138; CHECK-NEXT:    ret i1 [[EQ1]]139;140  %ss = call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %x, i8 %y)141  %ov = extractvalue { i8, i1 } %ss, 1142  call void @use(i1 %ov)143  %sub = extractvalue { i8, i1 } %ss, 0144  %eq1 = icmp eq i8 %sub, 1145  ret i1 %eq1146}147 148; negative test - need equality pred149 150define i1 @sub_sgt0(i8 %x, i8 %y, i1 %b) {151; CHECK-LABEL: @sub_sgt0(152; CHECK-NEXT:    [[SS:%.*]] = call { i8, i1 } @llvm.usub.with.overflow.i8(i8 [[X:%.*]], i8 [[Y:%.*]])153; CHECK-NEXT:    [[OV:%.*]] = extractvalue { i8, i1 } [[SS]], 1154; CHECK-NEXT:    call void @use(i1 [[OV]])155; CHECK-NEXT:    [[SUB:%.*]] = extractvalue { i8, i1 } [[SS]], 0156; CHECK-NEXT:    [[SGT0:%.*]] = icmp sgt i8 [[SUB]], 0157; CHECK-NEXT:    ret i1 [[SGT0]]158;159  %ss = call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %x, i8 %y)160  %ov = extractvalue { i8, i1 } %ss, 1161  call void @use(i1 %ov)162  %sub = extractvalue { i8, i1 } %ss, 0163  %sgt0 = icmp sgt i8 %sub, 0164  ret i1 %sgt0165}166