summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2016-10-21 19:57:55 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2016-10-21 19:57:55 +0000
commite9bd49824d471b79fd54ae014a998ba3996f9640 (patch)
tree9d2ad70e73f639bef709df6a7cd09b38f7754716
parentab488723134a42e85211d67a591537f2f2ad0ca0 (diff)
downloadbcm5719-llvm-e9bd49824d471b79fd54ae014a998ba3996f9640.tar.gz
bcm5719-llvm-e9bd49824d471b79fd54ae014a998ba3996f9640.zip
X86: Improve BT instruction selection for 64-bit values.
If a 64-bit value is tested against a bit which is known to be in the range [0..31) (modulo 64), we can use the 32-bit BT instruction, which has a slightly shorter encoding. Differential Revision: https://reviews.llvm.org/D25862 llvm-svn: 284864
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp8
-rw-r--r--llvm/test/CodeGen/X86/bt.ll12
2 files changed, 20 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 28397d8648d..665ab04b6c6 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -15314,6 +15314,14 @@ static SDValue getBitTestCondition(SDValue Src, SDValue BitNo, ISD::CondCode CC,
if (Src.getValueType() == MVT::i8 || Src.getValueType() == MVT::i16)
Src = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::i32, Src);
+ // See if we can use the 32-bit instruction instead of the 64-bit one for a
+ // shorter encoding. Since the former takes the modulo 32 of BitNo and the
+ // latter takes the modulo 64, this is only valid if the 5th bit of BitNo is
+ // known to be zero.
+ if (Src.getValueType() == MVT::i64 &&
+ DAG.MaskedValueIsZero(BitNo, APInt(BitNo.getValueSizeInBits(), 32)))
+ Src = DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, Src);
+
// If the operand types disagree, extend the shift amount to match. Since
// BT ignores high bits (like shifts) we can use anyextend.
if (Src.getValueType() != BitNo.getValueType())
diff --git a/llvm/test/CodeGen/X86/bt.ll b/llvm/test/CodeGen/X86/bt.ll
index a6705088745..6576f33a5b9 100644
--- a/llvm/test/CodeGen/X86/bt.ll
+++ b/llvm/test/CodeGen/X86/bt.ll
@@ -596,3 +596,15 @@ define zeroext i1 @invert(i32 %flags, i32 %flag) nounwind {
ret i1 %tobool
}
+define zeroext i1 @extend(i32 %bit, i64 %bits) {
+; CHECK-LABEL: extend:
+; CHECK: # BB#0:
+; CHECK-NEXT: btl %edi, %esi
+entry:
+ %and = and i32 %bit, 31
+ %sh_prom = zext i32 %and to i64
+ %shl = shl i64 1, %sh_prom
+ %and1 = and i64 %shl, %bits
+ %tobool = icmp ne i64 %and1, 0
+ ret i1 %tobool
+}
OpenPOWER on IntegriCloud