diff options
| author | Michael Kuperstein <michael.m.kuperstein@intel.com> | 2014-12-11 11:26:16 +0000 |
|---|---|---|
| committer | Michael Kuperstein <michael.m.kuperstein@intel.com> | 2014-12-11 11:26:16 +0000 |
| commit | 11165674dc41c4c629365cce209096a249a8c95b (patch) | |
| tree | dc63cf998472064106d3cd076cc50324631df7dd | |
| parent | cb06a36c9a5660567fcc97930a934a71eee672b8 (diff) | |
| download | bcm5719-llvm-11165674dc41c4c629365cce209096a249a8c95b.tar.gz bcm5719-llvm-11165674dc41c4c629365cce209096a249a8c95b.zip | |
[X86] When converting movs to pushes, don't assume MOVmi operand is an actual immediate
This should fix PR21878.
llvm-svn: 224010
| -rw-r--r-- | llvm/lib/Target/X86/X86FrameLowering.cpp | 22 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/movtopush.ll | 15 |
2 files changed, 26 insertions, 11 deletions
diff --git a/llvm/lib/Target/X86/X86FrameLowering.cpp b/llvm/lib/Target/X86/X86FrameLowering.cpp index ac18e348dc9..80f9769b6f5 100644 --- a/llvm/lib/Target/X86/X86FrameLowering.cpp +++ b/llvm/lib/Target/X86/X86FrameLowering.cpp @@ -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); } diff --git a/llvm/test/CodeGen/X86/movtopush.ll b/llvm/test/CodeGen/X86/movtopush.ll index 6a848b7dc91..4db1372f948 100644 --- a/llvm/test/CodeGen/X86/movtopush.ll +++ b/llvm/test/CodeGen/X86/movtopush.ll @@ -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
+}
\ No newline at end of file |

