@@ -1035,12 +1035,11 @@ inline static bool isTruncatedShiftCountForLEA(unsigned ShAmt) {
1035
1035
return ShAmt < 4 && ShAmt > 0 ;
1036
1036
}
1037
1037
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) {
1044
1043
if (!(CmpValDefInstr.getOpcode () == X86::SUBREG_TO_REG &&
1045
1044
CmpInstr.getOpcode () == X86::TEST64rr) &&
1046
1045
!(CmpValDefInstr.getOpcode () == X86::COPY &&
@@ -1103,7 +1102,8 @@ static bool findRedundantFlagInstr(MachineInstr &CmpInstr,
1103
1102
if (VregDefInstr->getParent () != CmpValDefInstr.getParent ())
1104
1103
return false ;
1105
1104
1106
- if (X86::isAND (VregDefInstr->getOpcode ())) {
1105
+ if (X86::isAND (VregDefInstr->getOpcode ()) &&
1106
+ (!ST.hasNF () || VregDefInstr->modifiesRegister (X86::EFLAGS, TRI))) {
1107
1107
// Get a sequence of instructions like
1108
1108
// %reg = and* ... // Set EFLAGS
1109
1109
// ... // EFLAGS not changed
@@ -5433,7 +5433,7 @@ bool X86InstrInfo::optimizeCompareInstr(MachineInstr &CmpInstr, Register SrcReg,
5433
5433
MachineInstr *AndInstr = nullptr ;
5434
5434
if (IsCmpZero &&
5435
5435
findRedundantFlagInstr (CmpInstr, Inst, MRI, &AndInstr, TRI,
5436
- NoSignFlag, ClearsOverflowFlag)) {
5436
+ Subtarget, NoSignFlag, ClearsOverflowFlag)) {
5437
5437
assert (AndInstr != nullptr && X86::isAND (AndInstr->getOpcode ()));
5438
5438
MI = AndInstr;
5439
5439
break ;
0 commit comments