------- 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

Reply via email to