Skip to content

Commit 19b8368

Browse files
phoebewangtstellar
authored andcommitted
[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 41c85bb commit 19b8368

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
@@ -657,35 +657,24 @@ void X86ExpandPseudo::ExpandVastartSaveXmmRegs(
657657
EntryBlk->end());
658658
TailBlk->transferSuccessorsAndUpdatePHIs(EntryBlk);
659659

660-
int64_t FrameIndex = VAStartPseudoInstr->getOperand(1).getImm();
661-
Register BaseReg;
662-
uint64_t FrameOffset =
663-
X86FL->getFrameIndexReference(*Func, FrameIndex, BaseReg).getFixed();
664-
uint64_t VarArgsRegsOffset = VAStartPseudoInstr->getOperand(2).getImm();
660+
uint64_t FrameOffset = VAStartPseudoInstr->getOperand(4).getImm();
661+
uint64_t VarArgsRegsOffset = VAStartPseudoInstr->getOperand(6).getImm();
665662

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

669666
// In the XMM save block, save all the XMM argument registers.
670-
for (int64_t OpndIdx = 3, RegIdx = 0;
667+
for (int64_t OpndIdx = 7, RegIdx = 0;
671668
OpndIdx < VAStartPseudoInstr->getNumOperands() - 1;
672669
OpndIdx++, RegIdx++) {
673-
674-
int64_t Offset = FrameOffset + VarArgsRegsOffset + RegIdx * 16;
675-
676-
MachineMemOperand *MMO = Func->getMachineMemOperand(
677-
MachinePointerInfo::getFixedStack(*Func, FrameIndex, Offset),
678-
MachineMemOperand::MOStore,
679-
/*Size=*/16, Align(16));
680-
681-
BuildMI(GuardedRegsBlk, DL, TII->get(MOVOpc))
682-
.addReg(BaseReg)
683-
.addImm(/*Scale=*/1)
684-
.addReg(/*IndexReg=*/0)
685-
.addImm(/*Disp=*/Offset)
686-
.addReg(/*Segment=*/0)
687-
.addReg(VAStartPseudoInstr->getOperand(OpndIdx).getReg())
688-
.addMemOperand(MMO);
670+
auto NewMI = BuildMI(GuardedRegsBlk, DL, TII->get(MOVOpc));
671+
for (int i = 0; i < X86::AddrNumOperands; ++i) {
672+
if (i == X86::AddrDisp)
673+
NewMI.addImm(FrameOffset + VarArgsRegsOffset + RegIdx * 16);
674+
else
675+
NewMI.add(VAStartPseudoInstr->getOperand(i + 1));
676+
}
677+
NewMI.addReg(VAStartPseudoInstr->getOperand(OpndIdx).getReg());
689678
assert(Register::isPhysicalRegister(
690679
VAStartPseudoInstr->getOperand(OpndIdx).getReg()));
691680
}

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3533,13 +3533,19 @@ void VarArgsLoweringHelper::createVarArgAreaAndStoreRegisters(
35333533
SmallVector<SDValue, 12> SaveXMMOps;
35343534
SaveXMMOps.push_back(Chain);
35353535
SaveXMMOps.push_back(ALVal);
3536-
SaveXMMOps.push_back(
3537-
DAG.getTargetConstant(FuncInfo->getRegSaveFrameIndex(), DL, MVT::i32));
3536+
SaveXMMOps.push_back(RSFIN);
35383537
SaveXMMOps.push_back(
35393538
DAG.getTargetConstant(FuncInfo->getVarArgsFPOffset(), DL, MVT::i32));
35403539
llvm::append_range(SaveXMMOps, LiveXMMRegs);
3541-
MemOps.push_back(DAG.getNode(X86ISD::VASTART_SAVE_XMM_REGS, DL,
3542-
MVT::Other, SaveXMMOps));
3540+
MachineMemOperand *StoreMMO =
3541+
DAG.getMachineFunction().getMachineMemOperand(
3542+
MachinePointerInfo::getFixedStack(
3543+
DAG.getMachineFunction(), FuncInfo->getRegSaveFrameIndex(),
3544+
Offset),
3545+
MachineMemOperand::MOStore, 128, Align(16));
3546+
MemOps.push_back(DAG.getMemIntrinsicNode(X86ISD::VASTART_SAVE_XMM_REGS,
3547+
DL, DAG.getVTList(MVT::Other),
3548+
SaveXMMOps, MVT::i8, StoreMMO));
35433549
}
35443550

35453551
if (!MemOps.empty())

llvm/lib/Target/X86/X86ISelLowering.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -627,10 +627,6 @@ namespace llvm {
627627
// packed single precision.
628628
DPBF16PS,
629629

630-
// Save xmm argument registers to the stack, according to %al. An operator
631-
// is needed so that this can be expanded with control flow.
632-
VASTART_SAVE_XMM_REGS,
633-
634630
// Windows's _chkstk call to do stack probing.
635631
WIN_ALLOCA,
636632

@@ -848,6 +844,10 @@ namespace llvm {
848844
AESENCWIDE256KL,
849845
AESDECWIDE256KL,
850846

847+
// Save xmm argument registers to the stack, according to %al. An operator
848+
// is needed so that this can be expanded with control flow.
849+
VASTART_SAVE_XMM_REGS,
850+
851851
// WARNING: Do not add anything in the end unless you want the node to
852852
// have memop! In fact, starting from FIRST_TARGET_MEMORY_OPCODE all
853853
// 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)