------- Comment #1 from rguenth at gcc dot gnu dot org 2009-05-28 09:09 -------
Confirmed (HWI32 issue). We do a very funny expansion:
;; if (((int) (in >> 31) & 1) != 0)
(insn 8 5 6 t.c:10 (clobber (reg:DI 61)) -1 (insn_list:REG_LIBCALL 9 (nil)))
(insn 6 8 7 t.c:10 (parallel [
(set (subreg:SI (reg:DI 61) 0)
(and:SI (subreg:SI (reg/v:DI 60 [ in ]) 0)
(const_int -2147483648 [0x80000000])))
(clobber (reg:CC 17 flags))
]) -1 (expr_list:REG_NO_CONFLICT (reg/v:DI 60 [ in ])
(nil)))
(insn 7 6 9 t.c:10 (parallel [
(set (subreg:SI (reg:DI 61) 4)
(and:SI (subreg:SI (reg/v:DI 60 [ in ]) 4)
(const_int -1 [0xffffffff])))
(clobber (reg:CC 17 flags))
]) -1 (expr_list:REG_NO_CONFLICT (reg/v:DI 60 [ in ])
(nil)))
(insn 9 7 10 t.c:10 (set (reg:DI 61)
(reg:DI 61)) -1 (insn_list:REG_RETVAL 8 (expr_list:REG_EQUAL (and:DI
(reg/v:DI 60 [ in ])
(const_int -2147483648 [0x80000000]))
(nil))))
(insn 10 9 11 t.c:10 (parallel [
(set (reg:SI 62)
(ior:SI (subreg:SI (reg:DI 61) 4)
(subreg:SI (reg:DI 61) 0)))
(clobber (reg:CC 17 flags))
]) -1 (nil))
(insn 11 10 12 t.c:10 (set (reg:CCZ 17 flags)
(compare:CCZ (reg:SI 62)
(const_int 0 [0x0]))) -1 (nil))
must be some "optimization" of narrowed bit-tests. Without TER it is ok
(-fno-tree-ter). Trunk seems to be unaffected (likely due to less TER
due to expand-from-SSA):
(insn 8 7 9 /tmp/t.c:10 (parallel [
(set (reg:DI 64)
(lshiftrt:DI (reg/v:DI 63 [ in ])
(const_int 31 [0x1f])))
(clobber (reg:CC 17 flags))
]) -1 (nil))
(insn 9 8 10 /tmp/t.c:10 (parallel [
(set (reg:SI 65)
(and:SI (subreg:SI (reg:DI 64) 0)
(const_int 1 [0x1])))
(clobber (reg:CC 17 flags))
]) -1 (nil))
--
rguenth at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |matz at gcc dot gnu dot org
Status|UNCONFIRMED |NEW
Component|c |middle-end
Ever Confirmed|0 |1
Known to fail| |4.1.0 4.3.3
Known to work| |3.4.6 4.0.3
Last reconfirmed|0000-00-00 00:00:00 |2009-05-28 09:09:11
date| |
Summary|incorrect code generated |[4.3/4.4 Regression]
|when testing 31st bit of |incorrect code generated
|64bit integer with |when testing 31st bit of
|optimiaztion on |64bit integer with
| |optimiaztion on
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40279