summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorKyle Butt <kyle+llvm@iteratee.net>2016-06-23 21:40:35 +0000
committerKyle Butt <kyle+llvm@iteratee.net>2016-06-23 21:40:35 +0000
commit991df7889b26013a401afe1c1e73743d3016cc59 (patch)
tree79e1705a6e3935001b8b8bb9f653c3a85e9f715b /llvm/test
parent178314ab521cd6da4d16707315b79d96247e7479 (diff)
downloadbcm5719-llvm-991df7889b26013a401afe1c1e73743d3016cc59.tar.gz
bcm5719-llvm-991df7889b26013a401afe1c1e73743d3016cc59.zip
Codegen: [X86] preservere memory refs for folded umul_lohi
Memory references were not being propagated for this folded load. This prevented optimizations like LICM from hoisting the load. Added test to verify that this allows LICM to proceed. llvm-svn: 273617
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/CodeGen/X86/hoist-invariant-load.ll33
1 files changed, 32 insertions, 1 deletions
diff --git a/llvm/test/CodeGen/X86/hoist-invariant-load.ll b/llvm/test/CodeGen/X86/hoist-invariant-load.ll
index f9c62e42f0e..5ade5b470b5 100644
--- a/llvm/test/CodeGen/X86/hoist-invariant-load.ll
+++ b/llvm/test/CodeGen/X86/hoist-invariant-load.ll
@@ -1,7 +1,10 @@
; REQUIRES: asserts
-; RUN: llc < %s -stats -O2 2>&1 | grep "2 machine-licm"
+; RUN: llc -mcpu=haswell < %s -stats -O2 2>&1 | grep "4 machine-licm.*hoisted"
+; For test:
; 2 invariant loads, 1 for OBJC_SELECTOR_REFERENCES_
; and 1 for objc_msgSend from the GOT
+; For test_multi_def:
+; 2 invariant load (full multiply, both loads should be hoisted.)
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.7.2"
@@ -29,4 +32,32 @@ for.end: ; preds = %for.body
declare i8* @objc_msgSend(i8*, i8*, ...) nonlazybind
+define void @test_multi_def(i64* dereferenceable(8) %x1,
+ i64* dereferenceable(8) %x2,
+ i128* %y, i64 %count) nounwind {
+entry:
+ br label %for.body
+
+for.check:
+ %inc = add nsw i64 %i, 1
+ %done = icmp sge i64 %inc, %count
+ br i1 %done, label %exit, label %for.body
+
+for.body:
+ %i = phi i64 [ 0, %entry ], [ %inc, %for.check ]
+ %x1_load = load i64, i64* %x1, align 8, !invariant.load !0
+ %x1_zext = zext i64 %x1_load to i128
+ %x2_load = load i64, i64* %x2, align 8, !invariant.load !0
+ %x2_zext = zext i64 %x2_load to i128
+ %x_prod = mul i128 %x1_zext, %x2_zext
+ %y_elem = getelementptr inbounds i128, i128* %y, i64 %i
+ %y_load = load i128, i128* %y_elem, align 8
+ %y_plus = add i128 %x_prod, %y_load
+ store i128 %y_plus, i128* %y_elem, align 8
+ br label %for.check
+
+exit:
+ ret void
+}
+
!0 = !{}
OpenPOWER on IntegriCloud