Skip to content

Commit 8f10197

Browse files
committed
[X86][VARARG] Assign MMO earlier to avoid prolog insert point been sunk across VASTART_SAVE_XMM_REGS
The changes in D80163 defered the assignment of MachineMemOperand (MMO) until the X86ExpandPseudo pass. This will result in crash due to prolog insert point been sunk across the pseudo instruction VASTART_SAVE_XMM_REGS. Moving the assignment to the creation of the node can avoid the problem. Reviewed By: rnk Differential Revision: https://reviews.llvm.org/D112859
1 parent 5cbec88 commit 8f10197

File tree

6 files changed

+33
-43
lines changed

6 files changed

+33
-43
lines changed

llvm/lib/Target/X86/X86ExpandPseudo.cpp

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -648,35 +648,24 @@ void X86ExpandPseudo::ExpandVastartSaveXmmRegs(
648648
EntryBlk->end());
649649
TailBlk->transferSuccessorsAndUpdatePHIs(EntryBlk);
650650

651-
int64_t FrameIndex = VAStartPseudoInstr->getOperand(1).getImm();
652-
Register BaseReg;
653-
uint64_t FrameOffset =
654-
X86FL->getFrameIndexReference(*Func, FrameIndex, BaseReg).getFixed();
655-
uint64_t VarArgsRegsOffset = VAStartPseudoInstr->getOperand(2).getImm();
651+
uint64_t FrameOffset = VAStartPseudoInstr->getOperand(4).getImm();
652+
uint64_t VarArgsRegsOffset = VAStartPseudoInstr->getOperand(6).getImm();
656653

657654
// TODO: add support for YMM and ZMM here.
658655
unsigned MOVOpc = STI->hasAVX() ? X86::VMOVAPSmr : X86::MOVAPSmr;
659656

660657
// In the XMM save block, save all the XMM argument registers.
661-
for (int64_t OpndIdx = 3, RegIdx = 0;
658+
for (int64_t OpndIdx = 7, RegIdx = 0;
662659
OpndIdx < VAStartPseudoInstr->getNumOperands() - 1;
663660
OpndIdx++, RegIdx++) {
664-
665-
int64_t Offset = FrameOffset + VarArgsRegsOffset + RegIdx * 16;
666-
667-
MachineMemOperand *MMO = Func->getMachineMemOperand(
668-
MachinePointerInfo::getFixedStack(*Func, FrameIndex, Offset),
669-
MachineMemOperand::MOStore,
670-
/*Size=*/16, Align(16));
671-
672-
BuildMI(GuardedRegsBlk, DL, TII->get(MOVOpc))
673-
.addReg(BaseReg)
674-
.addImm(/*Scale=*/1)
675-
.addReg(/*IndexReg=*/0)
676-
.addImm(/*Disp=*/Offset)
677-
.addReg(/*Segment=*/0)
678-
.addReg(VAStartPseudoInstr->getOperand(OpndIdx).getReg())
679-
.addMemOperand(MMO);
661+
auto NewMI = BuildMI(GuardedRegsBlk, DL, TII->get(MOVOpc));
662+
for (int i = 0; i < X86::AddrNumOperands; ++i) {
663+
if (i == X86::AddrDisp)
664+
NewMI.addImm(FrameOffset + VarArgsRegsOffset + RegIdx * 16);
665+
else
666+
NewMI.add(VAStartPseudoInstr->getOperand(i + 1));
667+
}
668+
NewMI.addReg(VAStartPseudoInstr->getOperand(OpndIdx).getReg());
680669
assert(Register::isPhysicalRegister(
681670
VAStartPseudoInstr->getOperand(OpndIdx).getReg()));
682671
}

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3742,13 +3742,19 @@ void VarArgsLoweringHelper::createVarArgAreaAndStoreRegisters(
37423742
SmallVector<SDValue, 12> SaveXMMOps;
37433743
SaveXMMOps.push_back(Chain);
37443744
SaveXMMOps.push_back(ALVal);
3745-
SaveXMMOps.push_back(
3746-
DAG.getTargetConstant(FuncInfo->getRegSaveFrameIndex(), DL, MVT::i32));
3745+
SaveXMMOps.push_back(RSFIN);
37473746
SaveXMMOps.push_back(
37483747
DAG.getTargetConstant(FuncInfo->getVarArgsFPOffset(), DL, MVT::i32));
37493748
llvm::append_range(SaveXMMOps, LiveXMMRegs);
3750-
MemOps.push_back(DAG.getNode(X86ISD::VASTART_SAVE_XMM_REGS, DL,
3751-
MVT::Other, SaveXMMOps));
3749+
MachineMemOperand *StoreMMO =
3750+
DAG.getMachineFunction().getMachineMemOperand(
3751+
MachinePointerInfo::getFixedStack(
3752+
DAG.getMachineFunction(), FuncInfo->getRegSaveFrameIndex(),
3753+
Offset),
3754+
MachineMemOperand::MOStore, 128, Align(16));
3755+
MemOps.push_back(DAG.getMemIntrinsicNode(X86ISD::VASTART_SAVE_XMM_REGS,
3756+
DL, DAG.getVTList(MVT::Other),
3757+
SaveXMMOps, MVT::i8, StoreMMO));
37523758
}
37533759

37543760
if (!MemOps.empty())

llvm/lib/Target/X86/X86ISelLowering.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -650,10 +650,6 @@ namespace llvm {
650650
// packed single precision.
651651
DPBF16PS,
652652

653-
// Save xmm argument registers to the stack, according to %al. An operator
654-
// is needed so that this can be expanded with control flow.
655-
VASTART_SAVE_XMM_REGS,
656-
657653
// A stack checking function call. On Windows it's _chkstk call.
658654
DYN_ALLOCA,
659655

@@ -871,6 +867,10 @@ namespace llvm {
871867
AESENCWIDE256KL,
872868
AESDECWIDE256KL,
873869

870+
// Save xmm argument registers to the stack, according to %al. An operator
871+
// is needed so that this can be expanded with control flow.
872+
VASTART_SAVE_XMM_REGS,
873+
874874
// WARNING: Do not add anything in the end unless you want the node to
875875
// have memop! In fact, starting from FIRST_TARGET_MEMORY_OPCODE all
876876
// opcodes will be thought as target memory ops!

llvm/lib/Target/X86/X86InstrCompiler.td

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -69,16 +69,12 @@ def : Pat<(X86callseq_start timm:$amt1, timm:$amt2),
6969
let SchedRW = [WriteSystem] in {
7070

7171
// x86-64 va_start lowering magic.
72-
let hasSideEffects = 1, Defs = [EFLAGS] in {
72+
let hasSideEffects = 1, mayStore = 1, Defs = [EFLAGS] in {
7373
def VASTART_SAVE_XMM_REGS : I<0, Pseudo,
7474
(outs),
75-
(ins GR8:$al,
76-
i32imm:$regsavefi, i32imm:$offset,
77-
variable_ops),
78-
"#VASTART_SAVE_XMM_REGS $al, $regsavefi, $offset",
79-
[(X86vastart_save_xmm_regs GR8:$al,
80-
timm:$regsavefi,
81-
timm:$offset),
75+
(ins GR8:$al, i8mem:$regsavefi, variable_ops),
76+
"#VASTART_SAVE_XMM_REGS $al, $regsavefi",
77+
[(X86vastart_save_xmm_regs GR8:$al, addr:$regsavefi),
8278
(implicit EFLAGS)]>;
8379
}
8480

llvm/lib/Target/X86/X86InstrInfo.td

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,7 @@ def SDT_X86Call : SDTypeProfile<0, -1, [SDTCisVT<0, iPTR>]>;
9191
def SDT_X86NtBrind : SDTypeProfile<0, -1, [SDTCisVT<0, iPTR>]>;
9292

9393
def SDT_X86VASTART_SAVE_XMM_REGS : SDTypeProfile<0, -1, [SDTCisVT<0, i8>,
94-
SDTCisVT<1, iPTR>,
95-
SDTCisVT<2, iPTR>]>;
94+
SDTCisPtrTy<1>]>;
9695

9796
def SDT_X86VAARG : SDTypeProfile<1, -1, [SDTCisPtrTy<0>,
9897
SDTCisPtrTy<1>,
@@ -184,7 +183,7 @@ def X86iret : SDNode<"X86ISD::IRET", SDTX86Ret,
184183
def X86vastart_save_xmm_regs :
185184
SDNode<"X86ISD::VASTART_SAVE_XMM_REGS",
186185
SDT_X86VASTART_SAVE_XMM_REGS,
187-
[SDNPHasChain, SDNPVariadic]>;
186+
[SDNPHasChain, SDNPMayStore, SDNPMemOperand, SDNPVariadic]>;
188187
def X86vaarg64 :
189188
SDNode<"X86ISD::VAARG_64", SDT_X86VAARG,
190189
[SDNPHasChain, SDNPMayLoad, SDNPMayStore,

llvm/test/CodeGen/X86/vaargs-prolog-insert.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
define void @reduce(i32, i32, i32, i32, i32, i32, ...) nounwind {
66
; CHECK-LABEL: reduce:
77
; CHECK: # %bb.0:
8+
; CHECK-NEXT: subq $56, %rsp
89
; CHECK-NEXT: testb %al, %al
910
; CHECK-NEXT: je .LBB0_4
1011
; CHECK-NEXT: # %bb.3:
@@ -21,15 +22,14 @@ define void @reduce(i32, i32, i32, i32, i32, i32, ...) nounwind {
2122
; CHECK-NEXT: testb %al, %al
2223
; CHECK-NEXT: jne .LBB0_2
2324
; CHECK-NEXT: # %bb.1:
24-
; CHECK-NEXT: subq $56, %rsp
2525
; CHECK-NEXT: leaq -{{[0-9]+}}(%rsp), %rax
2626
; CHECK-NEXT: movq %rax, 16
2727
; CHECK-NEXT: leaq {{[0-9]+}}(%rsp), %rax
2828
; CHECK-NEXT: movq %rax, 8
2929
; CHECK-NEXT: movl $48, 4
3030
; CHECK-NEXT: movl $48, 0
31-
; CHECK-NEXT: addq $56, %rsp
3231
; CHECK-NEXT: .LBB0_2:
32+
; CHECK-NEXT: addq $56, %rsp
3333
; CHECK-NEXT: retq
3434
br i1 undef, label %8, label %7
3535

0 commit comments

Comments
 (0)