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