From d10babfd65abc2b90d17f3587082b7920887ccb0 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 10 Oct 2010 18:34:00 +0000 Subject: [PATCH] fix the expansion of va_arg instruction on PPC to know the arg alignment for PPC32/64, avoiding some masking operations. llvm-gcc expands vaarg inline instead of using the instruction so it has never hit this. llvm-svn: 116168 --- llvm/lib/Target/PowerPC/PPCISelLowering.cpp | 4 ++++ llvm/test/CodeGen/PowerPC/varargs.ll | 22 +++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 llvm/test/CodeGen/PowerPC/varargs.ll diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp index 7300fd5d6ef3..618e5c1c4dd5 100644 --- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp @@ -73,6 +73,10 @@ PPCTargetLowering::PPCTargetLowering(PPCTargetMachine &TM) setUseUnderscoreSetJmp(true); setUseUnderscoreLongJmp(true); + // On PPC32/64, arguments smaller than 4/8 bytes are extended, so all + // arguments are at least 4/8 bytes aligned. + setMinStackArgumentAlignment(TM.getSubtarget().isPPC64() ? 8:4); + // Set up the register classes. addRegisterClass(MVT::i32, PPC::GPRCRegisterClass); addRegisterClass(MVT::f32, PPC::F4RCRegisterClass); diff --git a/llvm/test/CodeGen/PowerPC/varargs.ll b/llvm/test/CodeGen/PowerPC/varargs.ll new file mode 100644 index 000000000000..813ec2246349 --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/varargs.ll @@ -0,0 +1,22 @@ +; RUN: llc < %s -march=ppc32 | FileCheck -check-prefix=P32 %s +; RUN: llc < %s -march=ppc64 | FileCheck -check-prefix=P64 %s + +; PR8327 +define i8* @test1(i8** %foo) nounwind { + %A = va_arg i8** %foo, i8* + ret i8* %A +} + +; P32: test1: +; P32: lwz r4, 0(r3) +; P32: addi r5, r4, 4 +; P32: stw r5, 0(r3) +; P32: lwz r3, 0(r4) +; P32: blr + +; P64: test1: +; P64: ld r4, 0(r3) +; P64: addi r5, r4, 8 +; P64: std r5, 0(r3) +; P64: ld r3, 0(r4) +; P64: blr