Subject: Bug in 2.7.2's liveness calculation
To: None <gcc2@cygnus.com>
From: Niklas Hallqvist <niklas@appli.se>
List: tech-userlevel
Date: 04/02/1996 13:13:02
Lately NetBSD has gone over to use -Wall -Werror (a problem in itself,
when all warnings are not completely reliable). However in one file,
nfs/nfs_socket.c, compiled with -O on a m68k architecture resulted in
an "uninitialized" warning that was *very* wrong. I say *very*
because -Wuninitialized is known to be able to produce bogus warnings
when the logic is too hard for the dataflow mechanism of GCC to
follow. However this case was a very simple one. It boils down to:
typedef long long L;
typedef int S;
L
foo (S s)
{
L l;
l = (L)s * 2;
return l;
}
This will trigger the warning on a m68k-unknown-netbsd config. The
reason is that the setting of "l" will be done in a PARALLEL SET of
SUBREGs:
(insn 12 11 14 (parallel[
(set (subreg:SI (reg/v:DI 29) 1)
(mult:SI (reg/v:SI 28)
(reg:SI 30)))
(set (subreg:SI (reg/v:DI 29) 0)
(truncate:SI (lshiftrt:DI (mult:DI (sign_extend:DI (reg/v:SI 28))
(sign_extend:DI (reg:SI 30)))
(const_int 32))))
] ) 151 {mulsidi3+1} (insn_list 4 (insn_list 11 (nil)))
(expr_list:REG_DEAD (reg/v:SI 28)
(expr_list:REG_DEAD (reg:SI 30)
(nil))))
The liveness calculating code ought to have marked reg 29 as dead
before this insn, but fails to do so because settings of subregs is
effectively a use of the destination too if the size of the subreg is
smaller than the reg. In this case however the parallel set
effectively is a set of the *whole* reg, but mark_used_regs doesn't
check for that condition.
This ought not only to be a problem with the uninitialized warning,
register allocation will suffer as well I guess, no?
Do we have some function in gcc to see if a set of SUBREGs rtxs fully
specifies the REG they're derived from?
Niklas
PS. A nice proposal of making -Werror configurable per-warning-type
was presented on a NetBSD list: sth like -Werror -Wnoerror-uninitalized
could be devised to keep the uninitalized warning but not let it
be a fatal error, while all others can. Maybe this is something
for GCC?
Niklas Hallqvist Phone: +46-(0)31-40 75 00 Home: +46-(0)31-41 93 95
Applitron Datasystem Fax: +46-(0)31-83 39 50 Home: +46-(0)31-41 93 96
Molndalsvagen 95 Email: niklas@appli.se GSM: +46-(0)70-714 10 35
S-412 63 GOTEBORG WWW: Here
Sweden IRC: niklas (#NetBSD)