summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/X86
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@intel.com>2019-02-20 19:02:01 +0000
committerCraig Topper <craig.topper@intel.com>2019-02-20 19:02:01 +0000
commitb1b2fa35ed7f673188ce760d2cc8f679045b32d9 (patch)
tree9eab2f5c0379ca28ca77f1ccc916ab480f690548 /llvm/test/CodeGen/X86
parente4a7a461514ad8ab1ade40b05156c764fa90e724 (diff)
downloadbcm5719-llvm-b1b2fa35ed7f673188ce760d2cc8f679045b32d9.tar.gz
bcm5719-llvm-b1b2fa35ed7f673188ce760d2cc8f679045b32d9.zip
[X86] Add test case to show missed opportunity to remove an explicit AND on the bit position from BT when it has known zeros. NFC
If the bit position has known zeros in it, then the AND immediate will likely be optimized to remove bits. This can prevent GetDemandedBits from recognizing that the AND is unnecessary. llvm-svn: 354501
Diffstat (limited to 'llvm/test/CodeGen/X86')
-rw-r--r--llvm/test/CodeGen/X86/bt.ll31
1 files changed, 31 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/X86/bt.ll b/llvm/test/CodeGen/X86/bt.ll
index 7f6fbba9e3b..4db9be7d0f1 100644
--- a/llvm/test/CodeGen/X86/bt.ll
+++ b/llvm/test/CodeGen/X86/bt.ll
@@ -1144,3 +1144,34 @@ define void @demanded_i32(i32* nocapture readonly, i32* nocapture, i32) nounwind
; <label>:16:
ret void
}
+
+; Make sure we can simplify bt when the shift amount has known zeros in it
+; which cause the and mask to have bits removed.
+define zeroext i1 @demanded_with_known_zeroes(i32 %bit, i32 %bits) {
+; X86-LABEL: demanded_with_known_zeroes:
+; X86: # %bb.0: # %entry
+; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: movb {{[0-9]+}}(%esp), %cl
+; X86-NEXT: shlb $2, %cl
+; X86-NEXT: andb $28, %cl
+; X86-NEXT: movzbl %cl, %ecx
+; X86-NEXT: btl %ecx, %eax
+; X86-NEXT: setb %al
+; X86-NEXT: retl
+;
+; X64-LABEL: demanded_with_known_zeroes:
+; X64: # %bb.0: # %entry
+; X64-NEXT: shlb $2, %dil
+; X64-NEXT: andb $28, %dil
+; X64-NEXT: movzbl %dil, %eax
+; X64-NEXT: btl %eax, %esi
+; X64-NEXT: setb %al
+; X64-NEXT: retq
+entry:
+ %bit2 = shl i32 %bit, 2
+ %and = and i32 %bit2, 31
+ %shl = shl i32 1, %and
+ %and1 = and i32 %shl, %bits
+ %tobool = icmp ne i32 %and1, 0
+ ret i1 %tobool
+}
OpenPOWER on IntegriCloud