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) { 3 entry: 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 13 define signext i32 @test2(i32 signext %i, i32 signext %j, i32 (i32)* nocapture %Func, i32 (i32)* nocapture %Func2) { 14 entry: 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 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 27 br label %if.end 28 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 33 ret i32 %add6 34 } 35 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) { 38 ; CHECK-LABEL: test3: 39 ; CHECK: std 2, 24(1) 40 ; CHECK: std 2, 24(1) 41 ; CHECK-NOT: std 2, 24(1) 42 entry: 43 %tobool = icmp eq i32 %i, 0 44 br i1 %tobool, label %if.else, label %if.then 45 46 if.then: ; preds = %entry 47 %call = tail call signext i32 %Func(i32 signext %i) 48 br label %if.end 49 50 if.else: ; preds = %entry 51 %call1 = tail call signext i32 %Func2(i32 signext 0) 52 br label %if.end 53 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 58 ret i32 %add4 59 } 60 61 define 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 66 entry: 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 71 if.then: ; preds = %entry 72 %call1 = tail call signext i32 %Func(i32 signext %i) 73 br label %if.end 74 75 if.else: ; preds = %entry 76 %call3 = tail call signext i32 %Func2(i32 signext 0) 77 br label %if.end 78 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 82 ret i32 %Sum.0 83 } 84 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) { 87 entry: 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 95 if.then: ; preds = %entry 96 %call = tail call signext i32 %Func(i32 signext %i) 97 br label %if.end 98 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 103 ret i32 %add2 104 } 105 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) { 108 entry: 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 123 declare void @useAlloca(i32*, i32 signext) 124