1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00

[LoopLoadElim] Pass ScalarEvolution in old pass manager. PR49141

Loop canonicalization may end up deleting blocks from CFG. And
Scalar Evolution may still keep cached referenced to those blocks
unless updated properly.
This commit is contained in:
Max Kazantsev 2021-02-15 18:06:33 +07:00
parent dda4f352fa
commit 262e4a75c1
2 changed files with 37 additions and 1 deletions

View File

@ -664,10 +664,11 @@ public:
auto *BFI = (PSI && PSI->hasProfileSummary()) ?
&getAnalysis<LazyBlockFrequencyInfoPass>().getBFI() :
nullptr;
auto *SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
// Process each loop nest in the function.
return eliminateLoadsAcrossLoops(
F, LI, DT, BFI, PSI, /*SE*/ nullptr, /*AC*/ nullptr,
F, LI, DT, BFI, PSI, SE, /*AC*/ nullptr,
[&LAA](Loop &L) -> const LoopAccessInfo & { return LAA.getInfo(&L); });
}

View File

@ -0,0 +1,35 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -S -indvars -loop-load-elim < %s 2>&1 | FileCheck %s
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128-ni:1-p2:32:8:8:32-ni:2"
target triple = "x86_64-unknown-linux-gnu"
define void @test() {
; CHECK-LABEL: @test(
; CHECK-NEXT: entry:
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
; CHECK: for.body:
; CHECK-NEXT: [[A_01:%.*]] = phi i16 [ undef, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
; CHECK-NEXT: [[INC]] = add nsw i16 [[A_01]], 1
; CHECK-NEXT: [[CMP:%.*]] = icmp sle i16 [[INC]], 2
; CHECK-NEXT: [[OR_COND:%.*]] = and i1 false, [[CMP]]
; CHECK-NEXT: br i1 [[OR_COND]], label [[FOR_BODY]], label [[FOR_END:%.*]]
; CHECK: for.end:
; CHECK-NEXT: ret void
;
entry:
br label %for.body
for.cond: ; preds = %for.body
%a.0 = phi i16 [ %inc, %for.body ]
%cmp = icmp sle i16 %a.0, 2
br i1 %cmp, label %for.body, label %for.end
for.body: ; preds = %for.cond, %entry
%a.01 = phi i16 [ undef, %entry ], [ %a.0, %for.cond ]
%inc = add nsw i16 %a.01, 1
br i1 false, label %for.cond, label %for.end
for.end: ; preds = %for.body, %for.cond
ret void
}