; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s define signext i32 @test1(i32 signext %i, i32 (i32)* nocapture %Func, i32 (i32)* nocapture %Func2) { entry: ; CHECK-LABEL: test1: ; CHECK: std 2, 24(1) ; CHECK-NOT: std 2, 24(1) %call = tail call signext i32 %Func(i32 signext %i) %call1 = tail call signext i32 %Func2(i32 signext %i) %add2 = add nsw i32 %call1, %call ret i32 %add2 } define signext i32 @test2(i32 signext %i, i32 signext %j, i32 (i32)* nocapture %Func, i32 (i32)* nocapture %Func2) { entry: ; CHECK-LABEL: test2: ; CHECK: std 2, 24(1) ; CHECK-NOT: std 2, 24(1) %call = tail call signext i32 %Func(i32 signext %i) %tobool = icmp eq i32 %j, 0 br i1 %tobool, label %if.end, label %if.then if.then: ; preds = %entry %call1 = tail call signext i32 %Func(i32 signext %i) %add2 = add nsw i32 %call1, %call %call3 = tail call signext i32 %Func2(i32 signext %i) %add4 = add nsw i32 %add2, %call3 br label %if.end if.end: ; preds = %entry, %if.then %Sum.0 = phi i32 [ %add4, %if.then ], [ %call, %entry ] %call5 = tail call signext i32 %Func(i32 signext %i) %add6 = add nsw i32 %call5, %Sum.0 ret i32 %add6 } ; Check for multiple TOC saves with if then else where neither dominates the other. define signext i32 @test3(i32 signext %i, i32 (i32)* nocapture %Func, i32 (i32)* nocapture %Func2) { ; CHECK-LABEL: test3: ; CHECK: std 2, 24(1) ; CHECK: std 2, 24(1) ; CHECK-NOT: std 2, 24(1) entry: %tobool = icmp eq i32 %i, 0 br i1 %tobool, label %if.else, label %if.then if.then: ; preds = %entry %call = tail call signext i32 %Func(i32 signext %i) br label %if.end if.else: ; preds = %entry %call1 = tail call signext i32 %Func2(i32 signext 0) br label %if.end if.end: ; preds = %if.else, %if.then %Sum.0 = phi i32 [ %call, %if.then ], [ %call1, %if.else ] %call3 = tail call signext i32 %Func(i32 signext %i) %add4 = add nsw i32 %call3, %Sum.0 ret i32 %add4 } define signext i32 @test4(i32 signext %i, i32 (i32)* nocapture %Func, i32 (i32)* nocapture %Func2) { ; CHECK-LABEL: test4: ; CHECK: std 2, 24(1) ; CHECK-NOT: std 2, 24(1) entry: %call = tail call signext i32 %Func(i32 signext %i) %tobool = icmp eq i32 %i, 0 br i1 %tobool, label %if.else, label %if.then if.then: ; preds = %entry %call1 = tail call signext i32 %Func(i32 signext %i) br label %if.end if.else: ; preds = %entry %call3 = tail call signext i32 %Func2(i32 signext 0) br label %if.end if.end: ; preds = %if.else, %if.then %call1.pn = phi i32 [ %call1, %if.then ], [ %call3, %if.else ] %Sum.0 = add nsw i32 %call1.pn, %call ret i32 %Sum.0 } ; Check for multiple TOC saves with if then where neither is redundant. define signext i32 @test5(i32 signext %i, i32 (i32)* nocapture %Func, i32 (i32)* nocapture readnone %Func2) { entry: ; CHECK-LABEL: test5: ; CHECK: std 2, 24(1) ; CHECK: std 2, 24(1) %tobool = icmp eq i32 %i, 0 br i1 %tobool, label %if.end, label %if.then if.then: ; preds = %entry %call = tail call signext i32 %Func(i32 signext %i) br label %if.end if.end: ; preds = %entry, %if.then %Sum.0 = phi i32 [ %call, %if.then ], [ 0, %entry ] %call1 = tail call signext i32 %Func(i32 signext %i) %add2 = add nsw i32 %call1, %Sum.0 ret i32 %add2 } ; Check for multiple TOC saves if there are dynamic allocations on the stack. define signext i32 @test6(i32 signext %i, i32 (i32)* nocapture %Func, i32 (i32)* nocapture %Func2) { entry: ; CHECK-LABEL: test6: ; CHECK: std 2, 24(1) ; CHECK: std 2, 24(1) %conv = sext i32 %i to i64 %0 = alloca i8, i64 %conv, align 16 %1 = bitcast i8* %0 to i32* %call = tail call signext i32 %Func(i32 signext %i) call void @useAlloca(i32* nonnull %1, i32 signext %call) %call1 = call signext i32 %Func2(i32 signext %i) %add2 = add nsw i32 %call1, %call ret i32 %add2 } declare void @useAlloca(i32*, i32 signext)