diff options
| author | Juergen Ributzka <juergen@apple.com> | 2013-08-21 21:53:38 +0000 |
|---|---|---|
| committer | Juergen Ributzka <juergen@apple.com> | 2013-08-21 21:53:38 +0000 |
| commit | 3db39dc1ae6f27f10bd7bed91d40048b71c3ffc0 (patch) | |
| tree | 265413c982f8a44f9a73be8d0a9cdb485bf6ef01 /llvm/test/CodeGen | |
| parent | d6d1a9859e142f7b67b49087b9649754a6a6b5cf (diff) | |
| download | bcm5719-llvm-3db39dc1ae6f27f10bd7bed91d40048b71c3ffc0.tar.gz bcm5719-llvm-3db39dc1ae6f27f10bd7bed91d40048b71c3ffc0.zip | |
Teach BaseIndexOffset::match to identify base pointers in loops.
The small utility function that pattern matches Base + Index +
Offset patterns for loads and stores fails to recognize the base
pointer for loads/stores from/into an array at offset 0 inside a
loop. As a result DAGCombiner::MergeConsecutiveStores was not able
to merge all stores.
This commit fixes the issue by adding an additional pattern match
and also a test case.
Reviewer: Nadav
llvm-svn: 188936
Diffstat (limited to 'llvm/test/CodeGen')
| -rw-r--r-- | llvm/test/CodeGen/X86/merge_store.ll | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/X86/merge_store.ll b/llvm/test/CodeGen/X86/merge_store.ll new file mode 100644 index 00000000000..940688c6252 --- /dev/null +++ b/llvm/test/CodeGen/X86/merge_store.ll @@ -0,0 +1,30 @@ +; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 | FileCheck %s + +define void @merge_store(i32* nocapture %a) { +; CHECK-LABEL: merge_store: +; CHECK: movq +; CHECK: movq +entry: + br label %for.body + + for.body: + %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] + %arrayidx = getelementptr inbounds i32* %a, i64 %indvars.iv + store i32 1, i32* %arrayidx, align 4 + %0 = or i64 %indvars.iv, 1 + %arrayidx2 = getelementptr inbounds i32* %a, i64 %0 + store i32 1, i32* %arrayidx2, align 4 + %1 = or i64 %indvars.iv, 2 + %arrayidx5 = getelementptr inbounds i32* %a, i64 %1 + store i32 1, i32* %arrayidx5, align 4 + %2 = or i64 %indvars.iv, 3 + %arrayidx8 = getelementptr inbounds i32* %a, i64 %2 + store i32 1, i32* %arrayidx8, align 4 + %indvars.iv.next = add nuw nsw i64 %indvars.iv, 4 + %3 = trunc i64 %indvars.iv.next to i32 + %cmp = icmp slt i32 %3, 1000 + br i1 %cmp, label %for.body, label %for.end + + for.end: + ret void +} |

