summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/ARM64
diff options
context:
space:
mode:
authorAdam Nemet <anemet@apple.com>2014-05-12 23:00:03 +0000
committerAdam Nemet <anemet@apple.com>2014-05-12 23:00:03 +0000
commit5d78558c2b99c7eb417c64c93c4ea368b3930d4b (patch)
treed49776988f039eaa22f636e27c302fd3d96faada /llvm/test/CodeGen/ARM64
parentb51d6081f38e800c234a5f7d9052fc8231ae00d4 (diff)
downloadbcm5719-llvm-5d78558c2b99c7eb417c64c93c4ea368b3930d4b.tar.gz
bcm5719-llvm-5d78558c2b99c7eb417c64c93c4ea368b3930d4b.zip
[DAGCombiner] Split up an indexed load if only the base pointer value is live
Right now the load may not get DCE'd because of the side-effect of updating the base pointer. This can happen if we lower a read-modify-write of an illegal larger type (e.g. i48) such that the modification only affects one of the subparts (the lower i32 part but not the higher i16 part). See the testcase. In order to spot the dead load we need to revisit it when SimplifyDemandedBits decided that the value of the load is masked off. This is the CommitTargetLoweringOpt piece. I checked compile time with ARM64 by sending SPEC bitcode files through llc. No measurable change. Fixes <rdar://problem/16031651> llvm-svn: 208640
Diffstat (limited to 'llvm/test/CodeGen/ARM64')
-rw-r--r--llvm/test/CodeGen/ARM64/dagcombiner-dead-indexed-load.ll29
1 files changed, 29 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/ARM64/dagcombiner-dead-indexed-load.ll b/llvm/test/CodeGen/ARM64/dagcombiner-dead-indexed-load.ll
new file mode 100644
index 00000000000..2cf01357324
--- /dev/null
+++ b/llvm/test/CodeGen/ARM64/dagcombiner-dead-indexed-load.ll
@@ -0,0 +1,29 @@
+; RUN: llc -mcpu=cyclone < %s | FileCheck %s
+
+target datalayout = "e-i64:64-n32:64-S128"
+target triple = "arm64-apple-ios"
+
+%"struct.SU" = type { i32, %"struct.SU"*, i32*, i32, i32, %"struct.BO", i32, [5 x i8] }
+%"struct.BO" = type { %"struct.RE" }
+
+%"struct.RE" = type { i32, i32, i32, i32 }
+
+; This is a read-modify-write of some bifields combined into an i48. It gets
+; legalized into i32 and i16 accesses. Only a single store of zero to the low
+; i32 part should be live.
+
+; CHECK-LABEL: test:
+; CHECK-NOT: ldr
+; CHECK: str wzr
+; CHECK-NOT: str
+define void @test(%"struct.SU"* nocapture %su) {
+entry:
+ %r1 = getelementptr inbounds %"struct.SU"* %su, i64 1, i32 5
+ %r2 = bitcast %"struct.BO"* %r1 to i48*
+ %r3 = load i48* %r2, align 8
+ %r4 = and i48 %r3, -4294967296
+ %r5 = or i48 0, %r4
+ store i48 %r5, i48* %r2, align 8
+
+ ret void
+}
OpenPOWER on IntegriCloud