https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78437

            Bug ID: 78437
           Summary: [7 Regression]: Invalid sign-extend conversion in REE
                    pass
           Product: gcc
           Version: 7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ubizjak at gmail dot com
  Target Milestone: ---

Created attachment 40092
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=40092&action=edit
Preprocessed source

Attached testcase triggers invalid sign-extend conversion in REE pass.

The problem can be triggered with a crosscompiler to alpha-linux-gnu using:

~/gcc-build-alpha/gcc/cc1 -O2 -std=c11 -mcpu=ev67 -mexplicit-relocs
-fpreprocessed att.i

The _.split2 dump will have:

   ...
   50: $22:QI=$8:QI
      REG_EQUAL [`expected']
   43: [$2:DI+low(`expected')]=$8:QI
   51: $3:DI=sign_extend($22:QI)
   ...

this sequence is converted in REE pass:

Trying to eliminate extension:
(insn 51 43 53 7 (set (reg:DI 3 $3 [orig:110 expected ] [110])
        (sign_extend:DI (reg:QI 22 $22 [orig:111 expected ] [111]))) "att.c":27
70 {*extendqidi2_bwx}
     (nil))
Tentatively merged extension with definition (copy needed):
(insn 50 52 43 7 (set (reg:DI 3 $3)
        (sign_extend:DI (reg:QI 8 $8 [106]))) "att.c":27 -1
     (nil))
deferring rescan insn with uid = 50.
All merges were successful.
Eliminated the extension.

   ...
   50: $3:DI=sign_extend($8:QI)
  141: $22:DI=$3:DI
   43: [$2:DI+low(`expected')]=$8:QI
   ...

However, $22 is used later in a DImode in:

(insn 63 62 65 8 (parallel [
            (set (reg:DI 7 $7 [119])
                (unspec_volatile:DI [
                        (const_int 0 [0])
                    ] UNSPECV_CMPXCHG))
            (set (reg:DI 3 $3 [123])
                (zero_extend:DI (unspec_volatile:QI [
                            (const_int 0 [0])
                        ] UNSPECV_CMPXCHG)))
            (set (mem/v:QI (reg/f:DI 1 $1 [138]) [-1  S1 A8])
                (unspec_volatile:QI [
                        (mem/v:QI (reg/f:DI 1 $1 [138]) [-1  S1 A8])
                        (reg:DI 22 $22 [orig:111 expected ] [111])
                        (const_int 0 [0])
                        (reg:DI 4 $4 [90])
                        (const_int 0 [0])
                        (const_int 3 [0x3])
                        (const_int 2 [0x2])
                    ] UNSPECV_CMPXCHG))
            (clobber (reg:DI 23 $23))
        ]) "att.c":30 304 {atomic_compare_and_swapqi_1}
     (nil))

so the converted sequence is *not* equal as long as $22 is concerned.

Reply via email to