From 71c70733b7528047a83811f429d36f4e53f6ba22 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 11 Nov 2014 19:46:36 +0000 Subject: [PATCH] Use a 8 bit immediate when possible. This fixes pr21529. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221700 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86FrameLowering.cpp | 16 ++++++++++++++-- test/CodeGen/X86/pr21529.ll | 15 +++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 test/CodeGen/X86/pr21529.ll diff --git a/lib/Target/X86/X86FrameLowering.cpp b/lib/Target/X86/X86FrameLowering.cpp index 70487a11b39..6e6bedbc5fb 100644 --- a/lib/Target/X86/X86FrameLowering.cpp +++ b/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/test/CodeGen/X86/pr21529.ll b/test/CodeGen/X86/pr21529.ll new file mode 100644 index 00000000000..9da73dd4095 --- /dev/null +++ b/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 +}