[all-commits] [llvm/llvm-project] 476018: [LoongArch] Define `ual` feature and override `all...

Lu Weining via All-commits all-commits at lists.llvm.org
Tue Jun 6 22:41:40 PDT 2023


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 47601815ec3a4f31c797c75748af08acfabc46dc
      https://github.com/llvm/llvm-project/commit/47601815ec3a4f31c797c75748af08acfabc46dc
  Author: Weining Lu <luweining at loongson.cn>
  Date:   2023-06-07 (Wed, 07 Jun 2023)

  Changed paths:
    M clang/include/clang/Driver/Options.td
    M clang/lib/Driver/ToolChains/Arch/LoongArch.cpp
    M clang/test/Driver/loongarch-default-features.c
    M clang/test/Driver/loongarch-march.c
    M clang/test/Driver/loongarch-mdouble-float.c
    M clang/test/Driver/loongarch-mfpu.c
    M clang/test/Driver/loongarch-msingle-float.c
    M clang/test/Driver/loongarch-msoft-float.c
    A clang/test/Driver/loongarch-munaligned-access.c
    A clang/test/Driver/munaligned-access-unused.c
    M llvm/include/llvm/TargetParser/LoongArchTargetParser.def
    M llvm/include/llvm/TargetParser/LoongArchTargetParser.h
    M llvm/lib/Target/LoongArch/LoongArch.td
    M llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
    M llvm/lib/Target/LoongArch/LoongArchISelLowering.h
    M llvm/lib/Target/LoongArch/LoongArchSubtarget.h
    M llvm/test/CodeGen/LoongArch/calling-conv-common.ll
    M llvm/test/CodeGen/LoongArch/ir-instruction/atomicrmw-fp.ll
    M llvm/test/CodeGen/LoongArch/tail-calls.ll
    A llvm/test/CodeGen/LoongArch/unaligned-access.ll
    A llvm/test/CodeGen/LoongArch/unaligned-memcpy-inline.ll

  Log Message:
  -----------
  [LoongArch] Define `ual` feature and override `allowsMisalignedMemoryAccesses`

Some CPUs do not allow memory accesses to be unaligned, e.g. 2k1000la
who uses the la264 core on which misaligned access will trigger an
exception.

In this patch, a backend feature called `ual` is defined to decribe
whether the CPU supports unaligned memroy accesses. And this feature
can be toggled by clang options `-m[no-]unaligned-access` or the
aliases `-m[no-]strict-align`. When this feature is on,
`allowsMisalignedMemoryAccesses` sets the speed number to 1 and returns
true that allows the codegen to generate unaligned memory access insns.

Clang options `-m[no-]unaligned-access` are moved from `m_arm_Features_Group`
to `m_Group` because now more than one targets use them. And a test
is added to show that they remain unused on a target that does not
support them. In addition, to keep compatible with gcc, a new alias
`-mno-strict-align` is added which is equal to `-munaligned-access`.

The feature name `ual` is consistent with linux kernel [1] and the
output of `lscpu` or `/proc/cpuinfo` [2].

There is an `LLT` variant of `allowsMisalignedMemoryAccesses`, but
seems that curently it is only used in GlobalISel which LoongArch
doesn't support yet. So this variant is not implemented in this patch.

[1]: https://github.com/torvalds/linux/blob/master/arch/loongarch/include/asm/cpu.h#L77
[2]: https://github.com/torvalds/linux/blob/master/arch/loongarch/kernel/proc.c#L75

Reviewed By: xen0n

Differential Revision: https://reviews.llvm.org/D149946




More information about the All-commits mailing list