[X86] When converting movs to pushes, don't assume MOVmi operand is an actual immediate

This should fix PR21878.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@224010 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Michael Kuperstein 2014-12-11 11:26:16 +00:00
parent 40c2ddeffe
commit 6ad268ca66
2 changed files with 26 additions and 11 deletions

View File

@ -93,13 +93,14 @@ static unsigned getANDriOpcode(bool IsLP64, int64_t Imm) {
return X86::AND32ri;
}
static unsigned getPUSHiOpcode(bool IsLP64, int64_t Imm) {
static unsigned getPUSHiOpcode(bool IsLP64, MachineOperand MO) {
// We don't support LP64 for now.
assert(!IsLP64);
if (isInt<8>(Imm))
if (MO.isImm() && isInt<8>(MO.getImm()))
return X86::PUSH32i8;
return X86::PUSHi32;
return X86::PUSHi32;;
}
static unsigned getLEArOpcode(unsigned IsLP64) {
@ -1892,14 +1893,13 @@ convertArgMovsToPushes(MachineFunction &MF, MachineBasicBlock &MBB,
for (auto MMI = MovMap.rbegin(), MME = MovMap.rend(); MMI != MME; ++MMI) {
MachineBasicBlock::iterator MOV = MMI->second;
MachineOperand PushOp = MOV->getOperand(X86::AddrNumOperands);
if (MOV->getOpcode() == X86::MOV32mi) {
int64_t Val = PushOp.getImm();
BuildMI(MBB, Call, DL, TII.get(getPUSHiOpcode(false, Val)))
.addImm(Val);
} else {
BuildMI(MBB, Call, DL, TII.get(X86::PUSH32r))
.addReg(PushOp.getReg());
}
// Replace MOVmr with PUSH32r, and MOVmi with PUSHi of appropriate size
int PushOpcode = X86::PUSH32r;
if (MOV->getOpcode() == X86::MOV32mi)
PushOpcode = getPUSHiOpcode(false, PushOp);
BuildMI(MBB, Call, DL, TII.get(PushOpcode)).addOperand(PushOp);
MBB.erase(MOV);
}

View File

@ -94,4 +94,19 @@ entry:
ret void
}
; Check that pushing the addresses of globals (Or generally, things that
; aren't exactly immediates) isn't broken.
; Fixes PR21878.
; NORMAL-LABEL: test6
; NORMAL: pushl $_ext
; NORMAL-NEXT: call
declare void @f(i8*)
@ext = external constant i8
define void @test6() {
call void @f(i8* @ext)
br label %bb
bb:
alloca i32
ret void
}