[llvm] b299926 - [IndVars] Fix sort comparator.
Eli Friedman via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 27 17:25:42 PST 2020
Author: Eli Friedman
Date: 2020-02-27T17:25:18-08:00
New Revision: b2999264536776aa3c09577290ebf21643bdc492
URL: https://github.com/llvm/llvm-project/commit/b2999264536776aa3c09577290ebf21643bdc492
DIFF: https://github.com/llvm/llvm-project/commit/b2999264536776aa3c09577290ebf21643bdc492.diff
LOG: [IndVars] Fix sort comparator.
std::sort will compare an element to itself in some cases. We should
not crash if this happens.
Differential Revision: https://reviews.llvm.org/D75000
Added:
Modified:
llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
llvm/test/Transforms/IndVarSimplify/eliminate-exit.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
index b8a4705d06c8..f843c80039bf 100644
--- a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
+++ b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
@@ -2391,6 +2391,7 @@ bool IndVarSimplify::optimizeLoopExits(Loop *L, SCEVExpander &Rewriter) {
[&](BasicBlock *A, BasicBlock *B) {
// std::sort sorts in ascending order, so we want the inverse of
// the normal dominance relation.
+ if (A == B) return false;
if (DT->properlyDominates(A, B)) return true;
if (DT->properlyDominates(B, A)) return false;
llvm_unreachable("expected total dominance order!");
diff --git a/llvm/test/Transforms/IndVarSimplify/eliminate-exit.ll b/llvm/test/Transforms/IndVarSimplify/eliminate-exit.ll
index 726f3cd7f2f2..ddf8ada68e95 100644
--- a/llvm/test/Transforms/IndVarSimplify/eliminate-exit.ll
+++ b/llvm/test/Transforms/IndVarSimplify/eliminate-exit.ll
@@ -220,4 +220,219 @@ exit:
ret void
}
+define void @many_exits([100 x i64] %len) {
+entry:
+ br label %loop
+loop:
+ %iv = phi i64 [0, %entry], [%iv.next, %backedge]
+ %len0 = extractvalue [100 x i64] %len, 0
+ %early0 = icmp eq i64 %iv, %len0
+ call void @side_effect()
+ br i1 %early0, label %exit, label %cont0
+cont0:
+ %len1 = extractvalue [100 x i64] %len, 1
+ %early1 = icmp eq i64 %iv, %len1
+ call void @side_effect()
+ br i1 %early1, label %exit, label %cont1
+cont1:
+ %len2 = extractvalue [100 x i64] %len, 2
+ %early2 = icmp eq i64 %iv, %len2
+ call void @side_effect()
+ br i1 %early2, label %exit, label %cont2
+cont2:
+ %len3 = extractvalue [100 x i64] %len, 3
+ %early3 = icmp eq i64 %iv, %len3
+ call void @side_effect()
+ br i1 %early3, label %exit, label %cont3
+cont3:
+ %len4 = extractvalue [100 x i64] %len, 4
+ %early4 = icmp eq i64 %iv, %len4
+ call void @side_effect()
+ br i1 %early4, label %exit, label %cont4
+cont4:
+ %len5 = extractvalue [100 x i64] %len, 5
+ %early5 = icmp eq i64 %iv, %len5
+ call void @side_effect()
+ br i1 %early5, label %exit, label %cont5
+cont5:
+ %len6 = extractvalue [100 x i64] %len, 6
+ %early6 = icmp eq i64 %iv, %len6
+ call void @side_effect()
+ br i1 %early6, label %exit, label %cont6
+cont6:
+ %len7 = extractvalue [100 x i64] %len, 7
+ %early7 = icmp eq i64 %iv, %len7
+ call void @side_effect()
+ br i1 %early7, label %exit, label %cont7
+cont7:
+ %len8 = extractvalue [100 x i64] %len, 8
+ %early8 = icmp eq i64 %iv, %len8
+ call void @side_effect()
+ br i1 %early8, label %exit, label %cont8
+cont8:
+ %len9 = extractvalue [100 x i64] %len, 9
+ %early9 = icmp eq i64 %iv, %len9
+ call void @side_effect()
+ br i1 %early9, label %exit, label %cont9
+cont9:
+ %len10 = extractvalue [100 x i64] %len, 10
+ %early10 = icmp eq i64 %iv, %len10
+ call void @side_effect()
+ br i1 %early10, label %exit, label %cont10
+cont10:
+ %len11 = extractvalue [100 x i64] %len, 11
+ %early11 = icmp eq i64 %iv, %len11
+ call void @side_effect()
+ br i1 %early11, label %exit, label %cont11
+cont11:
+ %len12 = extractvalue [100 x i64] %len, 12
+ %early12 = icmp eq i64 %iv, %len12
+ call void @side_effect()
+ br i1 %early12, label %exit, label %cont12
+cont12:
+ %len13 = extractvalue [100 x i64] %len, 13
+ %early13 = icmp eq i64 %iv, %len13
+ call void @side_effect()
+ br i1 %early13, label %exit, label %cont13
+cont13:
+ %len14 = extractvalue [100 x i64] %len, 14
+ %early14 = icmp eq i64 %iv, %len14
+ call void @side_effect()
+ br i1 %early14, label %exit, label %cont14
+cont14:
+ %len15 = extractvalue [100 x i64] %len, 15
+ %early15 = icmp eq i64 %iv, %len15
+ call void @side_effect()
+ br i1 %early15, label %exit, label %cont15
+cont15:
+ %len16 = extractvalue [100 x i64] %len, 16
+ %early16 = icmp eq i64 %iv, %len16
+ call void @side_effect()
+ br i1 %early16, label %exit, label %cont16
+cont16:
+ %len17 = extractvalue [100 x i64] %len, 17
+ %early17 = icmp eq i64 %iv, %len17
+ call void @side_effect()
+ br i1 %early17, label %exit, label %cont17
+cont17:
+ %len18 = extractvalue [100 x i64] %len, 18
+ %early18 = icmp eq i64 %iv, %len18
+ call void @side_effect()
+ br i1 %early18, label %exit, label %cont18
+cont18:
+ %len19 = extractvalue [100 x i64] %len, 19
+ %early19 = icmp eq i64 %iv, %len19
+ call void @side_effect()
+ br i1 %early19, label %exit, label %cont19
+cont19:
+ %len20 = extractvalue [100 x i64] %len, 20
+ %early20 = icmp eq i64 %iv, %len20
+ call void @side_effect()
+ br i1 %early20, label %exit, label %cont20
+cont20:
+ %len21 = extractvalue [100 x i64] %len, 21
+ %early21 = icmp eq i64 %iv, %len21
+ call void @side_effect()
+ br i1 %early21, label %exit, label %cont21
+cont21:
+ %len22 = extractvalue [100 x i64] %len, 22
+ %early22 = icmp eq i64 %iv, %len22
+ call void @side_effect()
+ br i1 %early22, label %exit, label %cont22
+cont22:
+ %len23 = extractvalue [100 x i64] %len, 23
+ %early23 = icmp eq i64 %iv, %len23
+ call void @side_effect()
+ br i1 %early23, label %exit, label %cont23
+cont23:
+ %len24 = extractvalue [100 x i64] %len, 24
+ %early24 = icmp eq i64 %iv, %len24
+ call void @side_effect()
+ br i1 %early24, label %exit, label %cont24
+cont24:
+ %len25 = extractvalue [100 x i64] %len, 25
+ %early25 = icmp eq i64 %iv, %len25
+ call void @side_effect()
+ br i1 %early25, label %exit, label %cont25
+cont25:
+ %len26 = extractvalue [100 x i64] %len, 26
+ %early26 = icmp eq i64 %iv, %len26
+ call void @side_effect()
+ br i1 %early26, label %exit, label %cont26
+cont26:
+ %len27 = extractvalue [100 x i64] %len, 27
+ %early27 = icmp eq i64 %iv, %len27
+ call void @side_effect()
+ br i1 %early27, label %exit, label %cont27
+cont27:
+ %len28 = extractvalue [100 x i64] %len, 28
+ %early28 = icmp eq i64 %iv, %len28
+ call void @side_effect()
+ br i1 %early28, label %exit, label %cont28
+cont28:
+ %len29 = extractvalue [100 x i64] %len, 29
+ %early29 = icmp eq i64 %iv, %len29
+ call void @side_effect()
+ br i1 %early29, label %exit, label %cont29
+cont29:
+ %len30 = extractvalue [100 x i64] %len, 30
+ %early30 = icmp eq i64 %iv, %len30
+ call void @side_effect()
+ br i1 %early30, label %exit, label %cont30
+cont30:
+ %len31 = extractvalue [100 x i64] %len, 31
+ %early31 = icmp eq i64 %iv, %len31
+ call void @side_effect()
+ br i1 %early31, label %exit, label %cont31
+cont31:
+ %len32 = extractvalue [100 x i64] %len, 32
+ %early32 = icmp eq i64 %iv, %len32
+ call void @side_effect()
+ br i1 %early32, label %exit, label %cont32
+cont32:
+ %len33 = extractvalue [100 x i64] %len, 33
+ %early33 = icmp eq i64 %iv, %len33
+ call void @side_effect()
+ br i1 %early33, label %exit, label %cont33
+cont33:
+ %len34 = extractvalue [100 x i64] %len, 34
+ %early34 = icmp eq i64 %iv, %len34
+ call void @side_effect()
+ br i1 %early34, label %exit, label %cont34
+cont34:
+ %len35 = extractvalue [100 x i64] %len, 35
+ %early35 = icmp eq i64 %iv, %len35
+ call void @side_effect()
+ br i1 %early35, label %exit, label %cont35
+cont35:
+ %len36 = extractvalue [100 x i64] %len, 36
+ %early36 = icmp eq i64 %iv, %len36
+ call void @side_effect()
+ br i1 %early36, label %exit, label %cont36
+cont36:
+ %len37 = extractvalue [100 x i64] %len, 37
+ %early37 = icmp eq i64 %iv, %len37
+ call void @side_effect()
+ br i1 %early37, label %exit, label %cont37
+cont37:
+ %len38 = extractvalue [100 x i64] %len, 38
+ %early38 = icmp eq i64 %iv, %len38
+ call void @side_effect()
+ br i1 %early38, label %exit, label %cont38
+cont38:
+ %len39 = extractvalue [100 x i64] %len, 39
+ %early39 = icmp eq i64 %iv, %len39
+ call void @side_effect()
+ br i1 %early39, label %exit, label %cont39
+cont39:
+ br label %backedge
+backedge:
+ call void @side_effect()
+ %cmp2 = icmp ult i64 %iv, 999
+ %iv.next = add i64 %iv, 1
+ br i1 %cmp2, label %loop, label %exit
+exit:
+ ret void
+}
+
declare void @side_effect()
More information about the llvm-commits
mailing list