[Bug tree-optimization/29333] Jump threading getting in the way of PHI-OPT
--- Comment #3 from roberto dot costa at st dot com 2006-10-05 08:15 --- I tested what happens if the first PHI-OPT pass is moved right before the first VRP pass in gcc/passes.c It looks like PHI-OPT should be run both before and after VRP and DOM. The example reported shows that, when PHI-OPT is run after VRP and DOM, it misses some MAX_EXPR and MIN_EXPR generation. gcc/testsuite/gcc.dg/tree-ssa/phi-opt-5.c shows that, when PHI-OPT anticipates VRP and DOM, it misses some MAX_EXPR and MIN_EXPR generation as well. Should an additional PHI-OPT pass be added before VRP and DOM? (In this case, a few testsuite examples should also be changed in order to consider what happens after PHI-OPT2 instead of PHI-OPT1) -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29333
[Bug tree-optimization/29333] Generation of MAX_EXPRs and MIN_EXPRs missed by phiopt
--- Comment #1 from roberto dot costa at st dot com 2006-10-03 16:05 --- Created an attachment (id=12378) --> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=12378&action=view) Source code of the example -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29333
[Bug tree-optimization/29333] New: Generation of MAX_EXPRs and MIN_EXPRs missed by phiopt
There are cases in which phiopt doesn't recognize MAX_EXPRs or MIN_EXPRs patterns. In particular, source codes that look very similar at first sight may induce phiopt to behave differently. Let's consider the following two functions: - int minmax_correct(int a) { if (a > 32767) a = 32767; else if (a < -32768) a = -32768; return a; } int minmax_wrong(int a) { if (a > 32767) a = 32767; if (a < -32768) a = -32768; return a; } - MIN_EXPRs and MAX_EXPRs are generated for the first function, but not for the second. Here is the contents of trace file minmax.c.042t.phicprop1: - ;; Function minmax_correct (minmax_correct) minmax_correct (a) { : if (a_2 > 32767) goto ; else goto ; :; if (a_2 < -32768) goto ; else goto ; :; # a_1 = PHI <32767(2), a_2(3), -32768(4)>; :; = a_1; return ; } ;; Function minmax_wrong (minmax_wrong) Removing basic block 6 minmax_wrong (a) { : if (a_3 > 32767) goto ; else goto ; :; if (a_3 < -32768) goto ; else goto ; # a_9 = PHI ; :; # a_2 = PHI ; :; = a_2; return ; } - And here is minmax.c.043t.phiopt1: - ;; Function minmax_correct (minmax_correct) Removing basic block 4 Removing basic block 3 Merging blocks 2 and 5 minmax_correct (a) { : a_7 = MAX_EXPR <-32768, a_2>; a_8 = MIN_EXPR ; = a_8; return ; } ;; Function minmax_wrong (minmax_wrong) minmax_wrong (a) { : if (a_3 > 32767) goto ; else goto ; :; if (a_3 < -32768) goto ; else goto ; # a_9 = PHI ; :; # a_2 = PHI ; :; = a_2; return ; } - -- Summary: Generation of MAX_EXPRs and MIN_EXPRs missed by phiopt Product: gcc Version: 4.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: roberto dot costa at st dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29333