diff options
author | James Molloy <james.molloy@arm.com> | 2015-11-05 15:21:58 +0000 |
---|---|---|
committer | James Molloy <james.molloy@arm.com> | 2015-11-05 15:21:58 +0000 |
commit | bef6e431072c125c092fefd9f9ee14a2a01e5c6a (patch) | |
tree | 0792c3493f76cbbca975515c20abf7bf722c9d01 | |
parent | 8f3a6aeadb9dbd710fe941dbc863a8bbc5389a4b (diff) | |
download | bcm5719-llvm-bef6e431072c125c092fefd9f9ee14a2a01e5c6a.tar.gz bcm5719-llvm-bef6e431072c125c092fefd9f9ee14a2a01e5c6a.zip |
[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
-rw-r--r-- | llvm/lib/Target/ARM/ARMISelLowering.cpp | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index 221cb1ac361..992902d6f6e 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -10243,6 +10243,16 @@ static void computeKnownBits(SelectionDAG &DAG, SDValue Op, APInt &KnownZero, KnownOne &= Mask; 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); } |