blob: 8b9729544b8502e227f8d1bd0b0ae8730476a98c [file] [log] [blame]
Zaara Syedaf94d58d2017-11-27 20:26:36 +00001; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s
2define signext i32 @test1(i32 signext %i, i32 (i32)* nocapture %Func, i32 (i32)* nocapture %Func2) {
3entry:
4; CHECK-LABEL: test1:
5; CHECK: std 2, 24(1)
6; CHECK-NOT: std 2, 24(1)
7 %call = tail call signext i32 %Func(i32 signext %i)
8 %call1 = tail call signext i32 %Func2(i32 signext %i)
9 %add2 = add nsw i32 %call1, %call
10 ret i32 %add2
11}
12
13define signext i32 @test2(i32 signext %i, i32 signext %j, i32 (i32)* nocapture %Func, i32 (i32)* nocapture %Func2) {
14entry:
15; CHECK-LABEL: test2:
16; CHECK: std 2, 24(1)
17; CHECK-NOT: std 2, 24(1)
18 %call = tail call signext i32 %Func(i32 signext %i)
19 %tobool = icmp eq i32 %j, 0
20 br i1 %tobool, label %if.end, label %if.then
21
22if.then: ; preds = %entry
23 %call1 = tail call signext i32 %Func(i32 signext %i)
24 %add2 = add nsw i32 %call1, %call
25 %call3 = tail call signext i32 %Func2(i32 signext %i)
26 %add4 = add nsw i32 %add2, %call3
27 br label %if.end
28
29if.end: ; preds = %entry, %if.then
30 %Sum.0 = phi i32 [ %add4, %if.then ], [ %call, %entry ]
31 %call5 = tail call signext i32 %Func(i32 signext %i)
32 %add6 = add nsw i32 %call5, %Sum.0
33 ret i32 %add6
34}
35
36; Check for multiple TOC saves with if then else where neither dominates the other.
37define signext i32 @test3(i32 signext %i, i32 (i32)* nocapture %Func, i32 (i32)* nocapture %Func2) {
38; CHECK-LABEL: test3:
39; CHECK: std 2, 24(1)
40; CHECK: std 2, 24(1)
41; CHECK-NOT: std 2, 24(1)
42entry:
43 %tobool = icmp eq i32 %i, 0
44 br i1 %tobool, label %if.else, label %if.then
45
46if.then: ; preds = %entry
47 %call = tail call signext i32 %Func(i32 signext %i)
48 br label %if.end
49
50if.else: ; preds = %entry
51 %call1 = tail call signext i32 %Func2(i32 signext 0)
52 br label %if.end
53
54if.end: ; preds = %if.else, %if.then
55 %Sum.0 = phi i32 [ %call, %if.then ], [ %call1, %if.else ]
56 %call3 = tail call signext i32 %Func(i32 signext %i)
57 %add4 = add nsw i32 %call3, %Sum.0
58 ret i32 %add4
59}
60
61define signext i32 @test4(i32 signext %i, i32 (i32)* nocapture %Func, i32 (i32)* nocapture %Func2) {
62; CHECK-LABEL: test4:
63; CHECK: std 2, 24(1)
64; CHECK-NOT: std 2, 24(1)
65
66entry:
67 %call = tail call signext i32 %Func(i32 signext %i)
68 %tobool = icmp eq i32 %i, 0
69 br i1 %tobool, label %if.else, label %if.then
70
71if.then: ; preds = %entry
72 %call1 = tail call signext i32 %Func(i32 signext %i)
73 br label %if.end
74
75if.else: ; preds = %entry
76 %call3 = tail call signext i32 %Func2(i32 signext 0)
77 br label %if.end
78
79if.end: ; preds = %if.else, %if.then
80 %call1.pn = phi i32 [ %call1, %if.then ], [ %call3, %if.else ]
81 %Sum.0 = add nsw i32 %call1.pn, %call
82 ret i32 %Sum.0
83}
84
85; Check for multiple TOC saves with if then where neither is redundant.
86define signext i32 @test5(i32 signext %i, i32 (i32)* nocapture %Func, i32 (i32)* nocapture readnone %Func2) {
87entry:
88; CHECK-LABEL: test5:
89; CHECK: std 2, 24(1)
90; CHECK: std 2, 24(1)
91
92 %tobool = icmp eq i32 %i, 0
93 br i1 %tobool, label %if.end, label %if.then
94
95if.then: ; preds = %entry
96 %call = tail call signext i32 %Func(i32 signext %i)
97 br label %if.end
98
99if.end: ; preds = %entry, %if.then
100 %Sum.0 = phi i32 [ %call, %if.then ], [ 0, %entry ]
101 %call1 = tail call signext i32 %Func(i32 signext %i)
102 %add2 = add nsw i32 %call1, %Sum.0
103 ret i32 %add2
104}
105
106; Check for multiple TOC saves if there are dynamic allocations on the stack.
107define signext i32 @test6(i32 signext %i, i32 (i32)* nocapture %Func, i32 (i32)* nocapture %Func2) {
108entry:
109; CHECK-LABEL: test6:
110; CHECK: std 2, 24(1)
111; CHECK: std 2, 24(1)
112
113 %conv = sext i32 %i to i64
114 %0 = alloca i8, i64 %conv, align 16
115 %1 = bitcast i8* %0 to i32*
116 %call = tail call signext i32 %Func(i32 signext %i)
117 call void @useAlloca(i32* nonnull %1, i32 signext %call)
118 %call1 = call signext i32 %Func2(i32 signext %i)
119 %add2 = add nsw i32 %call1, %call
120 ret i32 %add2
121}
122
123declare void @useAlloca(i32*, i32 signext)