diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c9976bd9f6f..ea76776a23e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-04-09 Xinliang David Li + + PR tree-optimization/PR48484 + * tree-ssa-uninit.c (convert_control_dep_chain_into_preds): Set + has_valid_pred lazily + 2011-04-09 Duncan Sands * tree.c (array_type_nelts): Bail out if TYPE_MAX_VALUE not set. diff --git a/gcc/testsuite/g++.dg/pr48484.C b/gcc/testsuite/g++.dg/pr48484.C new file mode 100644 index 00000000000..3f17f39a0a1 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr48484.C @@ -0,0 +1,105 @@ +/* { dg-do compile } */ +/* { dg-options "-O -finline-functions -finline-small-functions -Wuninitialized" } */ + + +struct SQObjectPtr +{ + int _type; + SQObjectPtr operator = (long); +}; +struct SQObjectPtrVec +{ + SQObjectPtr fff (unsigned); + SQObjectPtr *_vals; +}; + +struct SQInstruction +{ + int _arg1; + unsigned op; + unsigned _arg0; + unsigned _arg2; +}; +struct SQVM +{ + struct CallInfo + { + SQInstruction *_ip; + }; + bool + Execute (SQObjectPtr &, long, long, long, SQObjectPtr &, unsigned, int); + bool + FOREACH_OP + (SQObjectPtr + &, SQObjectPtr &, SQObjectPtr &, SQObjectPtr &, long, int, int &); + SQObjectPtrVec _stack; + CallInfo *ci; + long _nnativecalls; + bool ShouldSuspend (); +}; +struct AutoDec +{ + AutoDec (long *); + ~AutoDec (); +}; +bool + SQVM::FOREACH_OP + (SQObjectPtr + & + o1, + SQObjectPtr & o2, SQObjectPtr &, SQObjectPtr & o4, long, int, int &jump) +{ + long + nrefidx = 0; + switch (o1._type) + { + case 0x02000000: + o4 = nrefidx; + jump = 1; + return true; + case 0x00000080: + { + long + idx = 10; + o2 = idx; + jump = 0; + } + } +} + +bool + SQVM::Execute + (SQObjectPtr &, long, long, long, SQObjectPtr &, unsigned, int) +{ + AutoDec + ad (&_nnativecalls); + for (;;) + { + if (ShouldSuspend ()) + return true; + SQInstruction + _i_ = *ci->_ip; + switch (_i_.op) + { + case 0: + { + int + tojump; + + FOREACH_OP + (_stack._vals + [_i_._arg0], + _stack._vals + [_i_._arg2], + _stack._vals + [_i_._arg2], + _stack._vals[_i_._arg2], _i_._arg2, _i_._arg1, tojump); + + ci += tojump; /* { dg-warning "uninitialized" "warning" } */ + } + case 1: + _stack.fff (_i_._arg1); + } + } + +} diff --git a/gcc/tree-ssa-uninit.c b/gcc/tree-ssa-uninit.c index 02b166ab883..479ffce5ed7 100644 --- a/gcc/tree-ssa-uninit.c +++ b/gcc/tree-ssa-uninit.c @@ -349,9 +349,6 @@ convert_control_dep_chain_into_preds (VEC(edge, heap) **dep_chains, if (num_chains == 0 || num_chains >= MAX_NUM_CHAINS) return false; - /* Now convert CD chains into predicates */ - has_valid_pred = true; - /* Now convert the control dep chain into a set of predicates. */ *preds = XCNEWVEC (VEC(use_pred_info_t, heap) *, @@ -412,6 +409,7 @@ convert_control_dep_chain_into_preds (VEC(edge, heap) **dep_chains, one_pred->cond = cond_stmt; one_pred->invert = !!(e->flags & EDGE_FALSE_VALUE); VEC_safe_push (use_pred_info_t, heap, (*preds)[i], one_pred); + has_valid_pred = true; } if (!has_valid_pred)