diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2014-11-11 19:46:36 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2014-11-11 19:46:36 +0000 |
| commit | a9c28b68cd5d4d2557c3a9e56568ddee9d9cec23 (patch) | |
| tree | 6158a3700a63b9975c542613800daeebce7d9aab /llvm | |
| parent | 64a328e96f926e6f751161f500245cd173674250 (diff) | |
| download | bcm5719-llvm-a9c28b68cd5d4d2557c3a9e56568ddee9d9cec23.tar.gz bcm5719-llvm-a9c28b68cd5d4d2557c3a9e56568ddee9d9cec23.zip | |
Use a 8 bit immediate when possible.
This fixes pr21529.
llvm-svn: 221700
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/X86/X86FrameLowering.cpp | 16 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/pr21529.ll | 15 |
2 files changed, 29 insertions, 2 deletions
diff --git a/llvm/lib/Target/X86/X86FrameLowering.cpp b/llvm/lib/Target/X86/X86FrameLowering.cpp index 70487a11b39..6e6bedbc5fb 100644 --- a/llvm/lib/Target/X86/X86FrameLowering.cpp +++ b/llvm/lib/Target/X86/X86FrameLowering.cpp @@ -82,6 +82,17 @@ static unsigned getADDriOpcode(unsigned IsLP64, int64_t Imm) { } } +static unsigned getANDriOpcode(bool IsLP64, int64_t Imm) { + if (IsLP64) { + if (isInt<8>(Imm)) + return X86::AND64ri8; + return X86::AND64ri32; + } + if (isInt<8>(Imm)) + return X86::AND32ri8; + return X86::AND32ri; +} + static unsigned getLEArOpcode(unsigned IsLP64) { return IsLP64 ? X86::LEA64r : X86::LEA32r; } @@ -657,11 +668,12 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF) const { // able to calculate their offsets from the frame pointer). if (RegInfo->needsStackRealignment(MF)) { assert(HasFP && "There should be a frame pointer if stack is realigned."); + uint64_t Val = -MaxAlign; MachineInstr *MI = BuildMI(MBB, MBBI, DL, - TII.get(Uses64BitFramePtr ? X86::AND64ri32 : X86::AND32ri), StackPtr) + TII.get(getANDriOpcode(Uses64BitFramePtr, Val)), StackPtr) .addReg(StackPtr) - .addImm(-MaxAlign) + .addImm(Val) .setMIFlag(MachineInstr::FrameSetup); // The EFLAGS implicit def is dead. diff --git a/llvm/test/CodeGen/X86/pr21529.ll b/llvm/test/CodeGen/X86/pr21529.ll new file mode 100644 index 00000000000..9da73dd4095 --- /dev/null +++ b/llvm/test/CodeGen/X86/pr21529.ll @@ -0,0 +1,15 @@ +; RUN: llc -filetype=obj < %s | llvm-objdump -d - | FileCheck %s + +; Test that the direct object emission selects the and variant with 8 bit +; immediate. +; We used to get this wrong when using direct object emission, but not when +; reading assembly. + +; CHECK: 48 83 e4 e0 andq $-32, %rsp + +target triple = "x86_64-pc-linux" + +define void @f() { + %foo = alloca i8, align 32 + ret void +} |

