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