mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-18 13:34:04 +00:00
Semantically revert 151015. Add a comment on why we should be able to assert
the dominance once the dominates method is fixed and why we can use the builder's insertion point. Fixes pr12048. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@151125 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
57708abb10
commit
919a503458
@ -31,11 +31,20 @@ using namespace llvm;
|
|||||||
Value *SCEVExpander::ReuseOrCreateCast(Value *V, Type *Ty,
|
Value *SCEVExpander::ReuseOrCreateCast(Value *V, Type *Ty,
|
||||||
Instruction::CastOps Op,
|
Instruction::CastOps Op,
|
||||||
BasicBlock::iterator IP) {
|
BasicBlock::iterator IP) {
|
||||||
// All new or reused instructions must strictly dominate their uses.
|
// This function must be called with the builder having a valid insertion
|
||||||
// It would be nice to assert this here, but we don't always know where
|
// point. It doesn't need to be the actual IP where the uses of the returned
|
||||||
// the next instructions will be added as the caller can move the
|
// cast will be added, but it must dominate such IP.
|
||||||
// Builder's InsertPt before creating them and we might be called with
|
// We use this precondition to assert that we can produce a cast that will
|
||||||
// an invalid InsertPt.
|
// dominate all its uses. In particular, this is crussial for the case
|
||||||
|
// where the builder's insertion point *is* the point where we were asked
|
||||||
|
// to put the cast.
|
||||||
|
// Since we don't know the the builder's insertion point is actually
|
||||||
|
// where the uses will be added (only that it dominates it), we are
|
||||||
|
// not allowed to move it.
|
||||||
|
BasicBlock::iterator BIP = Builder.GetInsertPoint();
|
||||||
|
|
||||||
|
// FIXME: enable once our implementation of dominates is fixed.
|
||||||
|
// assert(BIP == IP || SE.DT->dominates(IP, BIP));
|
||||||
|
|
||||||
// Check to see if there is already a cast!
|
// Check to see if there is already a cast!
|
||||||
for (Value::use_iterator UI = V->use_begin(), E = V->use_end();
|
for (Value::use_iterator UI = V->use_begin(), E = V->use_end();
|
||||||
@ -44,8 +53,9 @@ Value *SCEVExpander::ReuseOrCreateCast(Value *V, Type *Ty,
|
|||||||
if (U->getType() == Ty)
|
if (U->getType() == Ty)
|
||||||
if (CastInst *CI = dyn_cast<CastInst>(U))
|
if (CastInst *CI = dyn_cast<CastInst>(U))
|
||||||
if (CI->getOpcode() == Op) {
|
if (CI->getOpcode() == Op) {
|
||||||
// If the cast isn't where we want it, fix it.
|
// If the cast isn't where we want it or if it doesn't dominate
|
||||||
if (BasicBlock::iterator(CI) != IP) {
|
// a use in BIP, fix it.
|
||||||
|
if (BasicBlock::iterator(CI) != IP || BIP == IP) {
|
||||||
// Create a new cast, and leave the old cast in place in case
|
// Create a new cast, and leave the old cast in place in case
|
||||||
// it is being used as an insert point. Clear its operand
|
// it is being used as an insert point. Clear its operand
|
||||||
// so that it doesn't hold anything live.
|
// so that it doesn't hold anything live.
|
||||||
|
38
test/Transforms/LoopStrengthReduce/pr12048.ll
Normal file
38
test/Transforms/LoopStrengthReduce/pr12048.ll
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
; RUN: opt < %s -loop-reduce
|
||||||
|
|
||||||
|
define void @resolve_name() nounwind uwtable ssp {
|
||||||
|
br label %while.cond40.preheader
|
||||||
|
while.cond132.while.cond.loopexit_crit_edge:
|
||||||
|
br label %while.cond40.preheader
|
||||||
|
while.cond40.preheader:
|
||||||
|
br label %while.cond40
|
||||||
|
while.cond40:
|
||||||
|
%indvars.iv194 = phi i8* [ null, %while.cond40.preheader ], [ %scevgep, %while.body51 ]
|
||||||
|
%tmp.1 = phi i8* [ undef, %while.cond40.preheader ], [ %incdec.ptr, %while.body51 ]
|
||||||
|
switch i8 undef, label %while.body51 [
|
||||||
|
i8 0, label %if.then59
|
||||||
|
]
|
||||||
|
while.body51: ; preds = %land.end50
|
||||||
|
%incdec.ptr = getelementptr inbounds i8* %tmp.1, i64 1
|
||||||
|
%scevgep = getelementptr i8* %indvars.iv194, i64 1
|
||||||
|
br label %while.cond40
|
||||||
|
if.then59: ; preds = %while.end
|
||||||
|
br i1 undef, label %if.then64, label %if.end113
|
||||||
|
if.then64: ; preds = %if.then59
|
||||||
|
%incdec.ptr88.tmp.2 = select i1 undef, i8* undef, i8* undef
|
||||||
|
br label %if.end113
|
||||||
|
if.end113: ; preds = %if.then64, %if.then59
|
||||||
|
%tmp.4 = phi i8* [ %incdec.ptr88.tmp.2, %if.then64 ], [ undef, %if.then59 ]
|
||||||
|
%tmp.4195 = ptrtoint i8* %tmp.4 to i64
|
||||||
|
br label %while.cond132.preheader
|
||||||
|
while.cond132.preheader: ; preds = %if.end113
|
||||||
|
%cmp133173 = icmp eq i8* %tmp.1, %tmp.4
|
||||||
|
br i1 %cmp133173, label %while.cond40.preheader, label %while.body139.lr.ph
|
||||||
|
while.body139.lr.ph: ; preds = %while.cond132.preheader
|
||||||
|
%scevgep198 = getelementptr i8* %indvars.iv194, i64 0
|
||||||
|
%scevgep198199 = ptrtoint i8* %scevgep198 to i64
|
||||||
|
br label %while.body139
|
||||||
|
while.body139: ; preds = %while.body139, %while.body139.lr.ph
|
||||||
|
%start_of_var.0177 = phi i8* [ %tmp.1, %while.body139.lr.ph ], [ null, %while.body139 ]
|
||||||
|
br i1 undef, label %while.cond132.while.cond.loopexit_crit_edge, label %while.body139
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user