diff options
author | Arnold Schwaighofer <aschwaighofer@apple.com> | 2013-05-14 00:21:18 +0000 |
---|---|---|
committer | Arnold Schwaighofer <aschwaighofer@apple.com> | 2013-05-14 00:21:18 +0000 |
commit | 123f18bcb9baeb6dc177cb642126a3a4d9ca8b43 (patch) | |
tree | 9b5dc23fc175739d0f3880d4f1327936d33a9c27 /test/Transforms | |
parent | dba53a8c9d4ece0bf44acbf5fce871f2e754d97d (diff) | |
download | external_llvm-123f18bcb9baeb6dc177cb642126a3a4d9ca8b43.zip external_llvm-123f18bcb9baeb6dc177cb642126a3a4d9ca8b43.tar.gz external_llvm-123f18bcb9baeb6dc177cb642126a3a4d9ca8b43.tar.bz2 |
LoopVectorize: Handle loops with multiple forward inductions
We used to give up if we saw two integer inductions. After this patch, we base
further induction variables on the chosen one like we do in the reverse
induction and pointer induction case.
Fixes PR15720.
radar://13851975
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@181746 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Transforms')
-rw-r--r-- | test/Transforms/LoopVectorize/induction.ll | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/test/Transforms/LoopVectorize/induction.ll b/test/Transforms/LoopVectorize/induction.ll new file mode 100644 index 0000000..48bb438 --- /dev/null +++ b/test/Transforms/LoopVectorize/induction.ll @@ -0,0 +1,30 @@ +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=2 -S | FileCheck %s + +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" + +; Make sure that we can handle multiple integer induction variables. +; CHECK: multi_int_induction +; CHECK: vector.body: +; CHECK: %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ] +; CHECK: %normalized.idx = sub i64 %index, 0 +; CHECK: %[[VAR:.*]] = trunc i64 %normalized.idx to i32 +; CHECK: %offset.idx = add i32 190, %[[VAR]] +define void @multi_int_induction(i32* %A, i32 %N) { +for.body.lr.ph: + br label %for.body + +for.body: + %indvars.iv = phi i64 [ 0, %for.body.lr.ph ], [ %indvars.iv.next, %for.body ] + %count.09 = phi i32 [ 190, %for.body.lr.ph ], [ %inc, %for.body ] + %arrayidx2 = getelementptr inbounds i32* %A, i64 %indvars.iv + store i32 %count.09, i32* %arrayidx2, align 4 + %inc = add nsw i32 %count.09, 1 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp ne i32 %lftr.wideiv, %N + br i1 %exitcond, label %for.body, label %for.end + +for.end: + ret void +} + |