This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug rtl-optimization/54919] [4.6/4.7/4.8 Regression] gcc.dg/torture/pr54877.c FAILs with -fvariable-expansion-in-unroller
- From: "steven at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Sat, 13 Oct 2012 16:38:14 +0000
- Subject: [Bug rtl-optimization/54919] [4.6/4.7/4.8 Regression] gcc.dg/torture/pr54877.c FAILs with -fvariable-expansion-in-unroller
- Auto-submitted: auto-generated
- References: <bug-54919-4@http.gcc.gnu.org/bugzilla/>
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54919
--- Comment #2 from Steven Bosscher <steven at gcc dot gnu.org> 2012-10-13 16:38:14 UTC ---
At the ".178r.loop2_invariant" dump:
5 r61:SI=0x40 # 64
6 r62:DF=[`*.LC0'] # 0.0
34 r68:DF=[`*.LC1'] # 1.0e+0
L16:
11 r62:DF=r62:DF-r68:DF
12 {r61:SI=r61:SI-0x1;clobber flags:CC;}
13 flags:CCZ=cmp(r61:SI,0)
14 pc={(flags:CCZ==0)?L19:pc}
# {implicit: pc=L16}
L19:
21 r67:SI=fix(r62:DF)
26 ax:SI=r67:SI
29 use ax:SI
Clearly the above loop iterates 64 times. But in the next pass
(".180r.loop2_unroll") the iterations estimate is not 64:
;; *** Considering loop 1 for complete peeling ***
;; Considering peeling once rolling loop
...
Loop 1 is simple:
simple exit 3 -> 5
number of iterations: (const_int 63 [0x3f])
upper bound: 63
realistic bound: 63
;; Unable to prove that the loop rolls exactly once
;; Considering peeling completely
;; Not peeling loop completely, rolls too much (63 iterations > 16 [maximum
peelings])
;; *** Considering loop 1 ***
;; Considering unrolling loop with constant number of iterations
;; max_unroll 8 (8 copies, initial 8).
;; Decided to unroll the constant times rolling loop, 7 times.
But with the wrong iteration estimate, the unrolled loop size is wrong.