[polly] Fix SCEVLoopAddRecRewriter to avoid invalid AddRecs.
When we're remapping an AddRec, the AddRec constructed by a partial
rewrite might not make sense. This triggers an assertion complaining
it's not loop-invariant.
Instead of constructing the partially rewritten AddRec, just skip
straight to calling evaluateAtIteration.
Testcase was automatically reduced using llvm-reduce, so it's a little
messy, but hopefully makes sense.
Differential Revision: https://reviews.llvm.org/D102959
GitOrigin-RevId: fd229caa0138d296090c101655c82ca7da58ddd6
diff --git a/test/Isl/CodeGen/OpenMP/scev-rewriting.ll b/test/Isl/CodeGen/OpenMP/scev-rewriting.ll
new file mode 100644
index 0000000..13fffa3
--- /dev/null
+++ b/test/Isl/CodeGen/OpenMP/scev-rewriting.ll
@@ -0,0 +1,56 @@
+; RUN: opt < %s -polly-vectorizer=polly -polly-parallel -polly-parallel-force -polly-process-unprofitable -polly-codegen -S | FileCheck %s
+; CHECK: define internal void @DoStringSort_polly_subfn
+target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
+target triple = "aarch64-unknown-linux-gnueabi"
+
+define void @DoStringSort() {
+bb:
+ br label %bb1
+
+bb1: ; preds = %bb1, %bb
+ %i = phi i32 [ 0, %bb ], [ %i2, %bb1 ]
+ %i2 = add i32 %i, 1
+ br i1 undef, label %bb1, label %bb3
+
+bb3: ; preds = %bb1
+ br i1 undef, label %bb6, label %bb4
+
+bb4: ; preds = %bb3
+ %i5 = bitcast i8* undef to i32*
+ br label %bb6
+
+bb6: ; preds = %bb4, %bb3
+ %i7 = phi i32* [ %i5, %bb4 ], [ undef, %bb3 ]
+ br i1 undef, label %bb21, label %bb8
+
+bb8: ; preds = %bb20, %bb6
+ %i9 = phi i32* [ %i7, %bb6 ], [ %i10, %bb20 ]
+ %i10 = getelementptr inbounds i32, i32* %i9, i32 %i2
+ br i1 undef, label %bb11, label %bb20
+
+bb11: ; preds = %bb8
+ br label %bb12
+
+bb12: ; preds = %bb11
+ br label %bb13
+
+bb13: ; preds = %bb12
+ br label %bb14
+
+bb14: ; preds = %bb14, %bb13
+ %i15 = phi i32 [ %i17, %bb14 ], [ 1, %bb13 ]
+ %i16 = getelementptr inbounds i32, i32* %i9, i32 %i15
+ store i32 undef, i32* %i16, align 4
+ %i17 = add i32 %i15, 1
+ %i18 = icmp eq i32 %i15, %i
+ br i1 %i18, label %bb19, label %bb14
+
+bb19: ; preds = %bb14
+ br label %bb20
+
+bb20: ; preds = %bb19, %bb8
+ br i1 undef, label %bb21, label %bb8
+
+bb21: ; preds = %bb20, %bb6
+ unreachable
+}