Skip to content

Commit b3b53ec

Browse files
committed
Fix nasty mingw32 bug, which e.g. prevented llvm-gcc bootstrap there.
Mark _alloca call as clobberring EFLAGS, otherwise some DCE might remove other flags-clobberring stuff (e.g. cmp instructions) occuring after _alloca call. llvm-svn: 112034
1 parent e58c036 commit b3b53ec

File tree

3 files changed

+10
-6
lines changed

3 files changed

+10
-6
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8930,7 +8930,8 @@ X86TargetLowering::EmitLoweredMingwAlloca(MachineInstr *MI,
89308930
.addReg(X86::EAX, RegState::Implicit)
89318931
.addReg(X86::ESP, RegState::Implicit)
89328932
.addReg(X86::EAX, RegState::Define | RegState::Implicit)
8933-
.addReg(X86::ESP, RegState::Define | RegState::Implicit);
8933+
.addReg(X86::ESP, RegState::Define | RegState::Implicit)
8934+
.addReg(X86::EFLAGS, RegState::Define | RegState::Implicit);
89348935

89358936
MI->eraseFromParent(); // The pseudo instruction is gone now.
89368937
return BB;

llvm/lib/Target/X86/X86InstrInfo.td

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -580,9 +580,10 @@ def VASTART_SAVE_XMM_REGS : I<0, Pseudo,
580580
// The main point of having separate instruction are extra unmodelled effects
581581
// (compared to ordinary calls) like stack pointer change.
582582

583-
def MINGW_ALLOCA : I<0, Pseudo, (outs), (ins),
584-
"# dynamic stack allocation",
585-
[(X86MingwAlloca)]>;
583+
let Defs = [EAX, ESP, EFLAGS], Uses = [ESP] in
584+
def MINGW_ALLOCA : I<0, Pseudo, (outs), (ins),
585+
"# dynamic stack allocation",
586+
[(X86MingwAlloca)]>;
586587
}
587588

588589
// Nop

llvm/lib/Target/X86/X86RegisterInfo.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,7 +1109,8 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
11091109
.addImm(NumBytes);
11101110
BuildMI(MBB, MBBI, DL, TII.get(X86::CALLpcrel32))
11111111
.addExternalSymbol("_alloca")
1112-
.addReg(StackPtr, RegState::Define | RegState::Implicit);
1112+
.addReg(StackPtr, RegState::Define | RegState::Implicit)
1113+
.addReg(X86::EFLAGS, RegState::Define | RegState::Implicit);
11131114
} else {
11141115
// Save EAX
11151116
BuildMI(MBB, MBBI, DL, TII.get(X86::PUSH32r))
@@ -1121,7 +1122,8 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
11211122
.addImm(NumBytes - 4);
11221123
BuildMI(MBB, MBBI, DL, TII.get(X86::CALLpcrel32))
11231124
.addExternalSymbol("_alloca")
1124-
.addReg(StackPtr, RegState::Define | RegState::Implicit);
1125+
.addReg(StackPtr, RegState::Define | RegState::Implicit)
1126+
.addReg(X86::EFLAGS, RegState::Define | RegState::Implicit);
11251127

11261128
// Restore EAX
11271129
MachineInstr *MI = addRegOffset(BuildMI(MF, DL, TII.get(X86::MOV32rm),

0 commit comments

Comments
 (0)