[Bug rtl-optimization/93996] [10 Regression] ICE in lookup_page_table_entry

law at redhat dot com gcc-bugzilla@gcc.gnu.org
Thu Mar 5 22:13:00 GMT 2020


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

--- Comment #10 from Jeffrey A. Law <law at redhat dot com> ---
So what seems to be happening here for the original test is we have something
like this just before split3:

(insn 14 13 28 2 (parallel [
            (set (mem/v:SI (reg/f:DI 0 x0 [97]) [-1  S4 A32])
                (unspec_volatile:SI [
                        (plus:SI (mem/v:SI (reg/f:DI 0 x0 [97]) [-1  S4 A32])
                            (const_int 1 [0x1]))
                        (const_int 5 [0x5])
                    ] UNSPECV_ATOMIC_OP))
            (clobber (reg:CC 66 cc))
            (clobber (reg:SI 1 x1 [98]))
            (clobber (reg:SI 2 x2 [99]))
        ]) "k.c":2:17 3913 {aarch64_atomic_addsi}
     (expr_list:REG_DEAD (reg/f:DI 0 x0 [97])
        (expr_list:REG_UNUSED (reg:CC 66 cc)
            (expr_list:REG_UNUSED (reg:SI 2 x2 [99])
                (expr_list:REG_UNUSED (reg:SI 1 x1 [98])
                    (nil))))))
(note 28 14 23 2 NOTE_INSN_EPILOGUE_BEG)
(insn 23 28 24 2 (use (reg:DI 30 x30)) "k.c":2:1 -1
     (nil))

That would work fine in terms of what's after the NOTE_INSN_EPILOGUE_BEG.

insn 14 gets split into a loop and we end up with a block note after the
epilogue begin note:
;; basic block 3, loop depth 0, count 3221225464 (estimated locally), maybe hot
;; Invalid sum of incoming counts 1075352416 (estimated locally), should be
3221225464 (estimated locally)
;;  prev block 2, next block 4, flags: (NEW, RTL, MODIFIED)
;;  pred:       2 [always]  count:1073741824 (estimated locally) (FALLTHRU)
;;              3 [0.0% (guessed)]  count:1610592 (estimated locally)
;; bb 3 artificial_defs: { }
;; bb 3 artificial_uses: { u-1(31){ }}
;; lr  in
;; lr  use
;; lr  def
;; live  in
;; live  gen
;; live  kill
(code_label 29 13 34 3 3 (nil) [1 uses])
(note 34 29 30 3 [bb 3] NOTE_INSN_BASIC_BLOCK)
(insn 30 34 31 3 (set (reg:SI 1 x1 [98])
        (unspec_volatile:SI [
                (mem/v:SI (reg/f:DI 0 x0 [97]) [-1  S4 A32])
                (const_int 5 [0x5])
            ] UNSPECV_LX)) "k.c":2:17 4017 {aarch64_load_exclusivesi}
     (nil))
(insn 31 30 32 3 (set (reg:SI 1 x1 [98])
        (plus:SI (reg:SI 1 x1 [98])
            (const_int 1 [0x1]))) "k.c":2:17 120 {*addsi3_aarch64}
     (nil))
(insn 32 31 33 3 (parallel [
            (set (reg:SI 2 x2 [99])
                (unspec_volatile:SI [
                        (const_int 0 [0])
                    ] UNSPECV_SX))
            (set (mem/v:SI (reg/f:DI 0 x0 [97]) [-1  S4 A32])
                (unspec_volatile:SI [
                        (reg:SI 1 x1 [98])
                        (const_int 5 [0x5])
                    ] UNSPECV_SX))
        ]) "k.c":2:17 4022 {aarch64_store_exclusivesi}
     (nil))
(jump_insn 33 32 28 3 (set (pc)
        (if_then_else (ne (reg:SI 2 x2 [99])
                (const_int 0 [0]))
            (label_ref:DI 29)
            (pc))) "k.c":2:17 31 {*cbnesi1}
     (int_list:REG_BR_PROB 536868 (nil))
 -> 29)
;;  succ:       3 [0.0% (guessed)]  count:1610592 (estimated locally)
;;              4 [100.0% (guessed)]  count:3219614872 (estimated locally)
(FALLTHRU)
;; lr  out
;; live  out

(note 28 33 35 NOTE_INSN_EPILOGUE_BEG)
;; basic block 4, loop depth 0, count 3219614872 (estimated locally), maybe hot
;;  prev block 3, next block 1, flags: (NEW, RTL, MODIFIED)
;;  pred:       3 [100.0% (guessed)]  count:3219614872 (estimated locally)
(FALLTHRU)
;; bb 4 artificial_defs: { }
;; bb 4 artificial_uses: { u-1(31){ }}
;; lr  in
;; lr  use
;; lr  def
;; live  in
;; live  gen
;; live  kill
(note 35 28 23 4 [bb 4] NOTE_INSN_BASIC_BLOCK)
(insn 23 35 24 4 (use (reg:DI 30 x30)) "k.c":2:1 -1
     (nil))

The second testcase is essentially the same.  We're splitting at atomic_add
that appears immediately before the EPILOGUE_BEG note.


More information about the Gcc-bugs mailing list