1e3c57fddSAlex Bradbury // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --filter "^define |^entry:" --version 2 2a742511cSAlex Bradbury // RUN: %clang_cc1 -triple riscv32 -target-feature +f -target-abi ilp32f -emit-llvm %s -o - \ 3a742511cSAlex Bradbury // RUN: | FileCheck -check-prefixes=CHECK-C,CHECK32-C %s 4a742511cSAlex Bradbury // RUN: %clang_cc1 -triple riscv32 -target-feature +f -target-feature +d -target-abi ilp32d -emit-llvm %s -o - \ 5a742511cSAlex Bradbury // RUN: | FileCheck -check-prefixes=CHECK-C,CHECK32-C %s 6a742511cSAlex Bradbury // RUN: %clang_cc1 -triple riscv64 -target-feature +f -target-abi lp64f -emit-llvm %s -o - \ 7a742511cSAlex Bradbury // RUN: | FileCheck -check-prefixes=CHECK-C,CHECK64-C %s 8a742511cSAlex Bradbury // RUN: %clang_cc1 -triple riscv64 -target-feature +f -target-feature +d -target-abi lp64d -emit-llvm %s -o - \ 9a742511cSAlex Bradbury // RUN: | FileCheck -check-prefixes=CHECK-C,CHECK64-C %s 10a742511cSAlex Bradbury // RUN: %clang_cc1 -x c++ -triple riscv32 -target-feature +f -target-abi ilp32f -emit-llvm %s -o - \ 11a742511cSAlex Bradbury // RUN: | FileCheck -check-prefixes=CHECK-CXX,CHECK32-CXX %s 12a742511cSAlex Bradbury // RUN: %clang_cc1 -x c++ -triple riscv32 -target-feature +f -target-feature +d -target-abi ilp32d -emit-llvm %s -o - \ 13a742511cSAlex Bradbury // RUN: | FileCheck -check-prefixes=CHECK-CXX,CHECK32-CXX %s 14a742511cSAlex Bradbury // RUN: %clang_cc1 -x c++ -triple riscv64 -target-feature +f -target-abi lp64f -emit-llvm %s -o - \ 15a742511cSAlex Bradbury // RUN: | FileCheck -check-prefixes=CHECK-CXX,CHECK64-CXX %s 16a742511cSAlex Bradbury // RUN: %clang_cc1 -x c++ -triple riscv64 -target-feature +f -target-feature +d -target-abi lp64d -emit-llvm %s -o - \ 17a742511cSAlex Bradbury // RUN: | FileCheck -check-prefixes=CHECK-CXX,CHECK64-CXX %s 18a742511cSAlex Bradbury 19a742511cSAlex Bradbury #include <stdint.h> 20a742511cSAlex Bradbury 21a742511cSAlex Bradbury // Fields containing empty structs or unions are ignored when flattening 22e3c57fddSAlex Bradbury // structs for the hard FP ABIs, even in C++. The rules for arrays of empty 23e3c57fddSAlex Bradbury // structs or unions are subtle and documented in 24e3c57fddSAlex Bradbury // <https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-cc.adoc#hardware-floating-point-calling-convention>. 25a742511cSAlex Bradbury 26a742511cSAlex Bradbury struct empty { struct { struct { } e; }; }; 27a742511cSAlex Bradbury struct s1 { struct empty e; float f; }; 28a742511cSAlex Bradbury 29a742511cSAlex Bradbury // CHECK-C-LABEL: define dso_local float @test_s1 30a742511cSAlex Bradbury // CHECK-C-SAME: (float [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] { 31a742511cSAlex Bradbury // CHECK-C: entry: 32a742511cSAlex Bradbury // 33e3c57fddSAlex Bradbury // CHECK-CXX-LABEL: define dso_local float @_Z7test_s12s1 34e3c57fddSAlex Bradbury // CHECK-CXX-SAME: (float [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] { 35e3c57fddSAlex Bradbury // CHECK-CXX: entry: 36a742511cSAlex Bradbury // 37a742511cSAlex Bradbury struct s1 test_s1(struct s1 a) { 38a742511cSAlex Bradbury return a; 39a742511cSAlex Bradbury } 40a742511cSAlex Bradbury 41a742511cSAlex Bradbury struct s2 { struct empty e; int32_t i; float f; }; 42a742511cSAlex Bradbury 43a742511cSAlex Bradbury // CHECK-C-LABEL: define dso_local { i32, float } @test_s2 44a742511cSAlex Bradbury // CHECK-C-SAME: (i32 [[TMP0:%.*]], float [[TMP1:%.*]]) #[[ATTR0]] { 45a742511cSAlex Bradbury // CHECK-C: entry: 46a742511cSAlex Bradbury // 47e3c57fddSAlex Bradbury // CHECK-CXX-LABEL: define dso_local { i32, float } @_Z7test_s22s2 48e3c57fddSAlex Bradbury // CHECK-CXX-SAME: (i32 [[TMP0:%.*]], float [[TMP1:%.*]]) #[[ATTR0]] { 49e3c57fddSAlex Bradbury // CHECK-CXX: entry: 50a742511cSAlex Bradbury // 51a742511cSAlex Bradbury struct s2 test_s2(struct s2 a) { 52a742511cSAlex Bradbury return a; 53a742511cSAlex Bradbury } 54a742511cSAlex Bradbury 55a742511cSAlex Bradbury struct s3 { struct empty e; float f; float g; }; 56a742511cSAlex Bradbury 57a742511cSAlex Bradbury // CHECK-C-LABEL: define dso_local { float, float } @test_s3 58a742511cSAlex Bradbury // CHECK-C-SAME: (float [[TMP0:%.*]], float [[TMP1:%.*]]) #[[ATTR0]] { 59a742511cSAlex Bradbury // CHECK-C: entry: 60a742511cSAlex Bradbury // 61e3c57fddSAlex Bradbury // CHECK-CXX-LABEL: define dso_local { float, float } @_Z7test_s32s3 62e3c57fddSAlex Bradbury // CHECK-CXX-SAME: (float [[TMP0:%.*]], float [[TMP1:%.*]]) #[[ATTR0]] { 63e3c57fddSAlex Bradbury // CHECK-CXX: entry: 64a742511cSAlex Bradbury // 65a742511cSAlex Bradbury struct s3 test_s3(struct s3 a) { 66a742511cSAlex Bradbury return a; 67a742511cSAlex Bradbury } 68a742511cSAlex Bradbury 69a742511cSAlex Bradbury struct s4 { struct empty e; float __complex__ c; }; 70a742511cSAlex Bradbury 71a742511cSAlex Bradbury // CHECK-C-LABEL: define dso_local { float, float } @test_s4 72a742511cSAlex Bradbury // CHECK-C-SAME: (float [[TMP0:%.*]], float [[TMP1:%.*]]) #[[ATTR0]] { 73a742511cSAlex Bradbury // CHECK-C: entry: 74a742511cSAlex Bradbury // 75e3c57fddSAlex Bradbury // CHECK-CXX-LABEL: define dso_local { float, float } @_Z7test_s42s4 76e3c57fddSAlex Bradbury // CHECK-CXX-SAME: (float [[TMP0:%.*]], float [[TMP1:%.*]]) #[[ATTR0]] { 77e3c57fddSAlex Bradbury // CHECK-CXX: entry: 78a742511cSAlex Bradbury // 79a742511cSAlex Bradbury struct s4 test_s4(struct s4 a) { 80a742511cSAlex Bradbury return a; 81a742511cSAlex Bradbury } 82a742511cSAlex Bradbury 83a742511cSAlex Bradbury // An array of empty fields isn't ignored in C++ (this isn't explicit in the 84a742511cSAlex Bradbury // psABI, but matches observed g++ behaviour). 85a742511cSAlex Bradbury 86a742511cSAlex Bradbury struct s5 { struct empty e[1]; float f; }; 87a742511cSAlex Bradbury 88a742511cSAlex Bradbury // CHECK-C-LABEL: define dso_local float @test_s5 89a742511cSAlex Bradbury // CHECK-C-SAME: (float [[TMP0:%.*]]) #[[ATTR0]] { 90a742511cSAlex Bradbury // CHECK-C: entry: 91a742511cSAlex Bradbury // 92a742511cSAlex Bradbury // CHECK32-CXX-LABEL: define dso_local [2 x i32] @_Z7test_s52s5 93a742511cSAlex Bradbury // CHECK32-CXX-SAME: ([2 x i32] [[A_COERCE:%.*]]) #[[ATTR0]] { 94a742511cSAlex Bradbury // CHECK32-CXX: entry: 95a742511cSAlex Bradbury // 96a742511cSAlex Bradbury // CHECK64-CXX-LABEL: define dso_local i64 @_Z7test_s52s5 97a742511cSAlex Bradbury // CHECK64-CXX-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { 98a742511cSAlex Bradbury // CHECK64-CXX: entry: 99a742511cSAlex Bradbury // 100a742511cSAlex Bradbury struct s5 test_s5(struct s5 a) { 101a742511cSAlex Bradbury return a; 102a742511cSAlex Bradbury } 103a742511cSAlex Bradbury 104a742511cSAlex Bradbury struct empty_arr { struct { struct { } e[1]; }; }; 105a742511cSAlex Bradbury struct s6 { struct empty_arr e; float f; }; 106a742511cSAlex Bradbury 107a742511cSAlex Bradbury // CHECK-C-LABEL: define dso_local float @test_s6 108a742511cSAlex Bradbury // CHECK-C-SAME: (float [[TMP0:%.*]]) #[[ATTR0]] { 109a742511cSAlex Bradbury // CHECK-C: entry: 110a742511cSAlex Bradbury // 111a742511cSAlex Bradbury // CHECK32-CXX-LABEL: define dso_local [2 x i32] @_Z7test_s62s6 112a742511cSAlex Bradbury // CHECK32-CXX-SAME: ([2 x i32] [[A_COERCE:%.*]]) #[[ATTR0]] { 113a742511cSAlex Bradbury // CHECK32-CXX: entry: 114a742511cSAlex Bradbury // 115a742511cSAlex Bradbury // CHECK64-CXX-LABEL: define dso_local i64 @_Z7test_s62s6 116a742511cSAlex Bradbury // CHECK64-CXX-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { 117a742511cSAlex Bradbury // CHECK64-CXX: entry: 118a742511cSAlex Bradbury // 119a742511cSAlex Bradbury struct s6 test_s6(struct s6 a) { 120a742511cSAlex Bradbury return a; 121a742511cSAlex Bradbury } 122a742511cSAlex Bradbury 123a742511cSAlex Bradbury struct s7 { struct empty e[0]; float f; }; 124a742511cSAlex Bradbury 125a742511cSAlex Bradbury // CHECK-C-LABEL: define dso_local float @test_s7 126a742511cSAlex Bradbury // CHECK-C-SAME: (float [[TMP0:%.*]]) #[[ATTR0]] { 127a742511cSAlex Bradbury // CHECK-C: entry: 128a742511cSAlex Bradbury // 129a742511cSAlex Bradbury // CHECK-CXX-LABEL: define dso_local float @_Z7test_s72s7 130e3c57fddSAlex Bradbury // CHECK-CXX-SAME: (float [[TMP0:%.*]]) #[[ATTR0]] { 131a742511cSAlex Bradbury // CHECK-CXX: entry: 132a742511cSAlex Bradbury // 133a742511cSAlex Bradbury struct s7 test_s7(struct s7 a) { 134a742511cSAlex Bradbury return a; 135a742511cSAlex Bradbury } 136a742511cSAlex Bradbury 137a742511cSAlex Bradbury struct empty_arr0 { struct { struct { } e[0]; }; }; 138a742511cSAlex Bradbury struct s8 { struct empty_arr0 e; float f; }; 139a742511cSAlex Bradbury 140a742511cSAlex Bradbury // CHECK-C-LABEL: define dso_local float @test_s8 141a742511cSAlex Bradbury // CHECK-C-SAME: (float [[TMP0:%.*]]) #[[ATTR0]] { 142a742511cSAlex Bradbury // CHECK-C: entry: 143a742511cSAlex Bradbury // 144e3c57fddSAlex Bradbury // CHECK-CXX-LABEL: define dso_local float @_Z7test_s82s8 145e3c57fddSAlex Bradbury // CHECK-CXX-SAME: (float [[TMP0:%.*]]) #[[ATTR0]] { 146e3c57fddSAlex Bradbury // CHECK-CXX: entry: 147a742511cSAlex Bradbury // 148a742511cSAlex Bradbury struct s8 test_s8(struct s8 a) { 149a742511cSAlex Bradbury return a; 150a742511cSAlex Bradbury } 151a742511cSAlex Bradbury 152e3c57fddSAlex Bradbury struct s9 { 153e3c57fddSAlex Bradbury struct empty e; 154e3c57fddSAlex Bradbury }; 155e3c57fddSAlex Bradbury 156e3c57fddSAlex Bradbury // CHECK-C-LABEL: define dso_local void @test_s9 157e3c57fddSAlex Bradbury // CHECK-C-SAME: () #[[ATTR0]] { 158e3c57fddSAlex Bradbury // CHECK-C: entry: 159e3c57fddSAlex Bradbury // 160e3c57fddSAlex Bradbury // CHECK32-CXX-LABEL: define dso_local void @_Z7test_s92s9 161e3c57fddSAlex Bradbury // CHECK32-CXX-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { 162e3c57fddSAlex Bradbury // CHECK32-CXX: entry: 163e3c57fddSAlex Bradbury // 164e3c57fddSAlex Bradbury // CHECK64-CXX-LABEL: define dso_local void @_Z7test_s92s9 165e3c57fddSAlex Bradbury // CHECK64-CXX-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { 166e3c57fddSAlex Bradbury // CHECK64-CXX: entry: 167e3c57fddSAlex Bradbury // 168e3c57fddSAlex Bradbury void test_s9(struct s9 a) {} 169e3c57fddSAlex Bradbury 170*d65f4232SSudharsan Veeravalli struct s10 { }; 171*d65f4232SSudharsan Veeravalli // CHECK-C-LABEL: define dso_local void @test_s10 172*d65f4232SSudharsan Veeravalli // CHECK-C-SAME: () #[[ATTR0]] { 173*d65f4232SSudharsan Veeravalli // CHECK-C: entry: 174*d65f4232SSudharsan Veeravalli // 175*d65f4232SSudharsan Veeravalli // CHECK32-CXX-LABEL: define dso_local i32 @_Z8test_s103s10 176*d65f4232SSudharsan Veeravalli // CHECK32-CXX-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { 177*d65f4232SSudharsan Veeravalli // CHECK32-CXX: entry: 178*d65f4232SSudharsan Veeravalli // 179*d65f4232SSudharsan Veeravalli // CHECK64-CXX-LABEL: define dso_local i64 @_Z8test_s103s10 180*d65f4232SSudharsan Veeravalli // CHECK64-CXX-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { 181*d65f4232SSudharsan Veeravalli // CHECK64-CXX: entry: 182*d65f4232SSudharsan Veeravalli // 183*d65f4232SSudharsan Veeravalli struct s10 test_s10(struct s10 a) { 184*d65f4232SSudharsan Veeravalli return a; 185*d65f4232SSudharsan Veeravalli } 186*d65f4232SSudharsan Veeravalli 187*d65f4232SSudharsan Veeravalli struct s11 { int : 0; }; 188*d65f4232SSudharsan Veeravalli // CHECK-C-LABEL: define dso_local void @test_s11 189*d65f4232SSudharsan Veeravalli // CHECK-C-SAME: () #[[ATTR0]] { 190*d65f4232SSudharsan Veeravalli // CHECK-C: entry: 191*d65f4232SSudharsan Veeravalli // 192*d65f4232SSudharsan Veeravalli // CHECK32-CXX-LABEL: define dso_local i32 @_Z8test_s113s11 193*d65f4232SSudharsan Veeravalli // CHECK32-CXX-SAME: (i32 [[A_COERCE:%.*]]) #[[ATTR0]] { 194*d65f4232SSudharsan Veeravalli // CHECK32-CXX: entry: 195*d65f4232SSudharsan Veeravalli // 196*d65f4232SSudharsan Veeravalli // CHECK64-CXX-LABEL: define dso_local i64 @_Z8test_s113s11 197*d65f4232SSudharsan Veeravalli // CHECK64-CXX-SAME: (i64 [[A_COERCE:%.*]]) #[[ATTR0]] { 198*d65f4232SSudharsan Veeravalli // CHECK64-CXX: entry: 199*d65f4232SSudharsan Veeravalli // 200*d65f4232SSudharsan Veeravalli struct s11 test_s11(struct s11 a) { 201*d65f4232SSudharsan Veeravalli return a; 202*d65f4232SSudharsan Veeravalli } 203*d65f4232SSudharsan Veeravalli 204*d65f4232SSudharsan Veeravalli struct s12 {int x[0];}; 205*d65f4232SSudharsan Veeravalli // CHECK32-C-LABEL: define dso_local i32 @test_s12 206*d65f4232SSudharsan Veeravalli // CHECK32-C-SAME: (i32 noundef [[I1:%.*]], i32 noundef [[I2:%.*]]) #[[ATTR0]] { 207*d65f4232SSudharsan Veeravalli // CHECK32-C: entry: 208*d65f4232SSudharsan Veeravalli // 209*d65f4232SSudharsan Veeravalli // CHECK64-C-LABEL: define dso_local signext i32 @test_s12 210*d65f4232SSudharsan Veeravalli // CHECK64-C-SAME: (i32 noundef signext [[I1:%.*]], i32 noundef signext [[I2:%.*]]) #[[ATTR0]] { 211*d65f4232SSudharsan Veeravalli // CHECK64-C: entry: 212*d65f4232SSudharsan Veeravalli // 213*d65f4232SSudharsan Veeravalli // CHECK32-CXX-LABEL: define dso_local noundef i32 @_Z8test_s12i3s12i 214*d65f4232SSudharsan Veeravalli // CHECK32-CXX-SAME: (i32 noundef [[I1:%.*]], i32 noundef [[I2:%.*]]) #[[ATTR0]] { 215*d65f4232SSudharsan Veeravalli // CHECK32-CXX: entry: 216*d65f4232SSudharsan Veeravalli // 217*d65f4232SSudharsan Veeravalli // CHECK64-CXX-LABEL: define dso_local noundef signext i32 @_Z8test_s12i3s12i 218*d65f4232SSudharsan Veeravalli // CHECK64-CXX-SAME: (i32 noundef signext [[I1:%.*]], i32 noundef signext [[I2:%.*]]) #[[ATTR0]] { 219*d65f4232SSudharsan Veeravalli // CHECK64-CXX: entry: 220*d65f4232SSudharsan Veeravalli // 221*d65f4232SSudharsan Veeravalli int test_s12(int32_t i1, struct s12 a, int32_t i2) { 222*d65f4232SSudharsan Veeravalli return i2; 223*d65f4232SSudharsan Veeravalli } 224*d65f4232SSudharsan Veeravalli 225a742511cSAlex Bradbury //// NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: 226a742511cSAlex Bradbury // CHECK32-C: {{.*}} 227a742511cSAlex Bradbury // CHECK64-C: {{.*}} 228