blob: 09658ae75ac6c524fcd1470e9027d8e9b1a9ebfe [file] [log] [blame]
Eric Christophercee313d2019-04-17 04:52:47 +00001; RUN: opt -codegenprepare -S < %s | FileCheck %s
2
3target triple = "armv8m.main-none-eabi"
4
5declare i8* @f0()
6declare i8* @f1()
7
8define i8* @tail_dup() {
9; CHECK-LABEL: tail_dup
10; CHECK: tail call i8* @f0()
11; CHECK-NEXT: ret i8*
12; CHECK: tail call i8* @f1()
13; CHECK-NEXT: ret i8*
14bb0:
15 %tmp0 = tail call i8* @f0()
16 br label %return
17bb1:
18 %tmp1 = tail call i8* @f1()
19 br label %return
20return:
21 %retval = phi i8* [ %tmp0, %bb0 ], [ %tmp1, %bb1 ]
22 ret i8* %retval
23}
24
25define nonnull i8* @nonnull_dup() {
26; CHECK-LABEL: nonnull_dup
27; CHECK: tail call i8* @f0()
28; CHECK-NEXT: ret i8*
29; CHECK: tail call i8* @f1()
30; CHECK-NEXT: ret i8*
31bb0:
32 %tmp0 = tail call i8* @f0()
33 br label %return
34bb1:
35 %tmp1 = tail call i8* @f1()
36 br label %return
37return:
38 %retval = phi i8* [ %tmp0, %bb0 ], [ %tmp1, %bb1 ]
39 ret i8* %retval
40}
41
42define i8* @noalias_dup() {
43; CHECK-LABEL: noalias_dup
44; CHECK: tail call noalias i8* @f0()
45; CHECK-NEXT: ret i8*
46; CHECK: tail call noalias i8* @f1()
47; CHECK-NEXT: ret i8*
48bb0:
49 %tmp0 = tail call noalias i8* @f0()
50 br label %return
51bb1:
52 %tmp1 = tail call noalias i8* @f1()
53 br label %return
54return:
55 %retval = phi i8* [ %tmp0, %bb0 ], [ %tmp1, %bb1 ]
56 ret i8* %retval
57}
58
59; Use inreg as a way of testing that attributes (other than nonnull and
60; noalias) disable the tailcall duplication in cgp.
61
62define inreg i8* @inreg_nodup() {
63; CHECK-LABEL: inreg_nodup
64; CHECK: tail call i8* @f0()
65; CHECK-NEXT: br label %return
66; CHECK: tail call i8* @f1()
67; CHECK-NEXT: br label %return
68bb0:
69 %tmp0 = tail call i8* @f0()
70 br label %return
71bb1:
72 %tmp1 = tail call i8* @f1()
73 br label %return
74return:
75 %retval = phi i8* [ %tmp0, %bb0 ], [ %tmp1, %bb1 ]
76 ret i8* %retval
77}