summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/ARM64/bitfield-extract.ll
diff options
context:
space:
mode:
authorWeiming Zhao <weimingz@codeaurora.org>2014-04-30 21:07:24 +0000
committerWeiming Zhao <weimingz@codeaurora.org>2014-04-30 21:07:24 +0000
commit7f6daf1799a0dc93e37edc4d83ba4ef7c184e3a6 (patch)
treedb7cc9066440bf1a9e4106da6c979e0ecdae8272 /llvm/test/CodeGen/ARM64/bitfield-extract.ll
parentdd2647edcf99a9e7b1af9b407ff1489b4ee45739 (diff)
downloadbcm5719-llvm-7f6daf1799a0dc93e37edc4d83ba4ef7c184e3a6.tar.gz
bcm5719-llvm-7f6daf1799a0dc93e37edc4d83ba4ef7c184e3a6.zip
[ARM64] Prevent bit extraction to be adjusted by following shift
For pattern like ((x >> C1) & Mask) << C2, DAG combiner may convert it into (x >> (C1-C2)) & (Mask << C2), which makes pattern matching of ubfx more difficult. For example: Given %shr = lshr i64 %x, 4 %and = and i64 %shr, 15 %arrayidx = getelementptr inbounds [8 x [64 x i64]]* @arr, i64 0, %i64 2, i64 %and %0 = load i64* %arrayidx With current shift folding, it takes 3 instrs to compute base address: lsr x8, x0, #1 and x8, x8, #0x78 add x8, x9, x8 If using ubfx, it only needs 2 instrs: ubfx x8, x0, #4, #4 add x8, x9, x8, lsl #3 This fixes bug 19589 llvm-svn: 207702
Diffstat (limited to 'llvm/test/CodeGen/ARM64/bitfield-extract.ll')
-rw-r--r--llvm/test/CodeGen/ARM64/bitfield-extract.ll13
1 files changed, 13 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/ARM64/bitfield-extract.ll b/llvm/test/CodeGen/ARM64/bitfield-extract.ll
index 6de563c1eb6..3ea6d938e9d 100644
--- a/llvm/test/CodeGen/ARM64/bitfield-extract.ll
+++ b/llvm/test/CodeGen/ARM64/bitfield-extract.ll
@@ -501,6 +501,19 @@ end:
ret i80 %conv3
}
+; Check if we can still catch UBFX when "AND" is used by SHL.
+; CHECK-LABEL: fct21:
+; CHECK: ubfx
+@arr = external global [8 x [64 x i64]]
+define i64 @fct21(i64 %x) {
+entry:
+ %shr = lshr i64 %x, 4
+ %and = and i64 %shr, 15
+ %arrayidx = getelementptr inbounds [8 x [64 x i64]]* @arr, i64 0, i64 0, i64 %and
+ %0 = load i64* %arrayidx, align 8
+ ret i64 %0
+}
+
define i16 @test_ignored_rightbits(i32 %dst, i32 %in) {
; CHECK-LABEL: test_ignored_rightbits:
OpenPOWER on IntegriCloud