[X86] Remove the places that return nullptr from X86InstrInfo::commuteInstructionImpl.

findCommutedOpIndices does the pre-checking for whether commuting is possible. There should be no reason left to fail in commuteInstructionImpl. There was a missing pre-check that I've added there and changed the check to an assert in commuteInstructionImpl.

llvm-svn: 336070
This commit is contained in:
Craig Topper 2018-07-01 23:27:41 +00:00
parent 3dafb553d9
commit c004aa6c5f
1 changed files with 10 additions and 44 deletions

View File

@ -1388,7 +1388,7 @@ unsigned X86InstrInfo::getFMA3OpcodeToCommuteOperands(
return FMAForms[FormIndex]; return FMAForms[FormIndex];
} }
static bool commuteVPTERNLOG(MachineInstr &MI, unsigned SrcOpIdx1, static void commuteVPTERNLOG(MachineInstr &MI, unsigned SrcOpIdx1,
unsigned SrcOpIdx2) { unsigned SrcOpIdx2) {
// Determine which case this commute is or if it can't be done. // Determine which case this commute is or if it can't be done.
unsigned Case = getThreeSrcCommuteCase(MI.getDesc().TSFlags, SrcOpIdx1, unsigned Case = getThreeSrcCommuteCase(MI.getDesc().TSFlags, SrcOpIdx1,
@ -1412,8 +1412,6 @@ static bool commuteVPTERNLOG(MachineInstr &MI, unsigned SrcOpIdx1,
if (Imm & SwapMasks[Case][2]) NewImm |= SwapMasks[Case][3]; if (Imm & SwapMasks[Case][2]) NewImm |= SwapMasks[Case][3];
if (Imm & SwapMasks[Case][3]) NewImm |= SwapMasks[Case][2]; if (Imm & SwapMasks[Case][3]) NewImm |= SwapMasks[Case][2];
MI.getOperand(MI.getNumOperands()-1).setImm(NewImm); MI.getOperand(MI.getNumOperands()-1).setImm(NewImm);
return true;
} }
// Returns true if this is a VPERMI2 or VPERMT2 instruction that can be // Returns true if this is a VPERMI2 or VPERMT2 instruction that can be
@ -1585,8 +1583,7 @@ MachineInstr *X86InstrInfo::commuteInstructionImpl(MachineInstr &MI, bool NewMI,
case X86::VMOVSDrr: case X86::VMOVSDrr:
case X86::VMOVSSrr:{ case X86::VMOVSSrr:{
// On SSE41 or later we can commute a MOVSS/MOVSD to a BLENDPS/BLENDPD. // On SSE41 or later we can commute a MOVSS/MOVSD to a BLENDPS/BLENDPD.
if (!Subtarget.hasSSE41()) assert(Subtarget.hasSSE41() && "Commuting MOVSD/MOVSS requires SSE41!");
return nullptr;
unsigned Mask, Opc; unsigned Mask, Opc;
switch (MI.getOpcode()) { switch (MI.getOpcode()) {
@ -1619,37 +1616,6 @@ MachineInstr *X86InstrInfo::commuteInstructionImpl(MachineInstr &MI, bool NewMI,
return TargetInstrInfo::commuteInstructionImpl(WorkingMI, /*NewMI=*/false, return TargetInstrInfo::commuteInstructionImpl(WorkingMI, /*NewMI=*/false,
OpIdx1, OpIdx2); OpIdx1, OpIdx2);
} }
case X86::CMPSDrr:
case X86::CMPSSrr:
case X86::CMPPDrri:
case X86::CMPPSrri:
case X86::VCMPSDrr:
case X86::VCMPSSrr:
case X86::VCMPPDrri:
case X86::VCMPPSrri:
case X86::VCMPPDYrri:
case X86::VCMPPSYrri:
case X86::VCMPSDZrr:
case X86::VCMPSSZrr:
case X86::VCMPPDZrri:
case X86::VCMPPSZrri:
case X86::VCMPPDZ128rri:
case X86::VCMPPSZ128rri:
case X86::VCMPPDZ256rri:
case X86::VCMPPSZ256rri: {
// Float comparison can be safely commuted for
// Ordered/Unordered/Equal/NotEqual tests
unsigned Imm = MI.getOperand(3).getImm() & 0x7;
switch (Imm) {
case 0x00: // EQUAL
case 0x03: // UNORDERED
case 0x04: // NOT EQUAL
case 0x07: // ORDERED
return TargetInstrInfo::commuteInstructionImpl(MI, NewMI, OpIdx1, OpIdx2);
default:
return nullptr;
}
}
case X86::VPCMPBZ128rri: case X86::VPCMPUBZ128rri: case X86::VPCMPBZ128rri: case X86::VPCMPUBZ128rri:
case X86::VPCMPBZ256rri: case X86::VPCMPUBZ256rri: case X86::VPCMPBZ256rri: case X86::VPCMPUBZ256rri:
case X86::VPCMPBZrri: case X86::VPCMPUBZrri: case X86::VPCMPBZrri: case X86::VPCMPUBZrri:
@ -1707,8 +1673,7 @@ MachineInstr *X86InstrInfo::commuteInstructionImpl(MachineInstr &MI, bool NewMI,
} }
case X86::MOVHLPSrr: case X86::MOVHLPSrr:
case X86::UNPCKHPDrr: { case X86::UNPCKHPDrr: {
if (!Subtarget.hasSSE2()) assert(Subtarget.hasSSE2() && "Commuting MOVHLP/UNPCKHPD requires SSE2!");
return nullptr;
unsigned Opc = MI.getOpcode(); unsigned Opc = MI.getOpcode();
switch (Opc) { switch (Opc) {
@ -1825,8 +1790,7 @@ MachineInstr *X86InstrInfo::commuteInstructionImpl(MachineInstr &MI, bool NewMI,
case X86::VPTERNLOGQZ256rmbikz: case X86::VPTERNLOGQZ256rmbikz:
case X86::VPTERNLOGQZrmbikz: { case X86::VPTERNLOGQZrmbikz: {
auto &WorkingMI = cloneIfNew(MI); auto &WorkingMI = cloneIfNew(MI);
if (!commuteVPTERNLOG(WorkingMI, OpIdx1, OpIdx2)) commuteVPTERNLOG(WorkingMI, OpIdx1, OpIdx2);
return nullptr;
return TargetInstrInfo::commuteInstructionImpl(WorkingMI, /*NewMI=*/false, return TargetInstrInfo::commuteInstructionImpl(WorkingMI, /*NewMI=*/false,
OpIdx1, OpIdx2); OpIdx1, OpIdx2);
} }
@ -1843,8 +1807,6 @@ MachineInstr *X86InstrInfo::commuteInstructionImpl(MachineInstr &MI, bool NewMI,
if (FMA3Group) { if (FMA3Group) {
unsigned Opc = unsigned Opc =
getFMA3OpcodeToCommuteOperands(MI, OpIdx1, OpIdx2, *FMA3Group); getFMA3OpcodeToCommuteOperands(MI, OpIdx1, OpIdx2, *FMA3Group);
if (Opc == 0)
return nullptr;
auto &WorkingMI = cloneIfNew(MI); auto &WorkingMI = cloneIfNew(MI);
WorkingMI.setDesc(get(Opc)); WorkingMI.setDesc(get(Opc));
return TargetInstrInfo::commuteInstructionImpl(WorkingMI, /*NewMI=*/false, return TargetInstrInfo::commuteInstructionImpl(WorkingMI, /*NewMI=*/false,
@ -2001,11 +1963,15 @@ bool X86InstrInfo::findCommutedOpIndices(MachineInstr &MI, unsigned &SrcOpIdx1,
case X86::MOVSDrr: case X86::MOVSDrr:
case X86::MOVSSrr: case X86::MOVSSrr:
case X86::VMOVSDrr: case X86::VMOVSDrr:
case X86::VMOVSSrr: { case X86::VMOVSSrr:
if (Subtarget.hasSSE41()) if (Subtarget.hasSSE41())
return TargetInstrInfo::findCommutedOpIndices(MI, SrcOpIdx1, SrcOpIdx2); return TargetInstrInfo::findCommutedOpIndices(MI, SrcOpIdx1, SrcOpIdx2);
return false; return false;
} case X86::MOVHLPSrr:
case X86::UNPCKHPDrr:
if (Subtarget.hasSSE2())
return TargetInstrInfo::findCommutedOpIndices(MI, SrcOpIdx1, SrcOpIdx2);
return false;
case X86::VPTERNLOGDZrri: case X86::VPTERNLOGDZrmi: case X86::VPTERNLOGDZrri: case X86::VPTERNLOGDZrmi:
case X86::VPTERNLOGDZ128rri: case X86::VPTERNLOGDZ128rmi: case X86::VPTERNLOGDZ128rri: case X86::VPTERNLOGDZ128rmi:
case X86::VPTERNLOGDZ256rri: case X86::VPTERNLOGDZ256rmi: case X86::VPTERNLOGDZ256rri: case X86::VPTERNLOGDZ256rmi: