• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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