forked from OSchip/llvm-project
[PPC] Fix assertion failure during binary encoding with -mcpu=pwr9
Summary clang -c -mcpu=pwr9 test/CodeGen/PowerPC/build-vector-tests.ll causes an assertion failure during the binary encoding. The failure occurs when a D-form load instruction takes two register operands instead of a register + an immediate. This patch fixes the problem and also adds an assertion to catch this failure earlier before the binary encoding (i.e. during lit test). The fix is from Nemanja Ivanovic @nemanjai. Differential Revision: https://reviews.llvm.org/D33482 llvm-svn: 304133
This commit is contained in:
parent
8cca8cb0ce
commit
e3c14ebbfa
|
@ -1931,6 +1931,8 @@ bool PPCInstrInfo::expandPostRAPseudo(MachineInstr &MI) const {
|
|||
case PPC::DFSTOREf64: {
|
||||
assert(Subtarget.hasP9Vector() &&
|
||||
"Invalid D-Form Pseudo-ops on non-P9 target.");
|
||||
assert(MI.getOperand(2).isReg() && MI.getOperand(1).isImm() &&
|
||||
"D-form op must have register and immediate operands");
|
||||
unsigned UpperOpcode, LowerOpcode;
|
||||
switch (MI.getOpcode()) {
|
||||
case PPC::DFLOADf32:
|
||||
|
|
|
@ -2724,9 +2724,15 @@ def FltToUIntLoad {
|
|||
def FltToLongLoad {
|
||||
dag A = (i64 (PPCmfvsr (PPCfctidz (f64 (extloadf32 xoaddr:$A)))));
|
||||
}
|
||||
def FltToLongLoadP9 {
|
||||
dag A = (i64 (PPCmfvsr (PPCfctidz (f64 (extloadf32 iaddr:$A)))));
|
||||
}
|
||||
def FltToULongLoad {
|
||||
dag A = (i64 (PPCmfvsr (PPCfctiduz (f64 (extloadf32 xoaddr:$A)))));
|
||||
}
|
||||
def FltToULongLoadP9 {
|
||||
dag A = (i64 (PPCmfvsr (PPCfctiduz (f64 (extloadf32 iaddr:$A)))));
|
||||
}
|
||||
def FltToLong {
|
||||
dag A = (i64 (PPCmfvsr (PPCfctidz (fpextend f32:$A))));
|
||||
}
|
||||
|
@ -2748,9 +2754,15 @@ def DblToULong {
|
|||
def DblToIntLoad {
|
||||
dag A = (i32 (PPCmfvsr (PPCfctiwz (f64 (load xoaddr:$A)))));
|
||||
}
|
||||
def DblToIntLoadP9 {
|
||||
dag A = (i32 (PPCmfvsr (PPCfctiwz (f64 (load iaddr:$A)))));
|
||||
}
|
||||
def DblToUIntLoad {
|
||||
dag A = (i32 (PPCmfvsr (PPCfctiwuz (f64 (load xoaddr:$A)))));
|
||||
}
|
||||
def DblToUIntLoadP9 {
|
||||
dag A = (i32 (PPCmfvsr (PPCfctiwuz (f64 (load iaddr:$A)))));
|
||||
}
|
||||
def DblToLongLoad {
|
||||
dag A = (i64 (PPCmfvsr (PPCfctidz (f64 (load xoaddr:$A)))));
|
||||
}
|
||||
|
@ -2918,17 +2930,17 @@ let AddedComplexity = 400 in {
|
|||
(v4i32 (XVCVSPSXWS (LXVWSX xoaddr:$A)))>;
|
||||
def : Pat<(v4i32 (scalar_to_vector FltToUIntLoad.A)),
|
||||
(v4i32 (XVCVSPUXWS (LXVWSX xoaddr:$A)))>;
|
||||
def : Pat<(v4i32 (scalar_to_vector DblToIntLoad.A)),
|
||||
def : Pat<(v4i32 (scalar_to_vector DblToIntLoadP9.A)),
|
||||
(v4i32 (XXSPLTW (COPY_TO_REGCLASS
|
||||
(XSCVDPSXWS (DFLOADf64 iaddr:$A)), VSRC), 1))>;
|
||||
def : Pat<(v4i32 (scalar_to_vector DblToUIntLoad.A)),
|
||||
def : Pat<(v4i32 (scalar_to_vector DblToUIntLoadP9.A)),
|
||||
(v4i32 (XXSPLTW (COPY_TO_REGCLASS
|
||||
(XSCVDPUXWS (DFLOADf64 iaddr:$A)), VSRC), 1))>;
|
||||
def : Pat<(v2i64 (scalar_to_vector FltToLongLoad.A)),
|
||||
def : Pat<(v2i64 (scalar_to_vector FltToLongLoadP9.A)),
|
||||
(v2i64 (XXPERMDIs (XSCVDPSXDS (COPY_TO_REGCLASS
|
||||
(DFLOADf32 iaddr:$A),
|
||||
VSFRC)), 0))>;
|
||||
def : Pat<(v2i64 (scalar_to_vector FltToULongLoad.A)),
|
||||
def : Pat<(v2i64 (scalar_to_vector FltToULongLoadP9.A)),
|
||||
(v2i64 (XXPERMDIs (XSCVDPUXDS (COPY_TO_REGCLASS
|
||||
(DFLOADf32 iaddr:$A),
|
||||
VSFRC)), 0))>;
|
||||
|
|
Loading…
Reference in New Issue