[Bug target/29083] useless clrlwi instruction produced for 16-bit bitfield

bonzini at gnu dot org gcc-bugzilla@gcc.gnu.org
Thu Sep 14 12:07:00 GMT 2006



------- Comment #1 from bonzini at gnu dot org  2006-09-14 12:07 -------
The sole difference in the IR is

;; if ((int) node->x == a) goto <L0>; else (void) 0;
(insn 19 18 20 (set (reg:HI 125)
        (mem/s/j:HI (reg/v/f:SI 123 [ node ])
                  [2 <variable>.x+0 S2 A32])) -1 (nil)

;; if ((int) MEM[base: (short unsigned int *) node] == a) goto <L0>; else
(void) 0;
(insn 20 19 21 (set (reg:HI 125)
        (mem/s:HI (reg/v/f:SI 123 [ node ])
                  [3 <variable>.x+0 S2 A8])) -1 (nil)
     (nil))

(COMPONENT_REF vs. TARGET_MEM_REF, the first produces A32 and the second A8)


----


It's actually flow's fault, because it fails to recognize a PRE_MODIFY address,
and things go downhill from there: life1 dump is

   16 r121:SI=r121:SI+0x1             |    17 r122:SI=r122:SI+0x1
   18 r123:SI=r123:SI-0x4             |    20 r126:HI=[--r124:SI]
   19 r125:HI=[r123:SI]               |       REG_INC: r124:SI
   20 r124:SI=zero_extend(r125:HI)    |    21 r125:SI=zero_extend(r126:HI)
      REG_DEAD: r125:HI               |       REG_DEAD: r126:HI
   21 r126:CC=cmp(r124:SI,r121:SI)    |    22 r127:CC=cmp(r125:SI,r122:SI)
      REG_DEAD: r124:SI               |       REG_DEAD: r125:SI
   22 pc={(r126:CC==0x0)?L13:pc}      |    23 pc={(r127:CC==0x0)?L14:pc}
      REG_DEAD: r126:CC               |       REG_DEAD: r127:CC
      REG_BR_PROB: 0x22c4                     REG_BR_PROB: 0x22c4
   24 NOTE_INSN_BASIC_BLOCK           |    25 NOTE_INSN_BASIC_BLOCK
   28 NOTE_INSN_FUNCTION_END          |    29 NOTE_INSN_FUNCTION_END
   31 r3:SI=r121:SI                   |    32 r3:SI=r122:SI
      REG_DEAD: r121:SI               |       REG_DEAD: r122:SI
   37 use r3:SI                       |    38 use r3:SI

while combine dump is

   14 NOTE_INSN_BASIC_BLOCK           |    15 NOTE_INSN_BASIC_BLOCK
   16 r121:SI=r121:SI+0x1             |    17 r122:SI=r122:SI+0x1
   18 NOTE_INSN_DELETED               |    20 NOTE_INSN_DELETED
   19 {r125:HI=[r123:SI-0x4];r123:SI= |    21 r125:SI=zero_extend([--r124:SI]
   20 r124:SI=zero_extend(r125:HI)    |       REG_INC: r124:SI
      REG_DEAD: r125:HI               |    22 r127:CC=cmp(r125:SI,r122:SI)
   21 r126:CC=cmp(r124:SI,r121:SI)    |       REG_DEAD: r125:SI
      REG_DEAD: r124:SI

where it has synthesized a movsi_movhi_update1, but then failed to implement
the merged.

Could this be fixed on dataflow-branch?


-- 

bonzini at gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |zadeck at gcc dot gnu dot
                   |                            |org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29083



More information about the Gcc-bugs mailing list