diff options
author | Alexandros Lamprineas <alexandros.lamprineas@arm.com> | 2016-11-09 08:53:07 +0000 |
---|---|---|
committer | Alexandros Lamprineas <alexandros.lamprineas@arm.com> | 2016-11-09 08:53:07 +0000 |
commit | 0ee3ec2fe474d4746173518c96b4f8c894e21bf4 (patch) | |
tree | 9cbcb1b84ebd27a841fa64899a1cd23be50c1a57 /llvm/test/Transforms/LoopStrengthReduce | |
parent | 8530137de5577bb0d77adeb853261a005ee10207 (diff) | |
download | bcm5719-llvm-0ee3ec2fe474d4746173518c96b4f8c894e21bf4.tar.gz bcm5719-llvm-0ee3ec2fe474d4746173518c96b4f8c894e21bf4.zip |
[ARM] Loop Strength Reduction crashes when targeting ARM or Thumb.
Scalar Evolution asserts when not all the operands of an Add Recurrence
Expression are loop invariants. Loop Strength Reduction should only
create affine Add Recurrences, so that both the start and the step of
the expression are loop invariants.
Differential Revision: https://reviews.llvm.org/D26185
llvm-svn: 286347
Diffstat (limited to 'llvm/test/Transforms/LoopStrengthReduce')
-rw-r--r-- | llvm/test/Transforms/LoopStrengthReduce/ARM/addrec-is-loop-invariant.ll | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/llvm/test/Transforms/LoopStrengthReduce/ARM/addrec-is-loop-invariant.ll b/llvm/test/Transforms/LoopStrengthReduce/ARM/addrec-is-loop-invariant.ll new file mode 100644 index 00000000000..261c3cceed6 --- /dev/null +++ b/llvm/test/Transforms/LoopStrengthReduce/ARM/addrec-is-loop-invariant.ll @@ -0,0 +1,35 @@ +; RUN: llc -mtriple=armv8-eabi -verify-machineinstrs %s -o /dev/null + +; This test ensures that Loop Strength Reduction will +; not create an Add Reccurence Expression if not all +; its operands are loop invariants. + +define void @add_rec_expr() { +entry: + br label %loop0 + +loop0: + %c.0 = phi i32 [ 0, %entry ], [ %inc.0, %loop0 ] + %inc.0 = add nuw i32 %c.0, 1 + br i1 undef, label %loop0, label %bb1 + +bb1: + %mul.0 = mul i32 %c.0, %c.0 + %gelptr.0 = getelementptr inbounds i16, i16* undef, i32 %mul.0 + br label %loop1 + +loop1: + %inc.1 = phi i32 [ %inc.2, %bb4 ], [ 0, %bb1 ] + %mul.1 = mul i32 %inc.1, %c.0 + br label %bb3 + +bb3: + %add.0 = add i32 undef, %mul.1 + %gelptr.1 = getelementptr inbounds i16, i16* %gelptr.0, i32 %add.0 + store i16 undef, i16* %gelptr.1, align 2 + br label %bb4 + +bb4: + %inc.2 = add nuw i32 %inc.1, 1 + br label %loop1 +} |