
So far, flang was not setting argument attributes on direct calls
assuming that putting them on the function operation was enough.
It was clarified in
38565da525
that they must be set on both call and functions, even for direct calls.
Crashes have been observed because of the lack of the attribute when
compiling `abs(x)` at `O2` and above on X86-64 for complex(16).
30 lines
1.5 KiB
Plaintext
30 lines
1.5 KiB
Plaintext
/// Test i32 passing and returning on LoongArch64
|
|
/// LoongArch64 LP64D ABI requires unsigned 32 bit integers to be sign extended.
|
|
|
|
// RUN: fir-opt --target-rewrite="target=loongarch64-unknown-linux-gnu" %s | FileCheck %s --check-prefix=LOONGARCH64
|
|
// RUN: tco -target="loongarch64-unknown-linux-gnu" %s | FileCheck %s --check-prefix=LOONGARCH64_LLVM
|
|
|
|
module attributes {fir.defaultkind = "a1c4d8i4l4r4", fir.kindmap = "", llvm.data_layout = "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128", llvm.target_triple = "loongarch64-unknown-linux-gnu"} {
|
|
|
|
// LOONGARCH64: func.func private @cfunc32(i32 {llvm.signext}) -> (i32 {llvm.signext}) attributes {fir.bindc_name = "cfunc32"}
|
|
|
|
// LOONGARCH64_LLVM: declare signext i32 @cfunc32(i32 signext)
|
|
func.func private @cfunc32(i32) -> i32 attributes {fir.bindc_name = "cfunc32"}
|
|
|
|
// LOONGARCH64-LABEL: func.func @foo(
|
|
// LOONGARCH64-SAME: %[[VAL_0:.*]]: i32 {llvm.signext}) -> (i32 {llvm.signext}) attributes {fir.bindc_name = "foo"} {
|
|
// LOONGARCH64: %[[VAL_1:.*]] = fir.call @cfunc32(%[[VAL_0]]) fastmath<contract> : (i32) -> i32
|
|
// LOONGARCH64: return %[[VAL_1]] : i32
|
|
// LOONGARCH64: }
|
|
|
|
// LOONGARCH64_LLVM-LABEL: define signext i32 @foo(
|
|
// LOONGARCH64_LLVM: i32 signext %[[VAL_0:.*]]) {
|
|
// LOONGARCH64_LLVM: %[[VAL_1:.*]] = call i32 @cfunc32(i32 %[[VAL_0]])
|
|
// LOONGARCH64_LLVM: ret i32 %[[VAL_1]]
|
|
// LOONGARCH64_LLVM: }
|
|
func.func @foo(%0: i32) -> i32 attributes {fir.bindc_name = "foo"} {
|
|
%1 = fir.call @cfunc32(%0) fastmath<contract> : (i32) -> i32
|
|
return %1 : i32
|
|
}
|
|
}
|