http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49498

--- Comment #7 from davidxl <xinliangli at gmail dot com> 2011-07-05 22:51:49 
UTC ---
(In reply to comment #6)
> Created attachment 24693 [details]
> k.c.127t.uninit


1) is the complicated control flow generated by if-merging + jump-threading?
2) On the targets that have the problem, is branch cost considered cheap?
3) Looks like there are more jump-threading opportunities that can clean up the
control flow, namely,

(in the attached file):

BLOCK 4 should be split into 4_1 and 4_2. 4_1's predecessor is BLOCK 8, and it
can be merged with with  BLOCK 10. The merged block (10 and 4_1) has single
successor BLOCK 6. BLOCK 4_2 (predecessor is 9) is successors can be greatly
simplified with a single successor BLOCK 7.

Why is that not happening?

With the complicated control flow, the uninit analysis is definitely confused
-- requires powerful symbolic evaluation to simplify the predicates: the
predicates guarding the use in BLOCK 6:

(n<=9 AND  m==0) OR (n <= 9 AND m != 0 AND (n <=9 OR m > 100)) OR (n > 9 AND m
> 100) OR (n > 9 AND m <= 100 AND (n<=9 OR m > 100))

of course there might be other bugs in the analysis that prevent the above from
formulated, but nonetheless, it is unlikely to be handled).

Solution
1) fix the test case by disabling jumpthreading and if-merging
2) or maybe move the uninit analysis earlier in the pipeline.

David

Reply via email to