@@ -1035,12 +1035,11 @@ inline static bool isTruncatedShiftCountForLEA(unsigned ShAmt) {
10351035 return ShAmt < 4 && ShAmt > 0 ;
10361036}
10371037
1038- static bool findRedundantFlagInstr (MachineInstr &CmpInstr,
1039- MachineInstr &CmpValDefInstr,
1040- const MachineRegisterInfo *MRI,
1041- MachineInstr **AndInstr,
1042- const TargetRegisterInfo *TRI,
1043- bool &NoSignFlag, bool &ClearsOverflowFlag) {
1038+ static bool
1039+ findRedundantFlagInstr (MachineInstr &CmpInstr, MachineInstr &CmpValDefInstr,
1040+ const MachineRegisterInfo *MRI, MachineInstr **AndInstr,
1041+ const TargetRegisterInfo *TRI, const X86Subtarget &ST,
1042+ bool &NoSignFlag, bool &ClearsOverflowFlag) {
10441043 if (!(CmpValDefInstr.getOpcode () == X86::SUBREG_TO_REG &&
10451044 CmpInstr.getOpcode () == X86::TEST64rr) &&
10461045 !(CmpValDefInstr.getOpcode () == X86::COPY &&
@@ -1103,7 +1102,8 @@ static bool findRedundantFlagInstr(MachineInstr &CmpInstr,
11031102 if (VregDefInstr->getParent () != CmpValDefInstr.getParent ())
11041103 return false ;
11051104
1106- if (X86::isAND (VregDefInstr->getOpcode ())) {
1105+ if (X86::isAND (VregDefInstr->getOpcode ()) &&
1106+ (!ST.hasNF () || VregDefInstr->modifiesRegister (X86::EFLAGS, TRI))) {
11071107 // Get a sequence of instructions like
11081108 // %reg = and* ... // Set EFLAGS
11091109 // ... // EFLAGS not changed
@@ -5433,7 +5433,7 @@ bool X86InstrInfo::optimizeCompareInstr(MachineInstr &CmpInstr, Register SrcReg,
54335433 MachineInstr *AndInstr = nullptr ;
54345434 if (IsCmpZero &&
54355435 findRedundantFlagInstr (CmpInstr, Inst, MRI, &AndInstr, TRI,
5436- NoSignFlag, ClearsOverflowFlag)) {
5436+ Subtarget, NoSignFlag, ClearsOverflowFlag)) {
54375437 assert (AndInstr != nullptr && X86::isAND (AndInstr->getOpcode ()));
54385438 MI = AndInstr;
54395439 break ;
0 commit comments