[all-commits] [llvm/llvm-project] f9d932: [clang][AArch64] Correctly align HFA arguments whe...

Momchil Velikov via All-commits all-commits at lists.llvm.org
Thu Apr 15 14:58:56 PDT 2021


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: f9d932e6735afe73117e142a12443449f2197e69
      https://github.com/llvm/llvm-project/commit/f9d932e6735afe73117e142a12443449f2197e69
  Author: Momchil Velikov <momchil.velikov at arm.com>
  Date:   2021-04-15 (Thu, 15 Apr 2021)

  Changed paths:
    M clang/include/clang/CodeGen/CGFunctionInfo.h
    M clang/lib/CodeGen/CGCall.cpp
    M clang/lib/CodeGen/TargetInfo.cpp
    A clang/test/CodeGen/aarch64-args-hfa.c
    M llvm/docs/LangRef.rst
    M llvm/include/llvm/CodeGen/TargetCallingConv.h
    M llvm/include/llvm/IR/Argument.h
    M llvm/include/llvm/IR/Attributes.h
    M llvm/include/llvm/IR/Function.h
    M llvm/include/llvm/IR/InstrTypes.h
    M llvm/lib/AsmParser/LLParser.cpp
    M llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
    M llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
    M llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
    M llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
    M llvm/lib/IR/Attributes.cpp
    M llvm/lib/IR/Function.cpp
    M llvm/lib/IR/Verifier.cpp
    M llvm/lib/Target/AArch64/AArch64CallingConvention.cpp
    M llvm/test/Bitcode/compatibility.ll
    A llvm/test/CodeGen/AArch64/arm64-abi-hfa-args.ll

  Log Message:
  -----------
  [clang][AArch64] Correctly align HFA arguments when passed on the stack

When we pass a AArch64 Homogeneous Floating-Point
Aggregate (HFA) argument with increased alignment
requirements, for example

    struct S {
      __attribute__ ((__aligned__(16))) double v[4];
    };

Clang uses `[4 x double]` for the parameter, which is passed
on the stack at alignment 8, whereas it should be at
alignment 16, following Rule C.4 in
AAPCS (https://github.com/ARM-software/abi-aa/blob/master/aapcs64/aapcs64.rst#642parameter-passing-rules)

Currently we don't have a way to express in LLVM IR the
alignment requirements of the function arguments. The align
attribute is applicable to pointers only, and only for some
special ways of passing arguments (e..g byval). When
implementing AAPCS32/AAPCS64, clang resorts to dubious hacks
of coercing to types, which naturally have the needed
alignment. We don't have enough types to cover all the
cases, though.

This patch introduces a new use of the stackalign attribute
to control stack slot alignment, when and if an argument is
passed in memory.

The attribute align is left as an optimizer hint - it still
applies to pointer types only and pertains to the content of
the pointer, whereas the alignment of the pointer itself is
determined by the stackalign attribute.

For byval arguments, the stackalign attribute assumes the
role, previously perfomed by align, falling back to align if
stackalign` is absent.

On the clang side, when passing arguments using the "direct"
style (cf. `ABIArgInfo::Kind`), now we can optionally
specify an alignment, which is emitted as the new
`stackalign` attribute.

Patch by Momchil Velikov and Lucas Prates.

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




More information about the All-commits mailing list