[backport from gcc-4.7/trunk, fixes PR48484 regression from PR47837 patch, test case lacks ChangeLog entry ] gcc/ 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 --- gcc-4.6.0/gcc/testsuite/g++.dg/pr48484.C.~1~ 1970-01-01 01:00:00.000000000 +0100 +++ gcc-4.6.0/gcc/testsuite/g++.dg/pr48484.C 2011-06-06 12:54:39.000000000 +0200 @@ -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); + } + } + +} --- gcc-4.6.0/gcc/tree-ssa-uninit.c.~1~ 2011-06-06 12:51:00.000000000 +0200 +++ gcc-4.6.0/gcc/tree-ssa-uninit.c 2011-06-06 12:54:39.000000000 +0200 @@ -349,9 +349,6 @@ convert_control_dep_chain_into_preds (VE 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 (VE 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)