[llvm] r221700 - Use a 8 bit immediate when possible.
Rafael Espindola
rafael.espindola at gmail.com
Tue Nov 11 11:46:37 PST 2014
Author: rafael
Date: Tue Nov 11 13:46:36 2014
New Revision: 221700
URL: http://llvm.org/viewvc/llvm-project?rev=221700&view=rev
Log:
Use a 8 bit immediate when possible.
This fixes pr21529.
Added:
llvm/trunk/test/CodeGen/X86/pr21529.ll
Modified:
llvm/trunk/lib/Target/X86/X86FrameLowering.cpp
Modified: llvm/trunk/lib/Target/X86/X86FrameLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86FrameLowering.cpp?rev=221700&r1=221699&r2=221700&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86FrameLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86FrameLowering.cpp Tue Nov 11 13:46:36 2014
@@ -82,6 +82,17 @@ static unsigned getADDriOpcode(unsigned
}
}
+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(Mach
// 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.
Added: llvm/trunk/test/CodeGen/X86/pr21529.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/pr21529.ll?rev=221700&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/pr21529.ll (added)
+++ llvm/trunk/test/CodeGen/X86/pr21529.ll Tue Nov 11 13:46:36 2014
@@ -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
+}
More information about the llvm-commits
mailing list