summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Molloy <james.molloy@arm.com>2015-11-05 15:21:58 +0000
committerJames Molloy <james.molloy@arm.com>2015-11-05 15:21:58 +0000
commitbef6e431072c125c092fefd9f9ee14a2a01e5c6a (patch)
tree0792c3493f76cbbca975515c20abf7bf722c9d01
parent8f3a6aeadb9dbd710fe941dbc863a8bbc5389a4b (diff)
downloadbcm5719-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.cpp10
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);
}
OpenPOWER on IntegriCloud