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

John David Anglin <danglin at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
     Ever confirmed|0                           |1
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2024-07-31

--- Comment #6 from John David Anglin <danglin at gcc dot gnu.org> ---
This bug was exposed by the following change:

commit d2934eb6ae92471484469d8ddd039eb34ef400b1
Author: John David Anglin <dang...@gcc.gnu.org>
Date:   Thu Nov 16 17:42:26 2023 +0000

    hppa: Revise REG+D address support to allow long displacements before
reload

When generating PA 2.0 code, the above change allows long immediate
displacements in integer loads and stores before reload.  This indirectly
affects the RTL expansion of bb 18 and 19 of simplified test:

  <bb 18> :
  _13 = S.7_34 + _96;
  _14 = IMAGPART_EXPR <a[_13]>;
  _15 = S.7_34 + _97;
  _16 = _14 - 5.0e-1;
  IMAGPART_EXPR <b[_15]> = _16;
  S.7_100 = S.7_34 + 1;
  goto <bb 17>; [INV]

  <bb 19> :
  S.6_101 = S.6_33 + 1;
  goto <bb 15>; [INV]

;; basic block 18, loop depth 2, maybe hot
;;  prev block 17, next block 19, flags: (NEW, REACHABLE, RTL, VISITED)
;;  pred:       17 (FALLTHRU)
;;              19 (DFS_BACK) dependency_58.f90:15:19
(code_label 224 203 204 18 12 (nil) [1 uses])
(note 204 224 207 18 [bb 18] NOTE_INSN_BASIC_BLOCK)
(jump_insn 207 204 208 18 (set (pc)
        (if_then_else (gt (reg:SI 131 [ S.7_34 ])
                (const_int 10 [0xa]))
            (label_ref 227)
            (pc))) "dependency_58.f90":15:19 discrim 6 30 {*pa.md:1423}
     (nil)
 -> 227)
;;  succ:       20 dependency_58.f90:15:19
;;              19 (FALLTHRU)

;; basic block 19, loop depth 2, maybe hot
;;  prev block 18, next block 20, flags: (NEW, REACHABLE, RTL, VISITED)
;;  pred:       18 (FALLTHRU)
(note 208 207 209 19 [bb 19] NOTE_INSN_BASIC_BLOCK)
(insn 209 208 210 19 (set (reg:SI 108 [ _13 ])
        (plus:SI (reg:SI 131 [ S.7_34 ])
            (reg:SI 141 [ _96 ]))) "dependency_58.f90":15:19 discrim 5 120
{adds
i3}
     (nil))
(insn 210 209 384 19 (set (reg:SI 220)
        (ashift:SI (reg:SI 108 [ _13 ])
            (const_int 3 [0x3]))) "dependency_58.f90":15:19 discrim 5 177
{*pa.m
d:6558}
     (nil))
(insn 384 210 211 19 (set (reg:SI 261)
        (plus:SI (reg/f:SI 89 sfp)
            (const_int 8 [0x8]))) "dependency_58.f90":15:19 discrim 5 -1
     (nil))
(insn 211 384 212 19 (set (reg/f:SI 221)
        (plus:SI (reg:SI 261)
            (reg:SI 220))) "dependency_58.f90":15:19 discrim 5 120 {addsi3}
     (nil))
(insn 212 211 213 19 (set (reg:SF 109 [ _14 ])
        (mem:SF (plus:SI (reg/f:SI 221)
                (const_int 4 [0x4])) [6 a[_13]+4 S4 A32]))
"dependency_58.f90":1
5:19 discrim 5 86 {*pa.md:4440}
     (nil))
(insn 213 212 214 19 (set (reg:SI 110 [ _15 ])
        (plus:SI (reg:SI 131 [ S.7_34 ])
            (reg:SI 142 [ _97 ]))) "dependency_58.f90":15:19 discrim 5 120
{adds
i3}
     (nil))
(insn 214 213 215 19 (set (reg/f:SI 224)
        (high:SI (symbol_ref/u:SI ("*.LC0") [flags 0x2])))
"dependency_58.f90":15:19 discrim 5 59 {*pa.md:2753}
     (nil))
(insn 215 214 216 19 (set (reg/f:SI 223)
        (lo_sum:SI (reg/f:SI 224)
            (symbol_ref/u:SI ("*.LC0") [flags 0x2]))) "dependency_58.f90":15:19
discrim 5 60 {*pa.md:2785}
     (expr_list:REG_EQUAL (symbol_ref/u:SI ("*.LC0") [flags 0x2])
        (nil)))
(insn 216 215 217 19 (set (reg:SF 222)
        (mem/u/c:SF (reg/f:SI 223) [0  S4 A32])) "dependency_58.f90":15:19
discrim 5 86 {*pa.md:4440}
     (expr_list:REG_EQUAL (const_double:SF 5.0e-1 [0x0.8p+0])
        (nil)))
(insn 217 216 218 19 (set (reg:SF 111 [ _16 ])
        (minus:SF (reg:SF 109 [ _14 ])
            (reg:SF 222))) "dependency_58.f90":15:19 discrim 5 148 {subsf3}
     (nil))
(insn 218 217 219 19 (set (reg:SI 225)
        (const_int 804 [0x324])) "dependency_58.f90":15:19 discrim 5 42
{*pa.md:2195}
     (nil))
(insn 219 218 220 19 (set (reg:SI 226)
        (plus:SI (reg:SI 110 [ _15 ])
            (const_int 100 [0x64]))) "dependency_58.f90":15:19 discrim 5 120
{addsi3}
     (nil))
(insn 220 219 385 19 (set (reg:SI 227)
        (ashift:SI (reg:SI 226)
            (const_int 3 [0x3]))) "dependency_58.f90":15:19 discrim 5 177
{*pa.md:6558}
     (nil))
(insn 385 220 221 19 (set (reg:SI 262)
        (plus:SI (reg/f:SI 89 sfp)
            (const_int 8 [0x8]))) "dependency_58.f90":15:19 discrim 5 -1
     (nil))
(insn 221 385 222 19 (set (reg/f:SI 228)
        (plus:SI (reg:SI 262)
            (reg:SI 227))) "dependency_58.f90":15:19 discrim 5 120 {addsi3}
     (nil))
(insn 222 221 223 19 (set (mem:SF (reg/f:SI 228) [7 IMAGPART_EXPR <b[_15]>+0 S4
A32])
        (reg:SF 111 [ _16 ])) "dependency_58.f90":15:19 discrim 5 86
{*pa.md:4440}
     (nil))
(insn 223 222 225 19 (set (reg:SI 131 [ S.7_34 ])
        (plus:SI (reg:SI 131 [ S.7_34 ])
            (const_int 1 [0x1]))) "dependency_58.f90":15:19 discrim 5 120
{addsi3}
     (nil))
(jump_insn 225 223 226 19 (set (pc)
        (label_ref 224)) "dependency_58.f90":15:19 199 {jump}
     (nil)
 -> 224)
;;  succ:       18 (DFS_BACK) dependency_58.f90:15:19

This gives the following assembly code:

.L12:
        .loc 1 15 19 discriminator 6
        cmpib,<,n 10,%r19,.L11
        .loc 1 15 19 discriminator 5
        add,l %r19,%r31,%r20
        depw,z %r20,28,29,%r20
        ldo 8(%r3),%r21
        add,l %r21,%r20,%r20
        fldw 4(%r20),%fr23L
        add,l %r19,%r22,%r20
        ldil LR'.LC0,%r21
        ldo RR'.LC0(%r21),%r21
        fldw 0(%r21),%fr22L
        fsub,sgl %fr23L,%fr22L,%fr22L
        ldo 100(%r20),%r20
        depw,z %r20,28,29,%r20
        ldo 8(%r3),%r21
        add,l %r21,%r20,%r20
        fstw %fr22L,0(%r20)
        ldo 1(%r19),%r19
        .loc 1 15 19
        b,n .L12
.L11:

There is a problem in expanding IMAGPART_EXPR <b[_15]>+0. This insn seems
wrong:

(insn 385 220 221 19 (set (reg:SI 262)
        (plus:SI (reg/f:SI 89 sfp)
            (const_int 8 [0x8]))) "dependency_58.f90":15:19 discrim 5 -1
     (nil))

Register reg:SI 262 becomes register r20 in assembly code.  If I change
instruction "ldo 8(%r3),%r21" to "ldo 12(%r3),%r21", the simplified test
passes.

When generating PA 1.1 code, long displacements aren't allowed before
reload because long displacements are not supported for floating-point
loads and stores.  This results in different code and test passes.

Reply via email to