1 ; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s
2 define signext i32 @test1(i32 signext %i, i32 (i32)* nocapture %Func, i32 (i32)* nocapture %Func2) {
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
13 define signext i32 @test2(i32 signext %i, i32 signext %j, i32 (i32)* nocapture %Func, i32 (i32)* nocapture %Func2) {
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
22 if.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
29 if.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
36 ; Check for multiple TOC saves with if then else where neither dominates the other.
37 define signext i32 @test3(i32 signext %i, i32 (i32)* nocapture %Func, i32 (i32)* nocapture %Func2) {
41 ; CHECK-NOT: std 2, 24(1)
43 %tobool = icmp eq i32 %i, 0
44 br i1 %tobool, label %if.else, label %if.then
46 if.then: ; preds = %entry
47 %call = tail call signext i32 %Func(i32 signext %i)
50 if.else: ; preds = %entry
51 %call1 = tail call signext i32 %Func2(i32 signext 0)
54 if.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
61 define signext i32 @test4(i32 signext %i, i32 (i32)* nocapture %Func, i32 (i32)* nocapture %Func2) {
64 ; CHECK-NOT: std 2, 24(1)
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
71 if.then: ; preds = %entry
72 %call1 = tail call signext i32 %Func(i32 signext %i)
75 if.else: ; preds = %entry
76 %call3 = tail call signext i32 %Func2(i32 signext 0)
79 if.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
85 ; Check for multiple TOC saves with if then where neither is redundant.
86 define signext i32 @test5(i32 signext %i, i32 (i32)* nocapture %Func, i32 (i32)* nocapture readnone %Func2) {
92 %tobool = icmp eq i32 %i, 0
93 br i1 %tobool, label %if.end, label %if.then
95 if.then: ; preds = %entry
96 %call = tail call signext i32 %Func(i32 signext %i)
99 if.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
106 ; Check for multiple TOC saves if there are dynamic allocations on the stack.
107 define signext i32 @test6(i32 signext %i, i32 (i32)* nocapture %Func, i32 (i32)* nocapture %Func2) {
109 ; CHECK-LABEL: test6:
110 ; CHECK: std 2, 24(1)
111 ; CHECK: std 2, 24(1)
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
123 declare void @useAlloca(i32*, i32 signext)