--- Additional Comments From uweigand at gcc dot gnu dot org 2005-01-15
00:45 ---
This is caused by instruction scheduling not noticing a dependency,
apparently because alias sets are set up incorrectly.
At the end of the tree optimizer phase we have:
L29:;
fortran_character_1[1]{lb: 1 sz: 1} =
VIEW_CONVERT_EXPRinterfaces__fortran__character_set[1:1](*SR.237)[1]{lb: 1
sz: 1};
tc_fortran_character_1.26 = (const unnamed type *) tc_fortran_character_1;
D.2019 = *tc_fortran_character_1.26;
bb 56:
D.2020 = (integer) D.2019;
fortran_character_1.27 = (interfaces__fortran__character_set[1:1] *)
fortran_character_1;
D.2023 = *(const unnamed type *) fortran_character_1.27;
bb 57:
if (D.2020 - (integer) D.2023 != 0) goto L30; else goto L31;
L30:;
D.2026 = C.29;
report__failed (D.2026);
which gets expanded into RTL like so:
(insn 497 496 499 73 (set (mem/s/j:QI (reg/f:SI 39 virtual-stack-vars) [11
fortran_character_1+0 S1 A64])
(mem/s/j:QI (reg/f:SI 123 [ SR.237 ]) [11 S1 A8])) -1 (nil)
(nil))
[snip]
(insn 503 502 504 74 (set (reg:SI 268 [ fortran_character_1.27 ])
(reg/f:SI 39 virtual-stack-vars)) -1 (nil)
(nil))
(insn 504 503 505 74 (set (reg:QI 267 [ D.2023 ])
(mem:QI (reg:SI 268 [ fortran_character_1.27 ]) [28 S1 A8])) -1 (nil)
(expr_list:REG_EH_REGION (const_int 2 [0x2])
(nil)))
Notice how the store to fortran_character uses alias set 11,
while the read (via the fortran_character_1.27 pointer) uses
alias set 28.
The whole section gets further simplified to
(insn 1955 506 1956 56 (parallel [
(set (mem/s/j:BLK (plus:SI (reg/f:SI 15 %r15)
(const_int 96 [0x60])) [11 fortran_character_1+0 S1
A64])
(mem/s/j:BLK (reg/f:SI 4 %r4 [orig:123 SR.237 ] [123]) [11 S1
A8]))
(use (const_int 1 [0x1]))
]) 61 {*mvc} (nil)
(expr_list:REG_DEAD (reg/f:SI 4 %r4 [orig:123 SR.237 ] [123])
(nil)))
(insn 1956 1955 508 56 (parallel [
(set (reg:CCZ 33 %cc)
(compare:CCZ (mem:BLK (plus:SI (reg/f:SI 15 %r15)
(const_int 96 [0x60])) [28 S1 A8])
(mem:BLK (plus:SI (reg/f:SI 15 %r15)
(const_int 97 [0x61])) [28 S1 A8])))
(use (const_int 1 [0x1]))
]) 31 {*clc} (nil)
(nil))
I.e. first the store to fortran_character, the the compare.
The scheduler now swaps the two insns, causing incorrect code
to be generated. It hasn't recognized the dependency, presumably
because the alias sets are incorrect ...
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19382