1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3 4declare { i64, i1 } @llvm.sadd.with.overflow.i64(i64, i64) 5declare { i8, i1 } @llvm.sadd.with.overflow.i8(i8, i8) 6 7define i1 @test_generic(i64 %a, i64 %b) { 8; CHECK-LABEL: @test_generic( 9; CHECK-NEXT: [[RES:%.*]] = tail call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 [[A:%.*]], i64 [[B:%.*]]) 10; CHECK-NEXT: [[OVERFLOW:%.*]] = extractvalue { i64, i1 } [[RES]], 1 11; CHECK-NEXT: ret i1 [[OVERFLOW]] 12; 13 %res = tail call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %a, i64 %b) 14 %overflow = extractvalue { i64, i1 } %res, 1 15 ret i1 %overflow 16} 17 18define i1 @test_constant0(i8 %a) { 19; CHECK-LABEL: @test_constant0( 20; CHECK-NEXT: ret i1 false 21; 22 %res = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %a, i8 0) 23 %overflow = extractvalue { i8, i1 } %res, 1 24 ret i1 %overflow 25} 26 27define i1 @test_constant1(i8 %a) { 28; CHECK-LABEL: @test_constant1( 29; CHECK-NEXT: [[OVERFLOW:%.*]] = icmp eq i8 [[A:%.*]], 127 30; CHECK-NEXT: ret i1 [[OVERFLOW]] 31; 32 %res = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %a, i8 1) 33 %overflow = extractvalue { i8, i1 } %res, 1 34 ret i1 %overflow 35} 36 37define i1 @test_constant2(i8 %a) { 38; CHECK-LABEL: @test_constant2( 39; CHECK-NEXT: [[OVERFLOW:%.*]] = icmp sgt i8 [[A:%.*]], 125 40; CHECK-NEXT: ret i1 [[OVERFLOW]] 41; 42 %res = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %a, i8 2) 43 %overflow = extractvalue { i8, i1 } %res, 1 44 ret i1 %overflow 45} 46 47define i1 @test_constant3(i8 %a) { 48; CHECK-LABEL: @test_constant3( 49; CHECK-NEXT: [[OVERFLOW:%.*]] = icmp sgt i8 [[A:%.*]], 124 50; CHECK-NEXT: ret i1 [[OVERFLOW]] 51; 52 %res = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %a, i8 3) 53 %overflow = extractvalue { i8, i1 } %res, 1 54 ret i1 %overflow 55} 56 57define i1 @test_constant4(i8 %a) { 58; CHECK-LABEL: @test_constant4( 59; CHECK-NEXT: [[OVERFLOW:%.*]] = icmp sgt i8 [[A:%.*]], 123 60; CHECK-NEXT: ret i1 [[OVERFLOW]] 61; 62 %res = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %a, i8 4) 63 %overflow = extractvalue { i8, i1 } %res, 1 64 ret i1 %overflow 65} 66 67define i1 @test_constant127(i8 %a) { 68; CHECK-LABEL: @test_constant127( 69; CHECK-NEXT: [[OVERFLOW:%.*]] = icmp sgt i8 [[A:%.*]], 0 70; CHECK-NEXT: ret i1 [[OVERFLOW]] 71; 72 %res = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %a, i8 127) 73 %overflow = extractvalue { i8, i1 } %res, 1 74 ret i1 %overflow 75} 76 77define i1 @test_constant128(i8 %a) { 78; CHECK-LABEL: @test_constant128( 79; CHECK-NEXT: [[OVERFLOW:%.*]] = icmp slt i8 [[A:%.*]], 0 80; CHECK-NEXT: ret i1 [[OVERFLOW]] 81; 82 %res = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %a, i8 128) 83 %overflow = extractvalue { i8, i1 } %res, 1 84 ret i1 %overflow 85} 86 87define i1 @test_constant255(i8 %a) { 88; CHECK-LABEL: @test_constant255( 89; CHECK-NEXT: [[OVERFLOW:%.*]] = icmp eq i8 [[A:%.*]], -128 90; CHECK-NEXT: ret i1 [[OVERFLOW]] 91; 92 %res = tail call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %a, i8 255) 93 %overflow = extractvalue { i8, i1 } %res, 1 94 ret i1 %overflow 95} 96 97