1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 19:12:56 +02:00

[ARM] Compute known bits for ARMISD::CMOV

We can conservatively know that CMOV's known bits are the intersection of known bits for each of its operands. This helps PerformCMOVToBFICombine find more opportunities.

I tried hard to create a testcase for this and failed - we have to sufficiently confuse DAG.computeKnownBits which can see through all the cheap tricks I tried to narrow my larger testcase down :(

This code is actually exercised in CodeGen/ARM/bfi.ll, there's just no functional difference because DAG.computeKnownBits gets the right answer in that case.

llvm-svn: 252168
This commit is contained in:
James Molloy 2015-11-05 15:21:58 +00:00
parent 7b3b9d960d
commit eb33c2d7ba

View File

@ -10243,6 +10243,16 @@ static void computeKnownBits(SelectionDAG &DAG, SDValue Op, APInt &KnownZero,
KnownOne &= Mask; KnownOne &= Mask;
return; return;
} }
if (Op.getOpcode() == ARMISD::CMOV) {
APInt KZ2(KnownZero.getBitWidth(), 0);
APInt KO2(KnownOne.getBitWidth(), 0);
computeKnownBits(DAG, Op.getOperand(1), KnownZero, KnownOne);
computeKnownBits(DAG, Op.getOperand(2), KZ2, KO2);
KnownZero &= KZ2;
KnownOne &= KO2;
return;
}
return DAG.computeKnownBits(Op, KnownZero, KnownOne); return DAG.computeKnownBits(Op, KnownZero, KnownOne);
} }