diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp --- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp @@ -6015,7 +6015,8 @@ } HasParameterArea = true; } - } + } else if (Flags.isByVal() && Flags.getByValSize() >= 8) + HasParameterArea = true; /* Respect alignment of argument on the stack. */ auto Alignement = diff --git a/llvm/test/CodeGen/PowerPC/byval.ll b/llvm/test/CodeGen/PowerPC/byval.ll --- a/llvm/test/CodeGen/PowerPC/byval.ll +++ b/llvm/test/CodeGen/PowerPC/byval.ll @@ -1,4 +1,3 @@ -; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -verify-machineinstrs < %s | FileCheck %s target datalayout = "e-m:e-i64:64-n32:64-S128-v256:256:256-v512:512:512" @@ -9,15 +8,15 @@ declare dso_local i32 @foo1(%struct* byval(%struct) %var) declare dso_local void @foo(%struct* %var) -; FIXME: for the byval parameter %x, now the memory for local variable and -; for parameter save area are overlap. +; for the byval parameter %x, make sure the memory for local variable and +; for parameter save area are not overlap. ; For the below case, -; the local variable space is r1 + 40 ~ r1 + 76 +; the local variable space is r1 + 104 ~ r1 + 140 ; the parameter save area is r1 + 32 ~ r1 + 68 define dso_local i32 @bar() { ; CHECK-LABEL: bar: -; CHECK: addi 30, 1, 40 +; CHECK: addi 30, 1, 104 ; CHECK: li 3, 16 ; CHECK: lxvd2x 0, 30, 3 ; CHECK: li 3, 48 @@ -25,7 +24,7 @@ ; CHECK: li 3, 32 ; CHECK: lxvd2x 0, 0, 30 ; CHECK: stxvd2x 0, 1, 3 -; CHECK: lwz 3, 72(1) +; CHECK: lwz 3, 136(1) ; CHECK: stw 3, 64(1) entry: %x = alloca %struct, align 4