1; RUN: opt < %s -gvn -S | FileCheck %s 2; 3 4%0 = type { i64, i1 } 5 6define i64 @test1(i64 %a, i64 %b) nounwind ssp { 7entry: 8 %uadd = tail call %0 @llvm.uadd.with.overflow.i64(i64 %a, i64 %b) 9 %uadd.0 = extractvalue %0 %uadd, 0 10 %add1 = add i64 %a, %b 11 ret i64 %add1 12} 13 14; CHECK-LABEL: @test1( 15; CHECK-NOT: add1 16; CHECK: ret 17 18define i64 @test2(i64 %a, i64 %b) nounwind ssp { 19entry: 20 %usub = tail call %0 @llvm.usub.with.overflow.i64(i64 %a, i64 %b) 21 %usub.0 = extractvalue %0 %usub, 0 22 %sub1 = sub i64 %a, %b 23 ret i64 %sub1 24} 25 26; CHECK-LABEL: @test2( 27; CHECK-NOT: sub1 28; CHECK: ret 29 30define i64 @test3(i64 %a, i64 %b) nounwind ssp { 31entry: 32 %umul = tail call %0 @llvm.umul.with.overflow.i64(i64 %a, i64 %b) 33 %umul.0 = extractvalue %0 %umul, 0 34 %mul1 = mul i64 %a, %b 35 ret i64 %mul1 36} 37 38; CHECK-LABEL: @test3( 39; CHECK-NOT: mul1 40; CHECK: ret 41 42define i64 @test4(i64 %a, i64 %b) nounwind ssp { 43entry: 44 %sadd = tail call %0 @llvm.sadd.with.overflow.i64(i64 %a, i64 %b) 45 %sadd.0 = extractvalue %0 %sadd, 0 46 %add1 = add i64 %a, %b 47 ret i64 %add1 48} 49 50; CHECK-LABEL: @test4( 51; CHECK-NOT: add1 52; CHECK: ret 53 54define i64 @test5(i64 %a, i64 %b) nounwind ssp { 55entry: 56 %ssub = tail call %0 @llvm.ssub.with.overflow.i64(i64 %a, i64 %b) 57 %ssub.0 = extractvalue %0 %ssub, 0 58 %sub1 = sub i64 %a, %b 59 ret i64 %sub1 60} 61 62; CHECK-LABEL: @test5( 63; CHECK-NOT: sub1 64; CHECK: ret 65 66define i64 @test6(i64 %a, i64 %b) nounwind ssp { 67entry: 68 %smul = tail call %0 @llvm.smul.with.overflow.i64(i64 %a, i64 %b) 69 %smul.0 = extractvalue %0 %smul, 0 70 %mul1 = mul i64 %a, %b 71 ret i64 %mul1 72} 73 74; CHECK-LABEL: @test6( 75; CHECK-NOT: mul1 76; CHECK: ret 77 78declare void @exit(i32) noreturn 79declare %0 @llvm.uadd.with.overflow.i64(i64, i64) nounwind readnone 80declare %0 @llvm.usub.with.overflow.i64(i64, i64) nounwind readnone 81declare %0 @llvm.umul.with.overflow.i64(i64, i64) nounwind readnone 82declare %0 @llvm.sadd.with.overflow.i64(i64, i64) nounwind readnone 83declare %0 @llvm.ssub.with.overflow.i64(i64, i64) nounwind readnone 84declare %0 @llvm.smul.with.overflow.i64(i64, i64) nounwind readnone 85 86