Fix a significant code quality regression I introduced on PPC64 quite
authorChris Lattner <sabre@nondot.org>
Sat, 8 Dec 2007 07:04:58 +0000 (07:04 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 8 Dec 2007 07:04:58 +0000 (07:04 +0000)
a while ago.  We now produce:

_foo:
mflr r0
std r0, 16(r1)
ld r2, 16(r1)
std r2, 0(r3)
ld r0, 16(r1)
mtlr r0
blr

instead of:

_foo:
mflr r0
std r0, 16(r1)
lis r0, 0
ori r0, r0, 16
ldx r2, r1, r0
std r2, 0(r3)
ld r0, 16(r1)
mtlr r0
blr

for:

void foo(void **X) {
  *X = __builtin_return_address(0);
}

on ppc64.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44701 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PowerPC/PPCRegisterInfo.cpp
test/CodeGen/PowerPC/retaddr.ll

index c574f7004aa2a379f7972a62adc91b8e1a274667..150bda7e242070756d71b54ae7cf2dada4f9cc30 100644 (file)
@@ -817,7 +817,7 @@ void PPCRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
   // clear can be encoded.  This is extremely uncommon, because normally you
   // only "std" to a stack slot that is at least 4-byte aligned, but it can
   // happen in invalid code.
-  if (isInt16(Offset) && (!isIXAddr || (isIXAddr & 3) == 0)) {
+  if (isInt16(Offset) && (!isIXAddr || (Offset & 3) == 0)) {
     if (isIXAddr)
       Offset >>= 2;    // The actual encoded value has the low two bits zero.
     MI.getOperand(OffsetOperandNo).ChangeToImmediate(Offset);
index 6b9a5e3f0680712cbe53e017f605ab709ee10a70..f4cad34addad6d99f28b03e357149081bce9cec8 100644 (file)
@@ -1,5 +1,6 @@
 ; RUN: llvm-as < %s | llc -march=ppc32 | grep mflr
 ; RUN: llvm-as < %s | llc -march=ppc32 | grep lwz
+; RUN: llvm-as < %s | llc -march=ppc64 | grep {ld r., 16(r1)}
 
 target triple = "powerpc-apple-darwin8"