From: luxufan Date: Fri, 11 Nov 2022 13:21:45 +0000 (+0800) Subject: [LoopFlatten] Forget all block and loop dispositions after flatten X-Git-Tag: upstream/17.0.6~27800 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=98eb9179398d1e69e1f4416b1ef3bf308171684b;p=platform%2Fupstream%2Fllvm.git [LoopFlatten] Forget all block and loop dispositions after flatten Method forgetLoop only forgets expression of phi or its users. SCEV expressions except the above mentioned may still has loop dispositions that point to the destroyed loop, which might cause a crash. Fixes: https://github.com/llvm/llvm-project/issues/58865 Reviewed By: nikic, fhahn Differential Revision: https://reviews.llvm.org/D137651 --- diff --git a/llvm/lib/Transforms/Scalar/LoopFlatten.cpp b/llvm/lib/Transforms/Scalar/LoopFlatten.cpp index c530e77..7388c3a 100644 --- a/llvm/lib/Transforms/Scalar/LoopFlatten.cpp +++ b/llvm/lib/Transforms/Scalar/LoopFlatten.cpp @@ -762,6 +762,7 @@ static bool DoFlattenLoopPair(FlattenInfo &FI, DominatorTree *DT, LoopInfo *LI, // deleted, and any information that have about the outer loop invalidated. SE->forgetLoop(FI.OuterLoop); SE->forgetLoop(FI.InnerLoop); + SE->forgetBlockAndLoopDispositions(); if (U) U->markLoopAsDeleted(*FI.InnerLoop, FI.InnerLoop->getName()); LI->erase(FI.InnerLoop); diff --git a/llvm/test/Transforms/LoopFlatten/pr58865.ll b/llvm/test/Transforms/LoopFlatten/pr58865.ll new file mode 100644 index 0000000..984fd1f --- /dev/null +++ b/llvm/test/Transforms/LoopFlatten/pr58865.ll @@ -0,0 +1,51 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -loop-flatten -verify-scev -S < %s | FileCheck %s +; +define void @sum_2d(ptr %p) { +; CHECK-LABEL: @sum_2d( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[FLATTEN_TRIPCOUNT:%.*]] = mul i16 1, 1 +; CHECK-NEXT: br label [[OUTER:%.*]] +; CHECK: outer: +; CHECK-NEXT: [[SUM_04:%.*]] = phi i16 [ 0, [[ENTRY:%.*]] ], [ [[DOTLCSSA:%.*]], [[OUTER_LATCH:%.*]] ] +; CHECK-NEXT: [[OUTER_IV:%.*]] = phi i16 [ 0, [[ENTRY]] ], [ [[OUTER_IV_NEXT:%.*]], [[OUTER_LATCH]] ] +; CHECK-NEXT: br label [[INNER:%.*]] +; CHECK: inner: +; CHECK-NEXT: [[SUM_12:%.*]] = phi i16 [ [[SUM_04]], [[OUTER]] ] +; CHECK-NEXT: [[INNER_IV:%.*]] = phi i16 [ 0, [[OUTER]] ] +; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[P:%.*]], align 1 +; CHECK-NEXT: [[INNER_IV_NEXT:%.*]] = add nsw i16 [[INNER_IV]], 1 +; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i16 [[INNER_IV]], 0 +; CHECK-NEXT: br label [[OUTER_LATCH]] +; CHECK: outer.latch: +; CHECK-NEXT: [[DOTLCSSA]] = phi i16 [ [[TMP0]], [[INNER]] ] +; CHECK-NEXT: [[OUTER_IV_NEXT]] = add nsw i16 [[OUTER_IV]], 1 +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i16 [[OUTER_IV_NEXT]], [[FLATTEN_TRIPCOUNT]] +; CHECK-NEXT: br i1 [[CMP]], label [[OUTER]], label [[EXIT:%.*]] +; CHECK: exit: +; CHECK-NEXT: ret void +; +entry: + br label %outer + +outer: ; preds = %outer.latch, %entry + %sum.04 = phi i16 [ 0, %entry ], [ %0, %outer.latch ] + %outer.iv = phi i16 [ 0, %entry ], [ %outer.iv.next, %outer.latch ] + br label %inner + +inner: ; preds = %inner, %outer + %sum.12 = phi i16 [ %sum.04, %outer ], [ %0, %inner ] + %inner.iv = phi i16 [ 0, %outer ], [ %inner.iv.next, %inner ] + %0 = load i16, ptr %p, align 1 + %inner.iv.next = add nsw i16 %inner.iv, 1 + %cmp2 = icmp slt i16 %inner.iv, 0 + br i1 %cmp2, label %inner, label %outer.latch + +outer.latch: ; preds = %inner + %outer.iv.next = add nsw i16 %outer.iv, 1 + %cmp = icmp slt i16 %outer.iv.next, 0 + br i1 %cmp, label %outer, label %exit + +exit: ; preds = %outer.latch + ret void +}