https://github.com/topperc created https://github.com/llvm/llvm-project/pull/184736
If the type is rounded to iXLen, an additional zext instruction is generated. For example, https://godbolt.org/z/bG7vG4dvM I'm not 100% sure there's not some reason we need to do this widening. >From bca34933767d44f721e345a96d3146387a51032c Mon Sep 17 00:00:00 2001 From: Craig Topper <[email protected]> Date: Wed, 4 Mar 2026 20:42:24 -0800 Subject: [PATCH] [RISCV] Disable rounding of aggregate return/arguments to iXLen. If the type is rounded to iXLen, an additional zext instruction is generated. For example, https://godbolt.org/z/bG7vG4dvM I'm not 100% sure there's not some reason we need to do this widening. --- clang/lib/CodeGen/Targets/RISCV.cpp | 20 +++-- clang/test/CodeGen/RISCV/abi-empty-structs.c | 56 ++++++------ clang/test/CodeGen/RISCV/bfloat-abi.c | 32 +++---- clang/test/CodeGen/RISCV/riscv32-abi.c | 16 ++-- clang/test/CodeGen/RISCV/riscv64-abi.c | 90 ++++++++++---------- 5 files changed, 103 insertions(+), 111 deletions(-) diff --git a/clang/lib/CodeGen/Targets/RISCV.cpp b/clang/lib/CodeGen/Targets/RISCV.cpp index d1345891e9fb6..a8f0a7941cd0b 100644 --- a/clang/lib/CodeGen/Targets/RISCV.cpp +++ b/clang/lib/CodeGen/Targets/RISCV.cpp @@ -721,18 +721,22 @@ ABIArgInfo RISCVABIInfo::classifyArgumentType(QualType Ty, bool IsFixed, if (Size <= 2 * XLen) { unsigned Alignment = getContext().getTypeAlign(Ty); - // Use a single XLen int if possible, 2*XLen if 2*XLen alignment is - // required, and a 2-element XLen array if only XLen alignment is required. if (Size <= XLen) { + // For big endian, we need to extend the type to XLen. + if (getDataLayout().isBigEndian()) + return ABIArgInfo::getDirect( + llvm::IntegerType::get(getVMContext(), XLen)); + // Otherwise use the smallest integer type we can. return ABIArgInfo::getDirect( - llvm::IntegerType::get(getVMContext(), XLen)); - } else if (Alignment == 2 * XLen) { + llvm::IntegerType::get(getVMContext(), Size)); + } + // Use 2*XLen if 2*XLen alignment is required. + if (Alignment == 2 * XLen) return ABIArgInfo::getDirect( llvm::IntegerType::get(getVMContext(), 2 * XLen)); - } else { - return ABIArgInfo::getDirect(llvm::ArrayType::get( - llvm::IntegerType::get(getVMContext(), XLen), 2)); - } + // Use 2-element XLen array if only XLen alignment is required. + return ABIArgInfo::getDirect(llvm::ArrayType::get( + llvm::IntegerType::get(getVMContext(), XLen), 2)); } return getNaturalAlignIndirect( Ty, /*AddrSpace=*/getDataLayout().getAllocaAddrSpace(), diff --git a/clang/test/CodeGen/RISCV/abi-empty-structs.c b/clang/test/CodeGen/RISCV/abi-empty-structs.c index 5157165787fcb..7d3dfd8cb4ddb 100644 --- a/clang/test/CodeGen/RISCV/abi-empty-structs.c +++ b/clang/test/CodeGen/RISCV/abi-empty-structs.c @@ -1,20 +1,20 @@ // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --filter "^define |^entry:" --version 2 // RUN: %clang_cc1 -triple riscv32 -target-feature +f -target-abi ilp32f -emit-llvm %s -o - \ -// RUN: | FileCheck -check-prefixes=CHECK-C,CHECK32-C %s +// RUN: | FileCheck -check-prefixes=CHECK-C,CHECK32-C,CHECK32-C-F %s // RUN: %clang_cc1 -triple riscv32 -target-feature +f -target-feature +d -target-abi ilp32d -emit-llvm %s -o - \ -// RUN: | FileCheck -check-prefixes=CHECK-C,CHECK32-C %s +// RUN: | FileCheck -check-prefixes=CHECK-C,CHECK32-C,CHECK32-C-D %s // RUN: %clang_cc1 -triple riscv64 -target-feature +f -target-abi lp64f -emit-llvm %s -o - \ -// RUN: | FileCheck -check-prefixes=CHECK-C,CHECK64-C %s +// RUN: | FileCheck -check-prefixes=CHECK-C,CHECK64-C,CHECK64-C-F %s // RUN: %clang_cc1 -triple riscv64 -target-feature +f -target-feature +d -target-abi lp64d -emit-llvm %s -o - \ -// RUN: | FileCheck -check-prefixes=CHECK-C,CHECK64-C %s +// RUN: | FileCheck -check-prefixes=CHECK-C,CHECK64-C,CHECK64-C-D %s // RUN: %clang_cc1 -x c++ -triple riscv32 -target-feature +f -target-abi ilp32f -emit-llvm %s -o - \ -// RUN: | FileCheck -check-prefixes=CHECK-CXX,CHECK32-CXX %s +// RUN: | FileCheck -check-prefixes=CHECK-CXX,CHECK32-CXX,CHECK32-CXX-F %s // RUN: %clang_cc1 -x c++ -triple riscv32 -target-feature +f -target-feature +d -target-abi ilp32d -emit-llvm %s -o - \ -// RUN: | FileCheck -check-prefixes=CHECK-CXX,CHECK32-CXX %s +// RUN: | FileCheck -check-prefixes=CHECK-CXX,CHECK32-CXX,CHECK32-CXX-D %s // RUN: %clang_cc1 -x c++ -triple riscv64 -target-feature +f -target-abi lp64f -emit-llvm %s -o - \ -// RUN: | FileCheck -check-prefixes=CHECK-CXX,CHECK64-CXX %s +// RUN: | FileCheck -check-prefixes=CHECK-CXX,CHECK64-CXX,CHECK64-CXX-F %s // RUN: %clang_cc1 -x c++ -triple riscv64 -target-feature +f -target-feature +d -target-abi lp64d -emit-llvm %s -o - \ -// RUN: | FileCheck -check-prefixes=CHECK-CXX,CHECK64-CXX %s +// RUN: | FileCheck -check-prefixes=CHECK-CXX,CHECK64-CXX,CHECK64-CXX-D %s #include <stdint.h> @@ -157,13 +157,9 @@ struct s9 { // CHECK-C-SAME: () #[[ATTR0]] { // CHECK-C: entry: // -// CHECK32-CXX-LABEL: define dso_local void @_Z7test_s92s9 -// CHECK32-CXX-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { -// CHECK32-CXX: entry: -// -// CHECK64-CXX-LABEL: define dso_local void @_Z7test_s92s9 -// CHECK64-CXX-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { -// CHECK64-CXX: entry: +// CHECK-CXX-LABEL: define dso_local void @_Z7test_s92s9 +// CHECK-CXX-SAME: (i8 [[A_COERCE:%.*]]) #[[ATTR0]] { +// CHECK-CXX: entry: // void test_s9(struct s9 a) {} @@ -172,13 +168,9 @@ struct s10 { }; // CHECK-C-SAME: () #[[ATTR0]] { // CHECK-C: entry: // -// CHECK32-CXX-LABEL: define dso_local i32 @_Z8test_s103s10 -// CHECK32-CXX-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { -// CHECK32-CXX: entry: -// -// CHECK64-CXX-LABEL: define dso_local i64 @_Z8test_s103s10 -// CHECK64-CXX-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { -// CHECK64-CXX: entry: +// CHECK-CXX-LABEL: define dso_local i8 @_Z8test_s103s10 +// CHECK-CXX-SAME: (i8 [[A_COERCE:%.*]]) #[[ATTR0]] { +// CHECK-CXX: entry: // struct s10 test_s10(struct s10 a) { return a; @@ -189,13 +181,9 @@ struct s11 { int : 0; }; // CHECK-C-SAME: () #[[ATTR0]] { // CHECK-C: entry: // -// CHECK32-CXX-LABEL: define dso_local i32 @_Z8test_s113s11 -// CHECK32-CXX-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { -// CHECK32-CXX: entry: -// -// CHECK64-CXX-LABEL: define dso_local i64 @_Z8test_s113s11 -// CHECK64-CXX-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { -// CHECK64-CXX: entry: +// CHECK-CXX-LABEL: define dso_local i8 @_Z8test_s113s11 +// CHECK-CXX-SAME: (i8 [[A_COERCE:%.*]]) #[[ATTR0]] { +// CHECK-CXX: entry: // struct s11 test_s11(struct s11 a) { return a; @@ -223,5 +211,11 @@ int test_s12(int32_t i1, struct s12 a, int32_t i2) { } //// NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: -// CHECK32-C: {{.*}} -// CHECK64-C: {{.*}} +// CHECK32-C-D: {{.*}} +// CHECK32-C-F: {{.*}} +// CHECK32-CXX-D: {{.*}} +// CHECK32-CXX-F: {{.*}} +// CHECK64-C-D: {{.*}} +// CHECK64-C-F: {{.*}} +// CHECK64-CXX-D: {{.*}} +// CHECK64-CXX-F: {{.*}} diff --git a/clang/test/CodeGen/RISCV/bfloat-abi.c b/clang/test/CodeGen/RISCV/bfloat-abi.c index f7c82adaa6d89..cbf5ca445779d 100644 --- a/clang/test/CodeGen/RISCV/bfloat-abi.c +++ b/clang/test/CodeGen/RISCV/bfloat-abi.c @@ -6,35 +6,31 @@ struct bfloat1 { __bf16 a; }; -// CHECK-RV64-LABEL: define dso_local i64 @h1 +// CHECK-RV64-LABEL: define dso_local i16 @h1 // CHECK-RV64-SAME: (bfloat noundef [[A:%.*]]) #[[ATTR0:[0-9]+]] { // CHECK-RV64-NEXT: entry: // CHECK-RV64-NEXT: [[RETVAL:%.*]] = alloca [[STRUCT_BFLOAT1:%.*]], align 2 // CHECK-RV64-NEXT: [[A_ADDR:%.*]] = alloca bfloat, align 2 -// CHECK-RV64-NEXT: [[COERCE_DIVE_COERCE:%.*]] = alloca i64, align 8 // CHECK-RV64-NEXT: store bfloat [[A]], ptr [[A_ADDR]], align 2 // CHECK-RV64-NEXT: [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 2 // CHECK-RV64-NEXT: [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT1]], ptr [[RETVAL]], i32 0, i32 0 // CHECK-RV64-NEXT: store bfloat [[TMP0]], ptr [[A1]], align 2 // CHECK-RV64-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT1]], ptr [[RETVAL]], i32 0, i32 0 -// CHECK-RV64-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[COERCE_DIVE_COERCE]], ptr align 2 [[COERCE_DIVE]], i64 2, i1 false) -// CHECK-RV64-NEXT: [[TMP1:%.*]] = load i64, ptr [[COERCE_DIVE_COERCE]], align 8 -// CHECK-RV64-NEXT: ret i64 [[TMP1]] +// CHECK-RV64-NEXT: [[TMP1:%.*]] = load i16, ptr [[COERCE_DIVE]], align 2 +// CHECK-RV64-NEXT: ret i16 [[TMP1]] // -// CHECK-RV32-LABEL: define dso_local i32 @h1 +// CHECK-RV32-LABEL: define dso_local i16 @h1 // CHECK-RV32-SAME: (bfloat noundef [[A:%.*]]) #[[ATTR0:[0-9]+]] { // CHECK-RV32-NEXT: entry: // CHECK-RV32-NEXT: [[RETVAL:%.*]] = alloca [[STRUCT_BFLOAT1:%.*]], align 2 // CHECK-RV32-NEXT: [[A_ADDR:%.*]] = alloca bfloat, align 2 -// CHECK-RV32-NEXT: [[COERCE_DIVE_COERCE:%.*]] = alloca i32, align 4 // CHECK-RV32-NEXT: store bfloat [[A]], ptr [[A_ADDR]], align 2 // CHECK-RV32-NEXT: [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 2 // CHECK-RV32-NEXT: [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT1]], ptr [[RETVAL]], i32 0, i32 0 // CHECK-RV32-NEXT: store bfloat [[TMP0]], ptr [[A1]], align 2 // CHECK-RV32-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT1]], ptr [[RETVAL]], i32 0, i32 0 -// CHECK-RV32-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[COERCE_DIVE_COERCE]], ptr align 2 [[COERCE_DIVE]], i32 2, i1 false) -// CHECK-RV32-NEXT: [[TMP1:%.*]] = load i32, ptr [[COERCE_DIVE_COERCE]], align 4 -// CHECK-RV32-NEXT: ret i32 [[TMP1]] +// CHECK-RV32-NEXT: [[TMP1:%.*]] = load i16, ptr [[COERCE_DIVE]], align 2 +// CHECK-RV32-NEXT: ret i16 [[TMP1]] // struct bfloat1 h1(__bf16 a) { struct bfloat1 x; @@ -47,13 +43,12 @@ struct bfloat2 { __bf16 b; }; -// CHECK-RV64-LABEL: define dso_local i64 @h2 +// CHECK-RV64-LABEL: define dso_local i32 @h2 // CHECK-RV64-SAME: (bfloat noundef [[A:%.*]], bfloat noundef [[B:%.*]]) #[[ATTR0]] { // CHECK-RV64-NEXT: entry: // CHECK-RV64-NEXT: [[RETVAL:%.*]] = alloca [[STRUCT_BFLOAT2:%.*]], align 2 // CHECK-RV64-NEXT: [[A_ADDR:%.*]] = alloca bfloat, align 2 // CHECK-RV64-NEXT: [[B_ADDR:%.*]] = alloca bfloat, align 2 -// CHECK-RV64-NEXT: [[RETVAL_COERCE:%.*]] = alloca i64, align 8 // CHECK-RV64-NEXT: store bfloat [[A]], ptr [[A_ADDR]], align 2 // CHECK-RV64-NEXT: store bfloat [[B]], ptr [[B_ADDR]], align 2 // CHECK-RV64-NEXT: [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 2 @@ -62,9 +57,8 @@ struct bfloat2 { // CHECK-RV64-NEXT: [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2 // CHECK-RV64-NEXT: [[B2:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT2]], ptr [[RETVAL]], i32 0, i32 1 // CHECK-RV64-NEXT: store bfloat [[TMP1]], ptr [[B2]], align 2 -// CHECK-RV64-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[RETVAL_COERCE]], ptr align 2 [[RETVAL]], i64 4, i1 false) -// CHECK-RV64-NEXT: [[TMP2:%.*]] = load i64, ptr [[RETVAL_COERCE]], align 8 -// CHECK-RV64-NEXT: ret i64 [[TMP2]] +// CHECK-RV64-NEXT: [[TMP2:%.*]] = load i32, ptr [[RETVAL]], align 2 +// CHECK-RV64-NEXT: ret i32 [[TMP2]] // // CHECK-RV32-LABEL: define dso_local i32 @h2 // CHECK-RV32-SAME: (bfloat noundef [[A:%.*]], bfloat noundef [[B:%.*]]) #[[ATTR0]] { @@ -96,14 +90,14 @@ struct bfloat3 { __bf16 c; }; -// CHECK-RV64-LABEL: define dso_local i64 @h3 +// CHECK-RV64-LABEL: define dso_local i48 @h3 // CHECK-RV64-SAME: (bfloat noundef [[A:%.*]], bfloat noundef [[B:%.*]], bfloat noundef [[C:%.*]]) #[[ATTR0]] { // CHECK-RV64-NEXT: entry: // CHECK-RV64-NEXT: [[RETVAL:%.*]] = alloca [[STRUCT_BFLOAT3:%.*]], align 2 // CHECK-RV64-NEXT: [[A_ADDR:%.*]] = alloca bfloat, align 2 // CHECK-RV64-NEXT: [[B_ADDR:%.*]] = alloca bfloat, align 2 // CHECK-RV64-NEXT: [[C_ADDR:%.*]] = alloca bfloat, align 2 -// CHECK-RV64-NEXT: [[RETVAL_COERCE:%.*]] = alloca i64, align 8 +// CHECK-RV64-NEXT: [[RETVAL_COERCE:%.*]] = alloca i48, align 8 // CHECK-RV64-NEXT: store bfloat [[A]], ptr [[A_ADDR]], align 2 // CHECK-RV64-NEXT: store bfloat [[B]], ptr [[B_ADDR]], align 2 // CHECK-RV64-NEXT: store bfloat [[C]], ptr [[C_ADDR]], align 2 @@ -117,8 +111,8 @@ struct bfloat3 { // CHECK-RV64-NEXT: [[C3:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT3]], ptr [[RETVAL]], i32 0, i32 2 // CHECK-RV64-NEXT: store bfloat [[TMP2]], ptr [[C3]], align 2 // CHECK-RV64-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[RETVAL_COERCE]], ptr align 2 [[RETVAL]], i64 6, i1 false) -// CHECK-RV64-NEXT: [[TMP3:%.*]] = load i64, ptr [[RETVAL_COERCE]], align 8 -// CHECK-RV64-NEXT: ret i64 [[TMP3]] +// CHECK-RV64-NEXT: [[TMP3:%.*]] = load i48, ptr [[RETVAL_COERCE]], align 8 +// CHECK-RV64-NEXT: ret i48 [[TMP3]] // // CHECK-RV32-LABEL: define dso_local [2 x i32] @h3 // CHECK-RV32-SAME: (bfloat noundef [[A:%.*]], bfloat noundef [[B:%.*]], bfloat noundef [[C:%.*]]) #[[ATTR0]] { diff --git a/clang/test/CodeGen/RISCV/riscv32-abi.c b/clang/test/CodeGen/RISCV/riscv32-abi.c index 1d7b31642f12a..18e0b13a50b0c 100644 --- a/clang/test/CodeGen/RISCV/riscv32-abi.c +++ b/clang/test/CodeGen/RISCV/riscv32-abi.c @@ -1542,7 +1542,7 @@ struct float16_s { _Float16 f; }; // were a standalone floating-point real. // ILP32-LABEL: define dso_local void @f_float16_s_arg -// ILP32-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { +// ILP32-SAME: (i16 [[A_COERCE:%.*]]) #[[ATTR0]] { // ILP32: entry: // // ILP32F-ILP32D-LABEL: define dso_local void @f_float16_s_arg @@ -1551,7 +1551,7 @@ struct float16_s { _Float16 f; }; // void f_float16_s_arg(struct float16_s a) {} -// ILP32-LABEL: define dso_local i32 @f_ret_float16_s +// ILP32-LABEL: define dso_local i16 @f_ret_float16_s // ILP32-SAME: () #[[ATTR0]] { // ILP32: entry: // @@ -1570,7 +1570,7 @@ struct zbf_float16_s { int : 0; _Float16 f; }; struct zbf_float16_zbf_s { int : 0; _Float16 f; int : 0; }; // ILP32-LABEL: define dso_local void @f_zbf_float16_s_arg -// ILP32-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { +// ILP32-SAME: (i16 [[A_COERCE:%.*]]) #[[ATTR0]] { // ILP32: entry: // // ILP32F-ILP32D-LABEL: define dso_local void @f_zbf_float16_s_arg @@ -1579,7 +1579,7 @@ struct zbf_float16_zbf_s { int : 0; _Float16 f; int : 0; }; // void f_zbf_float16_s_arg(struct zbf_float16_s a) {} -// ILP32-LABEL: define dso_local i32 @f_ret_zbf_float16_s +// ILP32-LABEL: define dso_local i16 @f_ret_zbf_float16_s // ILP32-SAME: () #[[ATTR0]] { // ILP32: entry: // @@ -1854,7 +1854,7 @@ struct float16complex_s f_ret_float16complex_s(void) { struct float16arr1_s { _Float16 a[1]; }; // ILP32-LABEL: define dso_local void @f_float16arr1_s_arg -// ILP32-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { +// ILP32-SAME: (i16 [[A_COERCE:%.*]]) #[[ATTR0]] { // ILP32: entry: // // ILP32F-ILP32D-LABEL: define dso_local void @f_float16arr1_s_arg @@ -1863,7 +1863,7 @@ struct float16arr1_s { _Float16 a[1]; }; // void f_float16arr1_s_arg(struct float16arr1_s a) {} -// ILP32-LABEL: define dso_local i32 @f_ret_float16arr1_s +// ILP32-LABEL: define dso_local i16 @f_ret_float16arr1_s // ILP32-SAME: () #[[ATTR0]] { // ILP32: entry: // @@ -2052,12 +2052,12 @@ struct char_char_float16_s f_ret_char_char_float16_s(void) { union float16_u { _Float16 a; }; // ILP32-ILP32F-ILP32D-LABEL: define dso_local void @f_float16_u_arg -// ILP32-ILP32F-ILP32D-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { +// ILP32-ILP32F-ILP32D-SAME: (i16 [[A_COERCE:%.*]]) #[[ATTR0]] { // ILP32-ILP32F-ILP32D: entry: // void f_float16_u_arg(union float16_u a) {} -// ILP32-ILP32F-ILP32D-LABEL: define dso_local i32 @f_ret_float16_u +// ILP32-ILP32F-ILP32D-LABEL: define dso_local i16 @f_ret_float16_u // ILP32-ILP32F-ILP32D-SAME: () #[[ATTR0]] { // ILP32-ILP32F-ILP32D: entry: // diff --git a/clang/test/CodeGen/RISCV/riscv64-abi.c b/clang/test/CodeGen/RISCV/riscv64-abi.c index 2dc982516b360..fb151372942d0 100644 --- a/clang/test/CodeGen/RISCV/riscv64-abi.c +++ b/clang/test/CodeGen/RISCV/riscv64-abi.c @@ -358,7 +358,7 @@ void f_fpr_tracking(float a, float b, float c, float d, float e, float f, struct float_s { float f; }; // LP64-LABEL: define dso_local void @f_float_s_arg -// LP64-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { +// LP64-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { // LP64: entry: // // LP64F-LP64D-LABEL: define dso_local void @f_float_s_arg @@ -367,7 +367,7 @@ struct float_s { float f; }; // void f_float_s_arg(struct float_s a) {} -// LP64-LABEL: define dso_local i64 @f_ret_float_s +// LP64-LABEL: define dso_local i32 @f_ret_float_s // LP64-SAME: () #[[ATTR0]] { // LP64: entry: // @@ -386,7 +386,7 @@ struct zbf_float_s { int : 0; float f; }; struct zbf_float_zbf_s { int : 0; float f; int : 0; }; // LP64-LABEL: define dso_local void @f_zbf_float_s_arg -// LP64-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { +// LP64-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { // LP64: entry: // // LP64F-LP64D-LABEL: define dso_local void @f_zbf_float_s_arg @@ -395,7 +395,7 @@ struct zbf_float_zbf_s { int : 0; float f; int : 0; }; // void f_zbf_float_s_arg(struct zbf_float_s a) {} -// LP64-LABEL: define dso_local i64 @f_ret_zbf_float_s +// LP64-LABEL: define dso_local i32 @f_ret_zbf_float_s // LP64-SAME: () #[[ATTR0]] { // LP64: entry: // @@ -408,7 +408,7 @@ struct zbf_float_s f_ret_zbf_float_s(void) { } // LP64-LABEL: define dso_local void @f_zbf_float_zbf_s_arg -// LP64-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { +// LP64-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { // LP64: entry: // // LP64F-LP64D-LABEL: define dso_local void @f_zbf_float_zbf_s_arg @@ -417,7 +417,7 @@ struct zbf_float_s f_ret_zbf_float_s(void) { // void f_zbf_float_zbf_s_arg(struct zbf_float_zbf_s a) {} -// LP64-LABEL: define dso_local i64 @f_ret_zbf_float_zbf_s +// LP64-LABEL: define dso_local i32 @f_ret_zbf_float_zbf_s // LP64-SAME: () #[[ATTR0]] { // LP64: entry: // @@ -735,7 +735,7 @@ void f_floatcomplex_s_arg_insufficient_fprs2(float a, struct floatarr1_s { float a[1]; }; // LP64-LABEL: define dso_local void @f_floatarr1_s_arg -// LP64-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { +// LP64-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { // LP64: entry: // // LP64F-LP64D-LABEL: define dso_local void @f_floatarr1_s_arg @@ -744,7 +744,7 @@ struct floatarr1_s { float a[1]; }; // void f_floatarr1_s_arg(struct floatarr1_s a) {} -// LP64-LABEL: define dso_local i64 @f_ret_floatarr1_s +// LP64-LABEL: define dso_local i32 @f_ret_floatarr1_s // LP64-SAME: () #[[ATTR0]] { // LP64: entry: // @@ -917,12 +917,12 @@ struct char_char_float_s f_ret_char_char_float_s(void) { union float_u { float a; }; // LP64-LP64F-LP64D-LABEL: define dso_local void @f_float_u_arg -// LP64-LP64F-LP64D-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { +// LP64-LP64F-LP64D-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { // LP64-LP64F-LP64D: entry: // void f_float_u_arg(union float_u a) {} -// LP64-LP64F-LP64D-LABEL: define dso_local i64 @f_ret_float_u +// LP64-LP64F-LP64D-LABEL: define dso_local i32 @f_ret_float_u // LP64-LP64F-LP64D-SAME: () #[[ATTR0]] { // LP64-LP64F-LP64D: entry: // @@ -1501,7 +1501,7 @@ struct float16_s { _Float16 f; }; // were a standalone floating-point real. // LP64-LABEL: define dso_local void @f_float16_s_arg -// LP64-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { +// LP64-SAME: (i16 [[A_COERCE:%.*]]) #[[ATTR0]] { // LP64: entry: // // LP64F-LP64D-LABEL: define dso_local void @f_float16_s_arg @@ -1510,7 +1510,7 @@ struct float16_s { _Float16 f; }; // void f_float16_s_arg(struct float16_s a) {} -// LP64-LABEL: define dso_local i64 @f_ret_float16_s +// LP64-LABEL: define dso_local i16 @f_ret_float16_s // LP64-SAME: () #[[ATTR0]] { // LP64: entry: // @@ -1529,7 +1529,7 @@ struct zbf_float16_s { int : 0; _Float16 f; }; struct zbf_float16_zbf_s { int : 0; _Float16 f; int : 0; }; // LP64-LABEL: define dso_local void @f_zbf_float16_s_arg -// LP64-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { +// LP64-SAME: (i16 [[A_COERCE:%.*]]) #[[ATTR0]] { // LP64: entry: // // LP64F-LP64D-LABEL: define dso_local void @f_zbf_float16_s_arg @@ -1538,7 +1538,7 @@ struct zbf_float16_zbf_s { int : 0; _Float16 f; int : 0; }; // void f_zbf_float16_s_arg(struct zbf_float16_s a) {} -// LP64-LABEL: define dso_local i64 @f_ret_zbf_float16_s +// LP64-LABEL: define dso_local i16 @f_ret_zbf_float16_s // LP64-SAME: () #[[ATTR0]] { // LP64: entry: // @@ -1551,7 +1551,7 @@ struct zbf_float16_s f_ret_zbf_float16_s(void) { } // LP64-LABEL: define dso_local void @f_zbf_float16_zbf_s_arg -// LP64-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { +// LP64-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { // LP64: entry: // // LP64F-LP64D-LABEL: define dso_local void @f_zbf_float16_zbf_s_arg @@ -1560,7 +1560,7 @@ struct zbf_float16_s f_ret_zbf_float16_s(void) { // void f_zbf_float16_zbf_s_arg(struct zbf_float16_zbf_s a) {} -// LP64-LABEL: define dso_local i64 @f_ret_zbf_float16_zbf_s +// LP64-LABEL: define dso_local i32 @f_ret_zbf_float16_zbf_s // LP64-SAME: () #[[ATTR0]] { // LP64: entry: // @@ -1618,7 +1618,7 @@ struct float16_int64bf_s { _Float16 f; int64_t i : 32; }; struct float16_int8_zbf_s { _Float16 f; int8_t i; int : 0; }; // LP64-LABEL: define dso_local void @f_float16_int8_s_arg -// LP64-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { +// LP64-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { // LP64: entry: // // LP64F-LP64D-LABEL: define dso_local void @f_float16_int8_s_arg @@ -1627,7 +1627,7 @@ struct float16_int8_zbf_s { _Float16 f; int8_t i; int : 0; }; // void f_float16_int8_s_arg(struct float16_int8_s a) {} -// LP64-LABEL: define dso_local i64 @f_ret_float16_int8_s +// LP64-LABEL: define dso_local i32 @f_ret_float16_int8_s // LP64-SAME: () #[[ATTR0]] { // LP64: entry: // @@ -1640,7 +1640,7 @@ struct float16_int8_s f_ret_float16_int8_s(void) { } // LP64-LABEL: define dso_local void @f_float16_uint8_s_arg -// LP64-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { +// LP64-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { // LP64: entry: // // LP64F-LP64D-LABEL: define dso_local void @f_float16_uint8_s_arg @@ -1649,7 +1649,7 @@ struct float16_int8_s f_ret_float16_int8_s(void) { // void f_float16_uint8_s_arg(struct float16_uint8_s a) {} -// LP64-LABEL: define dso_local i64 @f_ret_float16_uint8_s +// LP64-LABEL: define dso_local i32 @f_ret_float16_uint8_s // LP64-SAME: () #[[ATTR0]] { // LP64: entry: // @@ -1731,7 +1731,7 @@ struct float16_int64bf_s f_ret_float16_int64bf_s(void) { // floating point calling convention. // LP64-LABEL: define dso_local void @f_float16_int8_zbf_s -// LP64-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { +// LP64-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { // LP64: entry: // // LP64F-LP64D-LABEL: define dso_local void @f_float16_int8_zbf_s @@ -1740,7 +1740,7 @@ struct float16_int64bf_s f_ret_float16_int64bf_s(void) { // void f_float16_int8_zbf_s(struct float16_int8_zbf_s a) {} -// LP64-LABEL: define dso_local i64 @f_ret_float16_int8_zbf_s +// LP64-LABEL: define dso_local i32 @f_ret_float16_int8_zbf_s // LP64-SAME: () #[[ATTR0]] { // LP64: entry: // @@ -1753,14 +1753,14 @@ struct float16_int8_zbf_s f_ret_float16_int8_zbf_s(void) { } // LP64-LP64F-LP64D-LABEL: define dso_local void @f_float16_int8_s_arg_insufficient_gprs -// LP64-LP64F-LP64D-SAME: (i32 noundef signext [[A:%.*]], i32 noundef signext [[B:%.*]], i32 noundef signext [[C:%.*]], i32 noundef signext [[D:%.*]], i32 noundef signext [[E:%.*]], i32 noundef signext [[F:%.*]], i32 noundef signext [[G:%.*]], i32 noundef signext [[H:%.*]], i64 [[I_COERCE:%.*]]) #[[ATTR0]] { +// LP64-LP64F-LP64D-SAME: (i32 noundef signext [[A:%.*]], i32 noundef signext [[B:%.*]], i32 noundef signext [[C:%.*]], i32 noundef signext [[D:%.*]], i32 noundef signext [[E:%.*]], i32 noundef signext [[F:%.*]], i32 noundef signext [[G:%.*]], i32 noundef signext [[H:%.*]], i32 [[I_COERCE:%.*]]) #[[ATTR0]] { // LP64-LP64F-LP64D: entry: // void f_float16_int8_s_arg_insufficient_gprs(int a, int b, int c, int d, int e, int f, int g, int h, struct float16_int8_s i) {} // LP64-LABEL: define dso_local void @f_struct_float16_int8_insufficient_fprs -// LP64-SAME: (float noundef [[A:%.*]], double noundef [[B:%.*]], double noundef [[C:%.*]], double noundef [[D:%.*]], double noundef [[E:%.*]], double noundef [[F:%.*]], double noundef [[G:%.*]], double noundef [[H:%.*]], i64 [[I_COERCE:%.*]]) #[[ATTR0]] { +// LP64-SAME: (float noundef [[A:%.*]], double noundef [[B:%.*]], double noundef [[C:%.*]], double noundef [[D:%.*]], double noundef [[E:%.*]], double noundef [[F:%.*]], double noundef [[G:%.*]], double noundef [[H:%.*]], i32 [[I_COERCE:%.*]]) #[[ATTR0]] { // LP64: entry: // // LP64F-LABEL: define dso_local void @f_struct_float16_int8_insufficient_fprs @@ -1768,7 +1768,7 @@ void f_float16_int8_s_arg_insufficient_gprs(int a, int b, int c, int d, int e, // LP64F: entry: // // LP64D-LABEL: define dso_local void @f_struct_float16_int8_insufficient_fprs -// LP64D-SAME: (float noundef [[A:%.*]], double noundef [[B:%.*]], double noundef [[C:%.*]], double noundef [[D:%.*]], double noundef [[E:%.*]], double noundef [[F:%.*]], double noundef [[G:%.*]], double noundef [[H:%.*]], i64 [[I_COERCE:%.*]]) #[[ATTR0]] { +// LP64D-SAME: (float noundef [[A:%.*]], double noundef [[B:%.*]], double noundef [[C:%.*]], double noundef [[D:%.*]], double noundef [[E:%.*]], double noundef [[F:%.*]], double noundef [[G:%.*]], double noundef [[H:%.*]], i32 [[I_COERCE:%.*]]) #[[ATTR0]] { // LP64D: entry: // void f_struct_float16_int8_insufficient_fprs(float a, double b, double c, double d, @@ -1778,7 +1778,7 @@ void f_struct_float16_int8_insufficient_fprs(float a, double b, double c, double // floating-point value should be passed as if it were an fp+fp struct. // LP64-LABEL: define dso_local void @f_float16complex -// LP64-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { +// LP64-SAME: (i32 noundef [[A_COERCE:%.*]]) #[[ATTR0]] { // LP64: entry: // // LP64F-LP64D-LABEL: define dso_local void @f_float16complex @@ -1787,7 +1787,7 @@ void f_struct_float16_int8_insufficient_fprs(float a, double b, double c, double // void f_float16complex(_Float16 __complex__ a) {} -// LP64-LABEL: define dso_local i64 @f_ret_float16complex +// LP64-LABEL: define dso_local i32 @f_ret_float16complex // LP64-SAME: () #[[ATTR0]] { // LP64: entry: // @@ -1802,7 +1802,7 @@ _Float16 __complex__ f_ret_float16complex(void) { struct float16complex_s { _Float16 __complex__ c; }; // LP64-LABEL: define dso_local void @f_float16complex_s_arg -// LP64-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { +// LP64-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { // LP64: entry: // // LP64F-LP64D-LABEL: define dso_local void @f_float16complex_s_arg @@ -1811,7 +1811,7 @@ struct float16complex_s { _Float16 __complex__ c; }; // void f_float16complex_s_arg(struct float16complex_s a) {} -// LP64-LABEL: define dso_local i64 @f_ret_float16complex_s +// LP64-LABEL: define dso_local i32 @f_ret_float16complex_s // LP64-SAME: () #[[ATTR0]] { // LP64: entry: // @@ -1829,7 +1829,7 @@ struct float16complex_s f_ret_float16complex_s(void) { struct float16arr1_s { _Float16 a[1]; }; // LP64-LABEL: define dso_local void @f_float16arr1_s_arg -// LP64-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { +// LP64-SAME: (i16 [[A_COERCE:%.*]]) #[[ATTR0]] { // LP64: entry: // // LP64F-LP64D-LABEL: define dso_local void @f_float16arr1_s_arg @@ -1838,7 +1838,7 @@ struct float16arr1_s { _Float16 a[1]; }; // void f_float16arr1_s_arg(struct float16arr1_s a) {} -// LP64-LABEL: define dso_local i64 @f_ret_float16arr1_s +// LP64-LABEL: define dso_local i16 @f_ret_float16arr1_s // LP64-SAME: () #[[ATTR0]] { // LP64: entry: // @@ -1853,7 +1853,7 @@ struct float16arr1_s f_ret_float16arr1_s(void) { struct float16arr2_s { _Float16 a[2]; }; // LP64-LABEL: define dso_local void @f_float16arr2_s_arg -// LP64-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { +// LP64-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { // LP64: entry: // // LP64F-LP64D-LABEL: define dso_local void @f_float16arr2_s_arg @@ -1862,7 +1862,7 @@ struct float16arr2_s { _Float16 a[2]; }; // void f_float16arr2_s_arg(struct float16arr2_s a) {} -// LP64-LABEL: define dso_local i64 @f_ret_float16arr2_s +// LP64-LABEL: define dso_local i32 @f_ret_float16arr2_s // LP64-SAME: () #[[ATTR0]] { // LP64: entry: // @@ -1877,7 +1877,7 @@ struct float16arr2_s f_ret_float16arr2_s(void) { struct float16arr2_tricky1_s { struct { _Float16 f[1]; } g[2]; }; // LP64-LABEL: define dso_local void @f_float16arr2_tricky1_s_arg -// LP64-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { +// LP64-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { // LP64: entry: // // LP64F-LP64D-LABEL: define dso_local void @f_float16arr2_tricky1_s_arg @@ -1886,7 +1886,7 @@ struct float16arr2_tricky1_s { struct { _Float16 f[1]; } g[2]; }; // void f_float16arr2_tricky1_s_arg(struct float16arr2_tricky1_s a) {} -// LP64-LABEL: define dso_local i64 @f_ret_float16arr2_tricky1_s +// LP64-LABEL: define dso_local i32 @f_ret_float16arr2_tricky1_s // LP64-SAME: () #[[ATTR0]] { // LP64: entry: // @@ -1901,7 +1901,7 @@ struct float16arr2_tricky1_s f_ret_float16arr2_tricky1_s(void) { struct float16arr2_tricky2_s { struct {}; struct { _Float16 f[1]; } g[2]; }; // LP64-LABEL: define dso_local void @f_float16arr2_tricky2_s_arg -// LP64-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { +// LP64-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { // LP64: entry: // // LP64F-LP64D-LABEL: define dso_local void @f_float16arr2_tricky2_s_arg @@ -1910,7 +1910,7 @@ struct float16arr2_tricky2_s { struct {}; struct { _Float16 f[1]; } g[2]; }; // void f_float16arr2_tricky2_s_arg(struct float16arr2_tricky2_s a) {} -// LP64-LABEL: define dso_local i64 @f_ret_float16arr2_tricky2_s +// LP64-LABEL: define dso_local i32 @f_ret_float16arr2_tricky2_s // LP64-SAME: () #[[ATTR0]] { // LP64: entry: // @@ -1925,7 +1925,7 @@ struct float16arr2_tricky2_s f_ret_float16arr2_tricky2_s(void) { struct float16arr2_tricky3_s { union {}; struct { _Float16 f[1]; } g[2]; }; // LP64-LABEL: define dso_local void @f_float16arr2_tricky3_s_arg -// LP64-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { +// LP64-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { // LP64: entry: // // LP64F-LP64D-LABEL: define dso_local void @f_float16arr2_tricky3_s_arg @@ -1934,7 +1934,7 @@ struct float16arr2_tricky3_s { union {}; struct { _Float16 f[1]; } g[2]; }; // void f_float16arr2_tricky3_s_arg(struct float16arr2_tricky3_s a) {} -// LP64-LABEL: define dso_local i64 @f_ret_float16arr2_tricky3_s +// LP64-LABEL: define dso_local i32 @f_ret_float16arr2_tricky3_s // LP64-SAME: () #[[ATTR0]] { // LP64: entry: // @@ -1949,7 +1949,7 @@ struct float16arr2_tricky3_s f_ret_float16arr2_tricky3_s(void) { struct float16arr2_tricky4_s { union {}; struct { struct {}; _Float16 f[1]; } g[2]; }; // LP64-LABEL: define dso_local void @f_float16arr2_tricky4_s_arg -// LP64-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { +// LP64-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { // LP64: entry: // // LP64F-LP64D-LABEL: define dso_local void @f_float16arr2_tricky4_s_arg @@ -1958,7 +1958,7 @@ struct float16arr2_tricky4_s { union {}; struct { struct {}; _Float16 f[1]; } g[ // void f_float16arr2_tricky4_s_arg(struct float16arr2_tricky4_s a) {} -// LP64-LABEL: define dso_local i64 @f_ret_float16arr2_tricky4_s +// LP64-LABEL: define dso_local i32 @f_ret_float16arr2_tricky4_s // LP64-SAME: () #[[ATTR0]] { // LP64: entry: // @@ -2016,12 +2016,12 @@ struct int64_float16_s f_ret_int64_float16_s(void) { struct char_char_float16_s { char a; char b; _Float16 c; }; // LP64-LP64F-LP64D-LABEL: define dso_local void @f_char_char_float16_s_arg -// LP64-LP64F-LP64D-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { +// LP64-LP64F-LP64D-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { // LP64-LP64F-LP64D: entry: // void f_char_char_float16_s_arg(struct char_char_float16_s a) {} -// LP64-LP64F-LP64D-LABEL: define dso_local i64 @f_ret_char_char_float16_s +// LP64-LP64F-LP64D-LABEL: define dso_local i32 @f_ret_char_char_float16_s // LP64-LP64F-LP64D-SAME: () #[[ATTR0]] { // LP64-LP64F-LP64D: entry: // @@ -2035,12 +2035,12 @@ struct char_char_float16_s f_ret_char_char_float16_s(void) { union float16_u { _Float16 a; }; // LP64-LP64F-LP64D-LABEL: define dso_local void @f_float16_u_arg -// LP64-LP64F-LP64D-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { +// LP64-LP64F-LP64D-SAME: (i16 [[A_COERCE:%.*]]) #[[ATTR0]] { // LP64-LP64F-LP64D: entry: // void f_float16_u_arg(union float16_u a) {} -// LP64-LP64F-LP64D-LABEL: define dso_local i64 @f_ret_float16_u +// LP64-LP64F-LP64D-LABEL: define dso_local i16 @f_ret_float16_u // LP64-LP64F-LP64D-SAME: () #[[ATTR0]] { // LP64-LP64F-LP64D: entry: // _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
