forked from OSchip/llvm-project
[PowerPC] Handle loop predecessor invokes
If a loop predecessor has an invoke as its terminator, and the return value from that invoke is used to determine the loop iteration space, then we can't insert a computation based on that value in the loop predecessor prior to the terminator (oops). If there's such an invoke, or just no predecessor for that matter, insert a new loop preheader. llvm-svn: 228488
This commit is contained in:
parent
7e575ed1ea
commit
291cc7bacd
|
@ -41,6 +41,7 @@
|
|||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
|
||||
#include "llvm/Transforms/Utils/Local.h"
|
||||
#include "llvm/Transforms/Utils/LoopUtils.h"
|
||||
#include "llvm/Transforms/Utils/ValueMapper.h"
|
||||
using namespace llvm;
|
||||
|
||||
|
@ -165,9 +166,6 @@ bool PPCLoopPreIncPrep::runOnLoop(Loop *L) {
|
|||
return MadeChange;
|
||||
|
||||
BasicBlock *Header = L->getHeader();
|
||||
BasicBlock *LoopPredecessor = L->getLoopPredecessor();
|
||||
if (!LoopPredecessor)
|
||||
return MadeChange;
|
||||
|
||||
const PPCSubtarget *ST =
|
||||
TM ? TM->getSubtargetImpl(*Header->getParent()) : nullptr;
|
||||
|
@ -236,7 +234,17 @@ bool PPCLoopPreIncPrep::runOnLoop(Loop *L) {
|
|||
}
|
||||
}
|
||||
|
||||
if (Buckets.size() > MaxVars)
|
||||
if (Buckets.empty() || Buckets.size() > MaxVars)
|
||||
return MadeChange;
|
||||
|
||||
BasicBlock *LoopPredecessor = L->getLoopPredecessor();
|
||||
// If there is no loop predecessor, or the loop predecessor's terminator
|
||||
// returns a value (which might contribute to determining the loop's
|
||||
// iteration space), insert a new preheader for the loop.
|
||||
if (!LoopPredecessor ||
|
||||
!LoopPredecessor->getTerminator()->getType()->isVoidTy())
|
||||
LoopPredecessor = InsertPreheaderForLoop(L, this);
|
||||
if (!LoopPredecessor)
|
||||
return MadeChange;
|
||||
|
||||
SmallSet<BasicBlock *, 16> BBChanged;
|
||||
|
|
|
@ -0,0 +1,50 @@
|
|||
; RUN: llc -mcpu=pwr7 < %s | FileCheck %s
|
||||
target datalayout = "E-m:e-i64:64-n32:64"
|
||||
target triple = "powerpc64-unknown-linux-gnu"
|
||||
|
||||
@.str1 = external unnamed_addr constant [1 x i8], align 1
|
||||
@.str2 = external unnamed_addr constant [39 x i8], align 1
|
||||
|
||||
declare void @_ZN13CStdOutStreamlsEPKc()
|
||||
|
||||
declare void @_ZN13CStdOutStream5FlushEv()
|
||||
|
||||
declare i32 @__gxx_personality_v0(...)
|
||||
|
||||
define void @_Z11GetPasswordP13CStdOutStreamb() {
|
||||
entry:
|
||||
br label %for.cond.i.i
|
||||
|
||||
for.cond.i.i: ; preds = %for.cond.i.i, %entry
|
||||
br i1 undef, label %_ZN11CStringBaseIcEC2EPKc.exit.critedge, label %for.cond.i.i
|
||||
|
||||
_ZN11CStringBaseIcEC2EPKc.exit.critedge: ; preds = %for.cond.i.i
|
||||
invoke void @_ZN13CStdOutStreamlsEPKc()
|
||||
to label %invoke.cont unwind label %lpad
|
||||
|
||||
invoke.cont: ; preds = %_ZN11CStringBaseIcEC2EPKc.exit.critedge
|
||||
invoke void @_ZN13CStdOutStream5FlushEv()
|
||||
to label %invoke.cont4 unwind label %lpad
|
||||
|
||||
invoke.cont4: ; preds = %invoke.cont
|
||||
%call7 = invoke i8* @getpass()
|
||||
to label %for.cond.i.i30 unwind label %lpad
|
||||
|
||||
; CHECK-LABEL: @_Z11GetPasswordP13CStdOutStreamb
|
||||
; CHECK: addi {{[0-9]+}}, 3, -1
|
||||
|
||||
for.cond.i.i30: ; preds = %for.cond.i.i30, %invoke.cont4
|
||||
%indvars.iv.i.i26 = phi i64 [ %indvars.iv.next.i.i29, %for.cond.i.i30 ], [ 0, %invoke.cont4 ]
|
||||
%arrayidx.i.i27 = getelementptr inbounds i8* %call7, i64 %indvars.iv.i.i26
|
||||
%0 = load i8* %arrayidx.i.i27, align 1
|
||||
%indvars.iv.next.i.i29 = add nuw nsw i64 %indvars.iv.i.i26, 1
|
||||
br label %for.cond.i.i30
|
||||
|
||||
lpad: ; preds = %invoke.cont4, %invoke.cont, %_ZN11CStringBaseIcEC2EPKc.exit.critedge
|
||||
%1 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
|
||||
cleanup
|
||||
resume { i8*, i32 } undef
|
||||
}
|
||||
|
||||
declare i8* @getpass()
|
||||
|
Loading…
Reference in New Issue