[Bug target/35659] [4.3/4.4 Regression] Miscompiled code with -O2 (but not with -O2 -funroll-loops) on ia64
------- Comment #19 from jakub at gcc dot gnu dot org 2008-06-26 08:41 -------
To be more precise, the problem is in speculating conditional store:
ld4.a r18 = [r44]
st4 [r59] = r14, -60
...
cmp4.ge p6, p7 = r22, r18
(p7) ld4 r14 = [r62]
...
(p7) st4 [r77] = r14
chk.a.clr r18, .L69
.L70:
...
.L69:
ld4 r18 = [r44]
;;
cmp4.ge p6, p7 = r22, r18
;;
(p7) ld4 r14 = [r62]
;;
(p7) st4 [r77] = r14
br .L70
Now, ld4.a returns the stale value in r18 (0x20202020), $r22 is 2 and so in the
code before chk.a.clr p7 is 1, so [r62] is loaded into r14 and stored into
[r77]
(i.e. MR = M in IF (K.GT.M1) MR = M is executed).
Then chk.a.clr realizes the [r44] memory changed, so branches to .L69 to do the
speculated stuff again. This time r18 is 1, so p7 will be 0 and MR = M is not
done. But this really doesn't and can't undo the st4 [r77] = r14 store that
already happened before chk.a.clr and wasn't supposed to happen.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35659
------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.
Reply to: