Wrong RTL instruction deleted
Uros Bizjak
uros@kss-loka.si
Mon Dec 27 11:01:00 GMT 2004
Hello!
The testcase below produces different results when compiled with
different optimization levels:
--cut here--
#include <stdio.h>
float foo ()
{
unsigned int MASK = 0x80000000;
return (float &) MASK;
}
int main() {
printf ("%f\n", foo());
return 0;
}
--cut here--
g++ -O1 yyy.cpp produces correct value:
./a.out
-0.000000
g++ -O1 yyy.cpp
./a.out
0.000000
g++ -O3 yyy.cpp
./a.out
36.658997
The asm code of foo() function is correct at -O1:
_Z3foov:
.LFB13:
pushl %ebp #
.LCFI0:
movl %esp, %ebp #,
.LCFI1:
subl $16, %esp #,
.LCFI2:
movl $-2147483648, -4(%ebp) #, MASK
flds -4(%ebp) #
leave
ret
But for -O2, the move of constant to stack is missing:
_Z3foov:
.LFB13:
pushl %ebp #
.LCFI0:
movl %esp, %ebp #,
.LCFI1:
subl $16, %esp #,
.LCFI2:
flds -4(%ebp) #
leave
ret
Following is the RTL dump of .15.cse2, when foo() is compiled with -O2:
(note 6 2 9 NOTE_INSN_FUNCTION_BEG)
;; Start of basic block 0, registers live: (nil)
(note 9 6 11 0 [bb 0] NOTE_INSN_BASIC_BLOCK)
(insn 11 9 14 0 (set (mem/i:SI (plus:SI (reg/f:SI 20 frame)
(const_int -4 [0xfffffffc])) [2 MASK+0 S4 A32])
(const_int -2147483648 [0x80000000])) 35 {*movsi_1} (nil)
(nil))
(insn 14 11 18 0 (set (reg:SF 61)
(mem:SF (plus:SI (reg/f:SI 20 frame)
(const_int -4 [0xfffffffc])) [3 S4 A32])) 60 {*movsf_1}
(nil)
(nil))
(note 18 14 21 0 NOTE_INSN_FUNCTION_END)
And in .16.life, (insn 11) is simply missing (there is no
NOTE_INSN_DELETED):
(note 6 2 9 NOTE_INSN_FUNCTION_BEG)
;; Start of basic block 0, registers live: 6 [bp] 7 [sp] 16 [argp] 20
[frame]
(note 9 6 14 0 [bb 0] NOTE_INSN_BASIC_BLOCK)
(insn 14 9 18 0 (set (reg:SF 61)
(mem:SF (plus:SI (reg/f:SI 20 frame)
(const_int -4 [0xfffffffc])) [3 S4 A32])) 60 {*movsf_1}
(nil)
(nil))
(note 18 14 21 0 NOTE_INSN_FUNCTION_END)
In -O2, -O3, there is no initialization of temporary value on stack, so
the result is undefined.
This behaviour was found when PR16111 was analyzed, but can be also
related to PR13366.
Uros.
More information about the Gcc
mailing list