mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-02 07:30:52 +00:00
LoopIdiom: Give up when the loop is not in canonical form.
We rely on it when doing the transforms. This can happen when there is an indirectbr in the loop. Fixes PR13892. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@164383 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e5e674ba11
commit
28aff84ceb
@ -175,6 +175,11 @@ static void deleteIfDeadInstruction(Value *V, ScalarEvolution &SE,
|
||||
bool LoopIdiomRecognize::runOnLoop(Loop *L, LPPassManager &LPM) {
|
||||
CurLoop = L;
|
||||
|
||||
// If the loop could not be converted to canonical form, it must have an
|
||||
// indirectbr in it, just give up.
|
||||
if (!L->getLoopPreheader())
|
||||
return false;
|
||||
|
||||
// Disable loop idiom recognition if the function's name is a common idiom.
|
||||
StringRef Name = L->getHeader()->getParent()->getName();
|
||||
if (Name == "memset" || Name == "memcpy")
|
||||
|
34
test/Transforms/LoopIdiom/non-canonical-loop.ll
Normal file
34
test/Transforms/LoopIdiom/non-canonical-loop.ll
Normal file
@ -0,0 +1,34 @@
|
||||
; RUN: opt -S -loop-idiom < %s
|
||||
; Don't crash
|
||||
; PR13892
|
||||
|
||||
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
define void @test(i32* %currMB) nounwind uwtable {
|
||||
entry:
|
||||
br i1 undef, label %start.exit, label %if.then.i
|
||||
|
||||
if.then.i: ; preds = %entry
|
||||
unreachable
|
||||
|
||||
start.exit: ; preds = %entry
|
||||
indirectbr i8* undef, [label %0, label %for.bodyprime]
|
||||
|
||||
; <label>:0 ; preds = %start.exit
|
||||
unreachable
|
||||
|
||||
for.bodyprime: ; preds = %for.bodyprime, %start.exit
|
||||
%i.057375 = phi i32 [ 0, %start.exit ], [ %1, %for.bodyprime ]
|
||||
%arrayidx8prime = getelementptr inbounds i32* %currMB, i32 %i.057375
|
||||
store i32 0, i32* %arrayidx8prime, align 4
|
||||
%1 = add i32 %i.057375, 1
|
||||
%cmp5prime = icmp slt i32 %1, 4
|
||||
br i1 %cmp5prime, label %for.bodyprime, label %for.endprime
|
||||
|
||||
for.endprime: ; preds = %for.bodyprime
|
||||
br label %for.body23prime
|
||||
|
||||
for.body23prime: ; preds = %for.body23prime, %for.endprime
|
||||
br label %for.body23prime
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user