summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorNirav Dave <niravd@google.com>2017-05-10 19:53:41 +0000
committerNirav Dave <niravd@google.com>2017-05-10 19:53:41 +0000
commita38c049fc5c7db8e48c5f57122f62a8d62ea467b (patch)
treef53bd3be9f986d98742c0d89f3fc5c3d30aa7219 /llvm/test
parentf69a7c306bd81d189b0d9441af311dd52ea3dd36 (diff)
downloadbcm5719-llvm-a38c049fc5c7db8e48c5f57122f62a8d62ea467b.tar.gz
bcm5719-llvm-a38c049fc5c7db8e48c5f57122f62a8d62ea467b.zip
[SDAG] Relax conditions under stores of loaded values can be merged
Summary: Allow consecutive stores whose values come from consecutive loads to merged in the presense of other uses of the loads. Previously this was disallowed as in general the merged load cannot be shared with the other uses. Merging N stores into 1 may cause as many as N redundant loads. However in the context of caching this should have neglible affect on memory pressure and reduce instruction count making it almost always a win. Fixes PR32086. Reviewers: spatel, jyknight, andreadb, hfinkel, efriedma Reviewed By: efriedma Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D30471 llvm-svn: 302712
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/CodeGen/X86/merge_store_duplicated_loads.ll28
1 files changed, 10 insertions, 18 deletions
diff --git a/llvm/test/CodeGen/X86/merge_store_duplicated_loads.ll b/llvm/test/CodeGen/X86/merge_store_duplicated_loads.ll
index cfc39035e40..9303d1dfabd 100644
--- a/llvm/test/CodeGen/X86/merge_store_duplicated_loads.ll
+++ b/llvm/test/CodeGen/X86/merge_store_duplicated_loads.ll
@@ -1,18 +1,15 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc %s -mtriple=x86_64-unknown-linux-gnu -mcpu=corei7 -o - | FileCheck %s
-
+; PR32086
target triple = "x86_64-unknown-linux-gnu"
define void @merge_double(double* noalias nocapture %st, double* noalias nocapture readonly %ld) #0 {
; CHECK-LABEL: merge_double:
; CHECK: # BB#0:
-; CHECK-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
-; CHECK-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero
-; CHECK-NEXT: movsd %xmm0, (%rdi)
-; CHECK-NEXT: movsd %xmm1, 8(%rdi)
-; CHECK-NEXT: movsd %xmm0, 16(%rdi)
-; CHECK-NEXT: movsd %xmm1, 24(%rdi)
+; CHECK-NEXT: movups (%rsi), %xmm0
+; CHECK-NEXT: movups %xmm0, (%rdi)
+; CHECK-NEXT: movups %xmm0, 16(%rdi)
; CHECK-NEXT: retq
%ld_idx1 = getelementptr inbounds double, double* %ld, i64 1
%ld0 = load double, double* %ld, align 8, !tbaa !2
@@ -32,12 +29,9 @@ define void @merge_double(double* noalias nocapture %st, double* noalias nocaptu
define void @merge_loadstore_int(i64* noalias nocapture readonly %p, i64* noalias nocapture %q) local_unnamed_addr #0 {
; CHECK-LABEL: merge_loadstore_int:
; CHECK: # BB#0: # %entry
-; CHECK-NEXT: movq (%rdi), %rax
-; CHECK-NEXT: movq 8(%rdi), %rcx
-; CHECK-NEXT: movq %rax, (%rsi)
-; CHECK-NEXT: movq %rcx, 8(%rsi)
-; CHECK-NEXT: movq %rax, 16(%rsi)
-; CHECK-NEXT: movq %rcx, 24(%rsi)
+; CHECK-NEXT: movups (%rdi), %xmm0
+; CHECK-NEXT: movups %xmm0, (%rsi)
+; CHECK-NEXT: movups %xmm0, 16(%rsi)
; CHECK-NEXT: retq
entry:
%0 = load i64, i64* %p, align 8, !tbaa !1
@@ -57,11 +51,9 @@ define i64 @merge_loadstore_int_with_extra_use(i64* noalias nocapture readonly %
; CHECK-LABEL: merge_loadstore_int_with_extra_use:
; CHECK: # BB#0: # %entry
; CHECK-NEXT: movq (%rdi), %rax
-; CHECK-NEXT: movq 8(%rdi), %rcx
-; CHECK-NEXT: movq %rax, (%rsi)
-; CHECK-NEXT: movq %rcx, 8(%rsi)
-; CHECK-NEXT: movq %rax, 16(%rsi)
-; CHECK-NEXT: movq %rcx, 24(%rsi)
+; CHECK-NEXT: movups (%rdi), %xmm0
+; CHECK-NEXT: movups %xmm0, (%rsi)
+; CHECK-NEXT: movups %xmm0, 16(%rsi)
; CHECK-NEXT: retq
entry:
%0 = load i64, i64* %p, align 8, !tbaa !1
OpenPOWER on IntegriCloud