]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/PowerPC/duplicate-returns-for-tailcall.ll
Vendor import of llvm trunk r338150:
[FreeBSD/FreeBSD.git] / test / CodeGen / PowerPC / duplicate-returns-for-tailcall.ll
1 ; RUN: llc -verify-machineinstrs -mcpu=pwr8 -stop-after codegenprepare -mtriple=powerpc64le-unknown-gnu-linux  < %s | FileCheck %s
2 ; RUN: llc -verify-machineinstrs -mcpu=pwr8 -stop-after codegenprepare -mtriple=powerpc64-unknown-gnu-linux  < %s | FileCheck %s
3
4 ; Function Attrs: noinline norecurse nounwind readnone
5 define hidden signext i32 @call1(i32 signext %a, i32 signext %b, i32 signext %c) local_unnamed_addr #0 {
6 entry:
7   %add = add nsw i32 %b, %a
8   %add1 = add nsw i32 %add, %c
9   ret i32 %add1
10 }
11
12 ; Function Attrs: nounwind
13 define signext i32 @test(i32 signext %a, i32 signext %b, i32 signext %c) local_unnamed_addr #1 {
14 entry:
15   %cmp = icmp eq i32 %a, %b
16   br i1 %cmp, label %if.then, label %if.end
17
18 if.then:                                          ; preds = %entry
19   %call = tail call signext i32 @call1(i32 signext %a, i32 signext %b, i32 signext %c)
20   br label %return
21 ; The return should get duplciated here to enable a tail-call opportunity.
22 ; CHECK-LABEL: if.then:
23 ; CHECK-NEXT:  %[[T1:[a-zA-Z0-9]+]] = tail call signext i32 @call1
24 ; CHECK-NEXT:  ret i32 %[[T1]]
25
26 if.end:                                           ; preds = %entry
27   %cmp1 = icmp slt i32 %a, %b
28   br i1 %cmp1, label %if.then2, label %if.end4
29
30 if.then2:                                         ; preds = %if.end
31   %call3 = tail call signext i32 @call2(i32 signext %a, i32 signext %b, i32 signext %c) #3
32   br label %return
33 ; No duplication here since we cannot tail-call an external function anyway.
34 ; CHECK-LABEL: if.then2:
35 ; CHECK-NEXT:  tail call signext i32 @call2
36 ; CHECK-NEXT:  br
37
38 if.end4:                                          ; preds = %if.end
39   %cmp5 = icmp sgt i32 %b, %c
40   br i1 %cmp5, label %if.then6, label %return
41
42 if.then6:                                         ; preds = %if.end4
43   %call7 = tail call fastcc signext i32 @call3(i32 signext %a, i32 signext %b, i32 signext %c)
44   br label %return
45 ; tail calling a fastcc function from a ccc function is supported.
46 ; CHECK_LABEL: if.then13:
47 ; CHECK:       %[[T2:[a-zA-Z0-9]+]] = tail call fastcc signext i32 @call3
48 ; CHECK-NEXT:  ret i32 %[[T2]]
49
50 return:                                           ; preds = %if.end4, %if.then6, %if.then2, %if.then
51   %retval.0 = phi i32 [ %call, %if.then ], [ %call3, %if.then2 ], [ %call7, %if.then6 ], [ %c, %if.end4 ]
52   ret i32 %retval.0
53 }
54
55 declare signext i32 @call2(i32 signext, i32 signext, i32 signext) local_unnamed_addr #2
56
57 ; Function Attrs: noinline norecurse nounwind readnone
58 define internal fastcc signext i32 @call3(i32 signext %a, i32 signext %b, i32 signext %c) unnamed_addr #0 {
59 entry:
60   %mul = mul nsw i32 %b, %a
61   %mul1 = mul nsw i32 %mul, %c
62   ret i32 %mul1
63 }