[tree-ssa] COND_EXPR lowering.

law@redhat.com law@redhat.com
Fri Oct 24 17:29:00 GMT 2003


In message <20031024162721.GA17804@atrey.karlin.mff.cuni.cz>, Zdenek Dvorak wri
tes:
 >> > + 
 >> > + 	  slow = e->dest;
 >> > + 	  set_slow = 0;
 >> > + 
 >> > + 	  last = e->dest->succ;
 >> > + 	  for (dest = e->dest->succ->dest;
 >> > + 	       tree_forwarder_block_p (dest);
 >> > + 	       last = dest->succ,
 >> > + 	       dest = dest->succ->dest,
 >> > + 	       set_slow ^= 1)
 >> > + 	    {
 >> > + 	      /* Infinite loop detected.  */
 >> > + 	      if (slow == dest)
 >> > + 		break;
 >> > + 	      if (set_slow)
 >> > + 		slow = slow->succ->dest;
 >> > + 
 >> > + 	      if (dest->succ->dest == EXIT_BLOCK_PTR)
 >> > + 		break;
 >> > + 	    }
 >> > + 
 >> > + 	  if (dest == e->dest)
 >> > + 	    continue;
 >> > + 	      
 >> 
 >> So if we do detect and infinite loop, we might still redirect the edges
 >> anyway? Does that actually serve a purpose? It looks like we'd be
 >> threading into an arbitary point in the cycle?
 >
 >Yes we are.  Neither feature nor bug, just it is easier not to handle it
 >specially when it does not have to be.
This was actually some of the code I really didn't like in Zdenek's
threader.  It's far from obvious what that code is doing.   I really
don't like the coding style for the "for" loop either.  This is naturally
a recursive problem, so unless there's a performance issue, let's use
recursion.

The way it detects loops is also far from obvious.  I think it's far
more straightforward to note which blocks you've forwarded through and
not revisit the same block more than once.  

 >> The only other thing that I think Diego agreed with (yes? no?) is that
 >> we probably ought to set the BB for the 2 goto's on the arms of the
 >> COND_EXPR. Yeah, they aren't real stmt's, but there is no reason someone
 >> couldn't look at them as real stmts.. ie, someone doing path following
 >> may want to process the 2 arms exactly like they process a GOTO, so we
 >> ought to make them behave like a GOTO stmt for consistancy, so we ought
 >> to set their BB.
 >
 >I don't want to do it.  Every change of the statement would than have to
 >take care of setting it, which would be a source of unnecessary errors. 
Err, why again aren't the arms real statements?  I thought we had decided
to go ahead and leave them as real statements with their associated basic
blocks.

 >> ie, we could see something like:
 >> if (TREE_CODE (expr) == GOTO_EXPR
 >>   follow_goto (expr)
 >> else
 >> if (TREE_CODE (expr) == COND_EXPR)
 >>   {
 >>     follow_goto (COND_EXPR_THEN (expr));
 >>     follow_goto (COND_EXPR_ELSE (expr));
 >>   }
 >> where follow_goto wants to treat it just like a stmt, and may ask for
 >> the BB...
 >
 >Why the hell should we do something that stupid? This is what cfg is
 >here for.
You can't always use the CFG for everything.

Jeff




More information about the Gcc-patches mailing list