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

            Bug ID: 91919
           Summary: [10 Regression] arm-linux-eabi ICE with building
                    kernel
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: law at redhat dot com
  Target Milestone: ---

> commit fa761b10d40aaa71e62fbc0c9f2ab8fc07a98b49 (HEAD, refs/bisect/bad)
> Author: wilco <wilco@138bc75d-0d04-0410-961f-82ee72b054a4>
> Date:   Wed Sep 18 18:33:30 2019 +0000
>
>     [ARM] Cleanup 64-bit multiplies
>     
>     Cleanup 64-bit multiplies.  Combine the expanders using iterators.
>     Merge the signed/unsigned multiplies as well as the pre-Armv6 and Armv6
>     variants.  Split DImode operands early into parallel sets inside the
>     MULL/MLAL instructions - this improves register allocation and avoids
>     subreg issues due to other DImode operations splitting early.
>     
>         gcc/
>             * config/arm/arm.md (maddsidi4): Remove expander.
>             (mulsidi3adddi): Remove pattern.
>             (mulsidi3adddi_v6): Likewise.
>             (mulsidi3_nov6): Likewise.
>             (mulsidi3_v6): Likewise.
>             (umulsidi3): Remove expander.
>             (umulsidi3_nov6): Remove pattern.
>             (umulsidi3_v6): Likewise.
>             (umulsidi3adddi): Likewise.
>             (umulsidi3adddi_v6): Likewise.
>             (<Us>mulsidi3): Add combined expander.
>             (<Us>maddsidi4): Likewise.
>             (<US>mull): Add combined umull and smull pattern.
>             (<US>mlal): Likewise.
>             * config/arm/iterators.md (Us): Add new iterator.

Is causing the linux kernel to fail to build for arm-linux-gnueabi.

-O2 with this testcase:

__extension__ typedef unsigned long long __u64;
typedef __u64 u64;
static inline unsigned long
__timespec64_to_jiffies (u64 sec, long nsec)
{
  return ((sec *
           ((unsigned
             long) ((((u64) 1000000000L << (32 - 7)) +
                     ((1000000000L + 100 / 2) / 100) -
                     1) / (u64) ((1000000000L + 100 / 2) / 100)))) +
          (((u64) nsec *
            ((unsigned
              long) ((((u64) 1 << ((32 - 7) + 29)) +
                      ((1000000000L + 100 / 2) / 100) -
                      1) / (u64) ((1000000000L + 100 / 2) / 100)))) >>
(((32 -

 7) +

29) -

(32 -

7))))
    >> (32 - 7);
}

unsigned long
__timespec_to_jiffies (unsigned long sec, long nsec)
{
  return __timespec64_to_jiffies ((u64) sec, nsec);
}


(insn 14 13 16 2 (parallel [
            (set (reg:SI 132)
                (plus:SI (mult:SI (zero_extend:DI (reg/v:SI 115 [ sec ]))
                        (zero_extend:DI (reg:SI 124)))
                    (reg:SI 130)))
   ...)

Jakub noted the mode of the mult is SImode, while the operands are DImode. 
That's not valid RTL.

Reply via email to