brintos

brintos / llvm-project-archived public Read only

0
0
Text · 33.2 KiB · f7c82ad Raw
588 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 22// RUN: %clang_cc1 -triple riscv64 -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK-RV643// RUN: %clang_cc1 -triple riscv32 -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK-RV324 5struct bfloat1 {6  __bf16 a;7};8 9// CHECK-RV64-LABEL: define dso_local i64 @h110// CHECK-RV64-SAME: (bfloat noundef [[A:%.*]]) #[[ATTR0:[0-9]+]] {11// CHECK-RV64-NEXT:  entry:12// CHECK-RV64-NEXT:    [[RETVAL:%.*]] = alloca [[STRUCT_BFLOAT1:%.*]], align 213// CHECK-RV64-NEXT:    [[A_ADDR:%.*]] = alloca bfloat, align 214// CHECK-RV64-NEXT:    [[COERCE_DIVE_COERCE:%.*]] = alloca i64, align 815// CHECK-RV64-NEXT:    store bfloat [[A]], ptr [[A_ADDR]], align 216// CHECK-RV64-NEXT:    [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 217// CHECK-RV64-NEXT:    [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT1]], ptr [[RETVAL]], i32 0, i32 018// CHECK-RV64-NEXT:    store bfloat [[TMP0]], ptr [[A1]], align 219// CHECK-RV64-NEXT:    [[COERCE_DIVE:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT1]], ptr [[RETVAL]], i32 0, i32 020// 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)21// CHECK-RV64-NEXT:    [[TMP1:%.*]] = load i64, ptr [[COERCE_DIVE_COERCE]], align 822// CHECK-RV64-NEXT:    ret i64 [[TMP1]]23//24// CHECK-RV32-LABEL: define dso_local i32 @h125// CHECK-RV32-SAME: (bfloat noundef [[A:%.*]]) #[[ATTR0:[0-9]+]] {26// CHECK-RV32-NEXT:  entry:27// CHECK-RV32-NEXT:    [[RETVAL:%.*]] = alloca [[STRUCT_BFLOAT1:%.*]], align 228// CHECK-RV32-NEXT:    [[A_ADDR:%.*]] = alloca bfloat, align 229// CHECK-RV32-NEXT:    [[COERCE_DIVE_COERCE:%.*]] = alloca i32, align 430// CHECK-RV32-NEXT:    store bfloat [[A]], ptr [[A_ADDR]], align 231// CHECK-RV32-NEXT:    [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 232// CHECK-RV32-NEXT:    [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT1]], ptr [[RETVAL]], i32 0, i32 033// CHECK-RV32-NEXT:    store bfloat [[TMP0]], ptr [[A1]], align 234// CHECK-RV32-NEXT:    [[COERCE_DIVE:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT1]], ptr [[RETVAL]], i32 0, i32 035// 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)36// CHECK-RV32-NEXT:    [[TMP1:%.*]] = load i32, ptr [[COERCE_DIVE_COERCE]], align 437// CHECK-RV32-NEXT:    ret i32 [[TMP1]]38//39struct bfloat1 h1(__bf16 a) {40  struct bfloat1 x;41  x.a = a;42  return x;43}44 45struct bfloat2 {46  __bf16 a;47  __bf16 b;48};49 50// CHECK-RV64-LABEL: define dso_local i64 @h251// CHECK-RV64-SAME: (bfloat noundef [[A:%.*]], bfloat noundef [[B:%.*]]) #[[ATTR0]] {52// CHECK-RV64-NEXT:  entry:53// CHECK-RV64-NEXT:    [[RETVAL:%.*]] = alloca [[STRUCT_BFLOAT2:%.*]], align 254// CHECK-RV64-NEXT:    [[A_ADDR:%.*]] = alloca bfloat, align 255// CHECK-RV64-NEXT:    [[B_ADDR:%.*]] = alloca bfloat, align 256// CHECK-RV64-NEXT:    [[RETVAL_COERCE:%.*]] = alloca i64, align 857// CHECK-RV64-NEXT:    store bfloat [[A]], ptr [[A_ADDR]], align 258// CHECK-RV64-NEXT:    store bfloat [[B]], ptr [[B_ADDR]], align 259// CHECK-RV64-NEXT:    [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 260// CHECK-RV64-NEXT:    [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT2]], ptr [[RETVAL]], i32 0, i32 061// CHECK-RV64-NEXT:    store bfloat [[TMP0]], ptr [[A1]], align 262// CHECK-RV64-NEXT:    [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 263// CHECK-RV64-NEXT:    [[B2:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT2]], ptr [[RETVAL]], i32 0, i32 164// CHECK-RV64-NEXT:    store bfloat [[TMP1]], ptr [[B2]], align 265// CHECK-RV64-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[RETVAL_COERCE]], ptr align 2 [[RETVAL]], i64 4, i1 false)66// CHECK-RV64-NEXT:    [[TMP2:%.*]] = load i64, ptr [[RETVAL_COERCE]], align 867// CHECK-RV64-NEXT:    ret i64 [[TMP2]]68//69// CHECK-RV32-LABEL: define dso_local i32 @h270// CHECK-RV32-SAME: (bfloat noundef [[A:%.*]], bfloat noundef [[B:%.*]]) #[[ATTR0]] {71// CHECK-RV32-NEXT:  entry:72// CHECK-RV32-NEXT:    [[RETVAL:%.*]] = alloca [[STRUCT_BFLOAT2:%.*]], align 273// CHECK-RV32-NEXT:    [[A_ADDR:%.*]] = alloca bfloat, align 274// CHECK-RV32-NEXT:    [[B_ADDR:%.*]] = alloca bfloat, align 275// CHECK-RV32-NEXT:    store bfloat [[A]], ptr [[A_ADDR]], align 276// CHECK-RV32-NEXT:    store bfloat [[B]], ptr [[B_ADDR]], align 277// CHECK-RV32-NEXT:    [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 278// CHECK-RV32-NEXT:    [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT2]], ptr [[RETVAL]], i32 0, i32 079// CHECK-RV32-NEXT:    store bfloat [[TMP0]], ptr [[A1]], align 280// CHECK-RV32-NEXT:    [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 281// CHECK-RV32-NEXT:    [[B2:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT2]], ptr [[RETVAL]], i32 0, i32 182// CHECK-RV32-NEXT:    store bfloat [[TMP1]], ptr [[B2]], align 283// CHECK-RV32-NEXT:    [[TMP2:%.*]] = load i32, ptr [[RETVAL]], align 284// CHECK-RV32-NEXT:    ret i32 [[TMP2]]85//86struct bfloat2 h2(__bf16 a, __bf16 b) {87  struct bfloat2 x;88  x.a = a;89  x.b = b;90  return x;91}92 93struct bfloat3 {94  __bf16 a;95  __bf16 b;96  __bf16 c;97};98 99// CHECK-RV64-LABEL: define dso_local i64 @h3100// CHECK-RV64-SAME: (bfloat noundef [[A:%.*]], bfloat noundef [[B:%.*]], bfloat noundef [[C:%.*]]) #[[ATTR0]] {101// CHECK-RV64-NEXT:  entry:102// CHECK-RV64-NEXT:    [[RETVAL:%.*]] = alloca [[STRUCT_BFLOAT3:%.*]], align 2103// CHECK-RV64-NEXT:    [[A_ADDR:%.*]] = alloca bfloat, align 2104// CHECK-RV64-NEXT:    [[B_ADDR:%.*]] = alloca bfloat, align 2105// CHECK-RV64-NEXT:    [[C_ADDR:%.*]] = alloca bfloat, align 2106// CHECK-RV64-NEXT:    [[RETVAL_COERCE:%.*]] = alloca i64, align 8107// CHECK-RV64-NEXT:    store bfloat [[A]], ptr [[A_ADDR]], align 2108// CHECK-RV64-NEXT:    store bfloat [[B]], ptr [[B_ADDR]], align 2109// CHECK-RV64-NEXT:    store bfloat [[C]], ptr [[C_ADDR]], align 2110// CHECK-RV64-NEXT:    [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 2111// CHECK-RV64-NEXT:    [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT3]], ptr [[RETVAL]], i32 0, i32 0112// CHECK-RV64-NEXT:    store bfloat [[TMP0]], ptr [[A1]], align 2113// CHECK-RV64-NEXT:    [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2114// CHECK-RV64-NEXT:    [[B2:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT3]], ptr [[RETVAL]], i32 0, i32 1115// CHECK-RV64-NEXT:    store bfloat [[TMP1]], ptr [[B2]], align 2116// CHECK-RV64-NEXT:    [[TMP2:%.*]] = load bfloat, ptr [[C_ADDR]], align 2117// CHECK-RV64-NEXT:    [[C3:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT3]], ptr [[RETVAL]], i32 0, i32 2118// CHECK-RV64-NEXT:    store bfloat [[TMP2]], ptr [[C3]], align 2119// CHECK-RV64-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[RETVAL_COERCE]], ptr align 2 [[RETVAL]], i64 6, i1 false)120// CHECK-RV64-NEXT:    [[TMP3:%.*]] = load i64, ptr [[RETVAL_COERCE]], align 8121// CHECK-RV64-NEXT:    ret i64 [[TMP3]]122//123// CHECK-RV32-LABEL: define dso_local [2 x i32] @h3124// CHECK-RV32-SAME: (bfloat noundef [[A:%.*]], bfloat noundef [[B:%.*]], bfloat noundef [[C:%.*]]) #[[ATTR0]] {125// CHECK-RV32-NEXT:  entry:126// CHECK-RV32-NEXT:    [[RETVAL:%.*]] = alloca [[STRUCT_BFLOAT3:%.*]], align 2127// CHECK-RV32-NEXT:    [[A_ADDR:%.*]] = alloca bfloat, align 2128// CHECK-RV32-NEXT:    [[B_ADDR:%.*]] = alloca bfloat, align 2129// CHECK-RV32-NEXT:    [[C_ADDR:%.*]] = alloca bfloat, align 2130// CHECK-RV32-NEXT:    [[RETVAL_COERCE:%.*]] = alloca [2 x i32], align 4131// CHECK-RV32-NEXT:    store bfloat [[A]], ptr [[A_ADDR]], align 2132// CHECK-RV32-NEXT:    store bfloat [[B]], ptr [[B_ADDR]], align 2133// CHECK-RV32-NEXT:    store bfloat [[C]], ptr [[C_ADDR]], align 2134// CHECK-RV32-NEXT:    [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 2135// CHECK-RV32-NEXT:    [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT3]], ptr [[RETVAL]], i32 0, i32 0136// CHECK-RV32-NEXT:    store bfloat [[TMP0]], ptr [[A1]], align 2137// CHECK-RV32-NEXT:    [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2138// CHECK-RV32-NEXT:    [[B2:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT3]], ptr [[RETVAL]], i32 0, i32 1139// CHECK-RV32-NEXT:    store bfloat [[TMP1]], ptr [[B2]], align 2140// CHECK-RV32-NEXT:    [[TMP2:%.*]] = load bfloat, ptr [[C_ADDR]], align 2141// CHECK-RV32-NEXT:    [[C3:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT3]], ptr [[RETVAL]], i32 0, i32 2142// CHECK-RV32-NEXT:    store bfloat [[TMP2]], ptr [[C3]], align 2143// CHECK-RV32-NEXT:    call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[RETVAL_COERCE]], ptr align 2 [[RETVAL]], i32 6, i1 false)144// CHECK-RV32-NEXT:    [[TMP3:%.*]] = load [2 x i32], ptr [[RETVAL_COERCE]], align 4145// CHECK-RV32-NEXT:    ret [2 x i32] [[TMP3]]146//147struct bfloat3 h3(__bf16 a, __bf16 b, __bf16 c) {148  struct bfloat3 x;149  x.a = a;150  x.b = b;151  x.c = c;152  return x;153}154 155struct bfloat4 {156  __bf16 a;157  __bf16 b;158  __bf16 c;159  __bf16 d;160};161 162// CHECK-RV64-LABEL: define dso_local i64 @h4163// CHECK-RV64-SAME: (bfloat noundef [[A:%.*]], bfloat noundef [[B:%.*]], bfloat noundef [[C:%.*]], bfloat noundef [[D:%.*]]) #[[ATTR0]] {164// CHECK-RV64-NEXT:  entry:165// CHECK-RV64-NEXT:    [[RETVAL:%.*]] = alloca [[STRUCT_BFLOAT4:%.*]], align 2166// CHECK-RV64-NEXT:    [[A_ADDR:%.*]] = alloca bfloat, align 2167// CHECK-RV64-NEXT:    [[B_ADDR:%.*]] = alloca bfloat, align 2168// CHECK-RV64-NEXT:    [[C_ADDR:%.*]] = alloca bfloat, align 2169// CHECK-RV64-NEXT:    [[D_ADDR:%.*]] = alloca bfloat, align 2170// CHECK-RV64-NEXT:    store bfloat [[A]], ptr [[A_ADDR]], align 2171// CHECK-RV64-NEXT:    store bfloat [[B]], ptr [[B_ADDR]], align 2172// CHECK-RV64-NEXT:    store bfloat [[C]], ptr [[C_ADDR]], align 2173// CHECK-RV64-NEXT:    store bfloat [[D]], ptr [[D_ADDR]], align 2174// CHECK-RV64-NEXT:    [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 2175// CHECK-RV64-NEXT:    [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT4]], ptr [[RETVAL]], i32 0, i32 0176// CHECK-RV64-NEXT:    store bfloat [[TMP0]], ptr [[A1]], align 2177// CHECK-RV64-NEXT:    [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2178// CHECK-RV64-NEXT:    [[B2:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT4]], ptr [[RETVAL]], i32 0, i32 1179// CHECK-RV64-NEXT:    store bfloat [[TMP1]], ptr [[B2]], align 2180// CHECK-RV64-NEXT:    [[TMP2:%.*]] = load bfloat, ptr [[C_ADDR]], align 2181// CHECK-RV64-NEXT:    [[C3:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT4]], ptr [[RETVAL]], i32 0, i32 2182// CHECK-RV64-NEXT:    store bfloat [[TMP2]], ptr [[C3]], align 2183// CHECK-RV64-NEXT:    [[TMP3:%.*]] = load bfloat, ptr [[D_ADDR]], align 2184// CHECK-RV64-NEXT:    [[D4:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT4]], ptr [[RETVAL]], i32 0, i32 3185// CHECK-RV64-NEXT:    store bfloat [[TMP3]], ptr [[D4]], align 2186// CHECK-RV64-NEXT:    [[TMP4:%.*]] = load i64, ptr [[RETVAL]], align 2187// CHECK-RV64-NEXT:    ret i64 [[TMP4]]188//189// CHECK-RV32-LABEL: define dso_local [2 x i32] @h4190// CHECK-RV32-SAME: (bfloat noundef [[A:%.*]], bfloat noundef [[B:%.*]], bfloat noundef [[C:%.*]], bfloat noundef [[D:%.*]]) #[[ATTR0]] {191// CHECK-RV32-NEXT:  entry:192// CHECK-RV32-NEXT:    [[RETVAL:%.*]] = alloca [[STRUCT_BFLOAT4:%.*]], align 2193// CHECK-RV32-NEXT:    [[A_ADDR:%.*]] = alloca bfloat, align 2194// CHECK-RV32-NEXT:    [[B_ADDR:%.*]] = alloca bfloat, align 2195// CHECK-RV32-NEXT:    [[C_ADDR:%.*]] = alloca bfloat, align 2196// CHECK-RV32-NEXT:    [[D_ADDR:%.*]] = alloca bfloat, align 2197// CHECK-RV32-NEXT:    store bfloat [[A]], ptr [[A_ADDR]], align 2198// CHECK-RV32-NEXT:    store bfloat [[B]], ptr [[B_ADDR]], align 2199// CHECK-RV32-NEXT:    store bfloat [[C]], ptr [[C_ADDR]], align 2200// CHECK-RV32-NEXT:    store bfloat [[D]], ptr [[D_ADDR]], align 2201// CHECK-RV32-NEXT:    [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 2202// CHECK-RV32-NEXT:    [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT4]], ptr [[RETVAL]], i32 0, i32 0203// CHECK-RV32-NEXT:    store bfloat [[TMP0]], ptr [[A1]], align 2204// CHECK-RV32-NEXT:    [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2205// CHECK-RV32-NEXT:    [[B2:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT4]], ptr [[RETVAL]], i32 0, i32 1206// CHECK-RV32-NEXT:    store bfloat [[TMP1]], ptr [[B2]], align 2207// CHECK-RV32-NEXT:    [[TMP2:%.*]] = load bfloat, ptr [[C_ADDR]], align 2208// CHECK-RV32-NEXT:    [[C3:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT4]], ptr [[RETVAL]], i32 0, i32 2209// CHECK-RV32-NEXT:    store bfloat [[TMP2]], ptr [[C3]], align 2210// CHECK-RV32-NEXT:    [[TMP3:%.*]] = load bfloat, ptr [[D_ADDR]], align 2211// CHECK-RV32-NEXT:    [[D4:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT4]], ptr [[RETVAL]], i32 0, i32 3212// CHECK-RV32-NEXT:    store bfloat [[TMP3]], ptr [[D4]], align 2213// CHECK-RV32-NEXT:    [[TMP4:%.*]] = load [2 x i32], ptr [[RETVAL]], align 2214// CHECK-RV32-NEXT:    ret [2 x i32] [[TMP4]]215//216struct bfloat4 h4(__bf16 a, __bf16 b, __bf16 c, __bf16 d) {217  struct bfloat4 x;218  x.a = a;219  x.b = b;220  x.c = c;221  x.d = d;222  return x;223}224 225struct floatbfloat {226  float a;227  __bf16 b;228};229 230// CHECK-RV64-LABEL: define dso_local i64 @fh231// CHECK-RV64-SAME: (float noundef [[A:%.*]], bfloat noundef [[B:%.*]]) #[[ATTR0]] {232// CHECK-RV64-NEXT:  entry:233// CHECK-RV64-NEXT:    [[RETVAL:%.*]] = alloca [[STRUCT_FLOATBFLOAT:%.*]], align 4234// CHECK-RV64-NEXT:    [[A_ADDR:%.*]] = alloca float, align 4235// CHECK-RV64-NEXT:    [[B_ADDR:%.*]] = alloca bfloat, align 2236// CHECK-RV64-NEXT:    store float [[A]], ptr [[A_ADDR]], align 4237// CHECK-RV64-NEXT:    store bfloat [[B]], ptr [[B_ADDR]], align 2238// CHECK-RV64-NEXT:    [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 4239// CHECK-RV64-NEXT:    [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_FLOATBFLOAT]], ptr [[RETVAL]], i32 0, i32 0240// CHECK-RV64-NEXT:    store float [[TMP0]], ptr [[A1]], align 4241// CHECK-RV64-NEXT:    [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2242// CHECK-RV64-NEXT:    [[B2:%.*]] = getelementptr inbounds nuw [[STRUCT_FLOATBFLOAT]], ptr [[RETVAL]], i32 0, i32 1243// CHECK-RV64-NEXT:    store bfloat [[TMP1]], ptr [[B2]], align 4244// CHECK-RV64-NEXT:    [[TMP2:%.*]] = load i64, ptr [[RETVAL]], align 4245// CHECK-RV64-NEXT:    ret i64 [[TMP2]]246//247// CHECK-RV32-LABEL: define dso_local [2 x i32] @fh248// CHECK-RV32-SAME: (float noundef [[A:%.*]], bfloat noundef [[B:%.*]]) #[[ATTR0]] {249// CHECK-RV32-NEXT:  entry:250// CHECK-RV32-NEXT:    [[RETVAL:%.*]] = alloca [[STRUCT_FLOATBFLOAT:%.*]], align 4251// CHECK-RV32-NEXT:    [[A_ADDR:%.*]] = alloca float, align 4252// CHECK-RV32-NEXT:    [[B_ADDR:%.*]] = alloca bfloat, align 2253// CHECK-RV32-NEXT:    store float [[A]], ptr [[A_ADDR]], align 4254// CHECK-RV32-NEXT:    store bfloat [[B]], ptr [[B_ADDR]], align 2255// CHECK-RV32-NEXT:    [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 4256// CHECK-RV32-NEXT:    [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_FLOATBFLOAT]], ptr [[RETVAL]], i32 0, i32 0257// CHECK-RV32-NEXT:    store float [[TMP0]], ptr [[A1]], align 4258// CHECK-RV32-NEXT:    [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2259// CHECK-RV32-NEXT:    [[B2:%.*]] = getelementptr inbounds nuw [[STRUCT_FLOATBFLOAT]], ptr [[RETVAL]], i32 0, i32 1260// CHECK-RV32-NEXT:    store bfloat [[TMP1]], ptr [[B2]], align 4261// CHECK-RV32-NEXT:    [[TMP2:%.*]] = load [2 x i32], ptr [[RETVAL]], align 4262// CHECK-RV32-NEXT:    ret [2 x i32] [[TMP2]]263//264struct floatbfloat fh(float a, __bf16 b) {265  struct floatbfloat x;266  x.a = a;267  x.b = b;268  return x;269}270 271struct floatbfloat2 {272  float a;273  __bf16 b;274  __bf16 c;275};276 277// CHECK-RV64-LABEL: define dso_local i64 @fh2278// CHECK-RV64-SAME: (float noundef [[A:%.*]], bfloat noundef [[B:%.*]], bfloat noundef [[C:%.*]]) #[[ATTR0]] {279// CHECK-RV64-NEXT:  entry:280// CHECK-RV64-NEXT:    [[RETVAL:%.*]] = alloca [[STRUCT_FLOATBFLOAT2:%.*]], align 4281// CHECK-RV64-NEXT:    [[A_ADDR:%.*]] = alloca float, align 4282// CHECK-RV64-NEXT:    [[B_ADDR:%.*]] = alloca bfloat, align 2283// CHECK-RV64-NEXT:    [[C_ADDR:%.*]] = alloca bfloat, align 2284// CHECK-RV64-NEXT:    store float [[A]], ptr [[A_ADDR]], align 4285// CHECK-RV64-NEXT:    store bfloat [[B]], ptr [[B_ADDR]], align 2286// CHECK-RV64-NEXT:    store bfloat [[C]], ptr [[C_ADDR]], align 2287// CHECK-RV64-NEXT:    [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 4288// CHECK-RV64-NEXT:    [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_FLOATBFLOAT2]], ptr [[RETVAL]], i32 0, i32 0289// CHECK-RV64-NEXT:    store float [[TMP0]], ptr [[A1]], align 4290// CHECK-RV64-NEXT:    [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2291// CHECK-RV64-NEXT:    [[B2:%.*]] = getelementptr inbounds nuw [[STRUCT_FLOATBFLOAT2]], ptr [[RETVAL]], i32 0, i32 1292// CHECK-RV64-NEXT:    store bfloat [[TMP1]], ptr [[B2]], align 4293// CHECK-RV64-NEXT:    [[TMP2:%.*]] = load bfloat, ptr [[C_ADDR]], align 2294// CHECK-RV64-NEXT:    [[C3:%.*]] = getelementptr inbounds nuw [[STRUCT_FLOATBFLOAT2]], ptr [[RETVAL]], i32 0, i32 2295// CHECK-RV64-NEXT:    store bfloat [[TMP2]], ptr [[C3]], align 2296// CHECK-RV64-NEXT:    [[TMP3:%.*]] = load i64, ptr [[RETVAL]], align 4297// CHECK-RV64-NEXT:    ret i64 [[TMP3]]298//299// CHECK-RV32-LABEL: define dso_local [2 x i32] @fh2300// CHECK-RV32-SAME: (float noundef [[A:%.*]], bfloat noundef [[B:%.*]], bfloat noundef [[C:%.*]]) #[[ATTR0]] {301// CHECK-RV32-NEXT:  entry:302// CHECK-RV32-NEXT:    [[RETVAL:%.*]] = alloca [[STRUCT_FLOATBFLOAT2:%.*]], align 4303// CHECK-RV32-NEXT:    [[A_ADDR:%.*]] = alloca float, align 4304// CHECK-RV32-NEXT:    [[B_ADDR:%.*]] = alloca bfloat, align 2305// CHECK-RV32-NEXT:    [[C_ADDR:%.*]] = alloca bfloat, align 2306// CHECK-RV32-NEXT:    store float [[A]], ptr [[A_ADDR]], align 4307// CHECK-RV32-NEXT:    store bfloat [[B]], ptr [[B_ADDR]], align 2308// CHECK-RV32-NEXT:    store bfloat [[C]], ptr [[C_ADDR]], align 2309// CHECK-RV32-NEXT:    [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 4310// CHECK-RV32-NEXT:    [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_FLOATBFLOAT2]], ptr [[RETVAL]], i32 0, i32 0311// CHECK-RV32-NEXT:    store float [[TMP0]], ptr [[A1]], align 4312// CHECK-RV32-NEXT:    [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2313// CHECK-RV32-NEXT:    [[B2:%.*]] = getelementptr inbounds nuw [[STRUCT_FLOATBFLOAT2]], ptr [[RETVAL]], i32 0, i32 1314// CHECK-RV32-NEXT:    store bfloat [[TMP1]], ptr [[B2]], align 4315// CHECK-RV32-NEXT:    [[TMP2:%.*]] = load bfloat, ptr [[C_ADDR]], align 2316// CHECK-RV32-NEXT:    [[C3:%.*]] = getelementptr inbounds nuw [[STRUCT_FLOATBFLOAT2]], ptr [[RETVAL]], i32 0, i32 2317// CHECK-RV32-NEXT:    store bfloat [[TMP2]], ptr [[C3]], align 2318// CHECK-RV32-NEXT:    [[TMP3:%.*]] = load [2 x i32], ptr [[RETVAL]], align 4319// CHECK-RV32-NEXT:    ret [2 x i32] [[TMP3]]320//321struct floatbfloat2 fh2(float a, __bf16 b, __bf16 c) {322  struct floatbfloat2 x;323  x.a = a;324  x.b = b;325  x.c = c;326  return x;327}328 329struct bfloatfloat {330  __bf16 a;331  float b;332};333 334// CHECK-RV64-LABEL: define dso_local i64 @hf335// CHECK-RV64-SAME: (bfloat noundef [[A:%.*]], float noundef [[B:%.*]]) #[[ATTR0]] {336// CHECK-RV64-NEXT:  entry:337// CHECK-RV64-NEXT:    [[RETVAL:%.*]] = alloca [[STRUCT_BFLOATFLOAT:%.*]], align 4338// CHECK-RV64-NEXT:    [[A_ADDR:%.*]] = alloca bfloat, align 2339// CHECK-RV64-NEXT:    [[B_ADDR:%.*]] = alloca float, align 4340// CHECK-RV64-NEXT:    store bfloat [[A]], ptr [[A_ADDR]], align 2341// CHECK-RV64-NEXT:    store float [[B]], ptr [[B_ADDR]], align 4342// CHECK-RV64-NEXT:    [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 2343// CHECK-RV64-NEXT:    [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOATFLOAT]], ptr [[RETVAL]], i32 0, i32 0344// CHECK-RV64-NEXT:    store bfloat [[TMP0]], ptr [[A1]], align 4345// CHECK-RV64-NEXT:    [[TMP1:%.*]] = load float, ptr [[B_ADDR]], align 4346// CHECK-RV64-NEXT:    [[B2:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOATFLOAT]], ptr [[RETVAL]], i32 0, i32 1347// CHECK-RV64-NEXT:    store float [[TMP1]], ptr [[B2]], align 4348// CHECK-RV64-NEXT:    [[TMP2:%.*]] = load i64, ptr [[RETVAL]], align 4349// CHECK-RV64-NEXT:    ret i64 [[TMP2]]350//351// CHECK-RV32-LABEL: define dso_local [2 x i32] @hf352// CHECK-RV32-SAME: (bfloat noundef [[A:%.*]], float noundef [[B:%.*]]) #[[ATTR0]] {353// CHECK-RV32-NEXT:  entry:354// CHECK-RV32-NEXT:    [[RETVAL:%.*]] = alloca [[STRUCT_BFLOATFLOAT:%.*]], align 4355// CHECK-RV32-NEXT:    [[A_ADDR:%.*]] = alloca bfloat, align 2356// CHECK-RV32-NEXT:    [[B_ADDR:%.*]] = alloca float, align 4357// CHECK-RV32-NEXT:    store bfloat [[A]], ptr [[A_ADDR]], align 2358// CHECK-RV32-NEXT:    store float [[B]], ptr [[B_ADDR]], align 4359// CHECK-RV32-NEXT:    [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 2360// CHECK-RV32-NEXT:    [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOATFLOAT]], ptr [[RETVAL]], i32 0, i32 0361// CHECK-RV32-NEXT:    store bfloat [[TMP0]], ptr [[A1]], align 4362// CHECK-RV32-NEXT:    [[TMP1:%.*]] = load float, ptr [[B_ADDR]], align 4363// CHECK-RV32-NEXT:    [[B2:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOATFLOAT]], ptr [[RETVAL]], i32 0, i32 1364// CHECK-RV32-NEXT:    store float [[TMP1]], ptr [[B2]], align 4365// CHECK-RV32-NEXT:    [[TMP2:%.*]] = load [2 x i32], ptr [[RETVAL]], align 4366// CHECK-RV32-NEXT:    ret [2 x i32] [[TMP2]]367//368struct bfloatfloat hf(__bf16 a, float b) {369  struct bfloatfloat x;370  x.a = a;371  x.b = b;372  return x;373}374 375struct bfloat2float {376  __bf16 a;377  __bf16 b;378  float c;379};380 381// CHECK-RV64-LABEL: define dso_local i64 @h2f382// CHECK-RV64-SAME: (bfloat noundef [[A:%.*]], bfloat noundef [[B:%.*]], float noundef [[C:%.*]]) #[[ATTR0]] {383// CHECK-RV64-NEXT:  entry:384// CHECK-RV64-NEXT:    [[RETVAL:%.*]] = alloca [[STRUCT_BFLOAT2FLOAT:%.*]], align 4385// CHECK-RV64-NEXT:    [[A_ADDR:%.*]] = alloca bfloat, align 2386// CHECK-RV64-NEXT:    [[B_ADDR:%.*]] = alloca bfloat, align 2387// CHECK-RV64-NEXT:    [[C_ADDR:%.*]] = alloca float, align 4388// CHECK-RV64-NEXT:    store bfloat [[A]], ptr [[A_ADDR]], align 2389// CHECK-RV64-NEXT:    store bfloat [[B]], ptr [[B_ADDR]], align 2390// CHECK-RV64-NEXT:    store float [[C]], ptr [[C_ADDR]], align 4391// CHECK-RV64-NEXT:    [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 2392// CHECK-RV64-NEXT:    [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT2FLOAT]], ptr [[RETVAL]], i32 0, i32 0393// CHECK-RV64-NEXT:    store bfloat [[TMP0]], ptr [[A1]], align 4394// CHECK-RV64-NEXT:    [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2395// CHECK-RV64-NEXT:    [[B2:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT2FLOAT]], ptr [[RETVAL]], i32 0, i32 1396// CHECK-RV64-NEXT:    store bfloat [[TMP1]], ptr [[B2]], align 2397// CHECK-RV64-NEXT:    [[TMP2:%.*]] = load float, ptr [[C_ADDR]], align 4398// CHECK-RV64-NEXT:    [[C3:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT2FLOAT]], ptr [[RETVAL]], i32 0, i32 2399// CHECK-RV64-NEXT:    store float [[TMP2]], ptr [[C3]], align 4400// CHECK-RV64-NEXT:    [[TMP3:%.*]] = load i64, ptr [[RETVAL]], align 4401// CHECK-RV64-NEXT:    ret i64 [[TMP3]]402//403// CHECK-RV32-LABEL: define dso_local [2 x i32] @h2f404// CHECK-RV32-SAME: (bfloat noundef [[A:%.*]], bfloat noundef [[B:%.*]], float noundef [[C:%.*]]) #[[ATTR0]] {405// CHECK-RV32-NEXT:  entry:406// CHECK-RV32-NEXT:    [[RETVAL:%.*]] = alloca [[STRUCT_BFLOAT2FLOAT:%.*]], align 4407// CHECK-RV32-NEXT:    [[A_ADDR:%.*]] = alloca bfloat, align 2408// CHECK-RV32-NEXT:    [[B_ADDR:%.*]] = alloca bfloat, align 2409// CHECK-RV32-NEXT:    [[C_ADDR:%.*]] = alloca float, align 4410// CHECK-RV32-NEXT:    store bfloat [[A]], ptr [[A_ADDR]], align 2411// CHECK-RV32-NEXT:    store bfloat [[B]], ptr [[B_ADDR]], align 2412// CHECK-RV32-NEXT:    store float [[C]], ptr [[C_ADDR]], align 4413// CHECK-RV32-NEXT:    [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 2414// CHECK-RV32-NEXT:    [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT2FLOAT]], ptr [[RETVAL]], i32 0, i32 0415// CHECK-RV32-NEXT:    store bfloat [[TMP0]], ptr [[A1]], align 4416// CHECK-RV32-NEXT:    [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2417// CHECK-RV32-NEXT:    [[B2:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT2FLOAT]], ptr [[RETVAL]], i32 0, i32 1418// CHECK-RV32-NEXT:    store bfloat [[TMP1]], ptr [[B2]], align 2419// CHECK-RV32-NEXT:    [[TMP2:%.*]] = load float, ptr [[C_ADDR]], align 4420// CHECK-RV32-NEXT:    [[C3:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT2FLOAT]], ptr [[RETVAL]], i32 0, i32 2421// CHECK-RV32-NEXT:    store float [[TMP2]], ptr [[C3]], align 4422// CHECK-RV32-NEXT:    [[TMP3:%.*]] = load [2 x i32], ptr [[RETVAL]], align 4423// CHECK-RV32-NEXT:    ret [2 x i32] [[TMP3]]424//425struct bfloat2float h2f(__bf16 a, __bf16 b, float c) {426  struct bfloat2float x;427  x.a = a;428  x.b = b;429  x.c = c;430  return x;431}432 433struct floatbfloat3 {434  float a;435  __bf16 b;436  __bf16 c;437  __bf16 d;438};439 440// CHECK-RV64-LABEL: define dso_local [2 x i64] @fh3441// CHECK-RV64-SAME: (float noundef [[A:%.*]], bfloat noundef [[B:%.*]], bfloat noundef [[C:%.*]], bfloat noundef [[D:%.*]]) #[[ATTR0]] {442// CHECK-RV64-NEXT:  entry:443// CHECK-RV64-NEXT:    [[RETVAL:%.*]] = alloca [[STRUCT_FLOATBFLOAT3:%.*]], align 4444// CHECK-RV64-NEXT:    [[A_ADDR:%.*]] = alloca float, align 4445// CHECK-RV64-NEXT:    [[B_ADDR:%.*]] = alloca bfloat, align 2446// CHECK-RV64-NEXT:    [[C_ADDR:%.*]] = alloca bfloat, align 2447// CHECK-RV64-NEXT:    [[D_ADDR:%.*]] = alloca bfloat, align 2448// CHECK-RV64-NEXT:    [[RETVAL_COERCE:%.*]] = alloca [2 x i64], align 8449// CHECK-RV64-NEXT:    store float [[A]], ptr [[A_ADDR]], align 4450// CHECK-RV64-NEXT:    store bfloat [[B]], ptr [[B_ADDR]], align 2451// CHECK-RV64-NEXT:    store bfloat [[C]], ptr [[C_ADDR]], align 2452// CHECK-RV64-NEXT:    store bfloat [[D]], ptr [[D_ADDR]], align 2453// CHECK-RV64-NEXT:    [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 4454// CHECK-RV64-NEXT:    [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_FLOATBFLOAT3]], ptr [[RETVAL]], i32 0, i32 0455// CHECK-RV64-NEXT:    store float [[TMP0]], ptr [[A1]], align 4456// CHECK-RV64-NEXT:    [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2457// CHECK-RV64-NEXT:    [[B2:%.*]] = getelementptr inbounds nuw [[STRUCT_FLOATBFLOAT3]], ptr [[RETVAL]], i32 0, i32 1458// CHECK-RV64-NEXT:    store bfloat [[TMP1]], ptr [[B2]], align 4459// CHECK-RV64-NEXT:    [[TMP2:%.*]] = load bfloat, ptr [[C_ADDR]], align 2460// CHECK-RV64-NEXT:    [[C3:%.*]] = getelementptr inbounds nuw [[STRUCT_FLOATBFLOAT3]], ptr [[RETVAL]], i32 0, i32 2461// CHECK-RV64-NEXT:    store bfloat [[TMP2]], ptr [[C3]], align 2462// CHECK-RV64-NEXT:    [[TMP3:%.*]] = load bfloat, ptr [[D_ADDR]], align 2463// CHECK-RV64-NEXT:    [[D4:%.*]] = getelementptr inbounds nuw [[STRUCT_FLOATBFLOAT3]], ptr [[RETVAL]], i32 0, i32 3464// CHECK-RV64-NEXT:    store bfloat [[TMP3]], ptr [[D4]], align 4465// CHECK-RV64-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[RETVAL_COERCE]], ptr align 4 [[RETVAL]], i64 12, i1 false)466// CHECK-RV64-NEXT:    [[TMP4:%.*]] = load [2 x i64], ptr [[RETVAL_COERCE]], align 8467// CHECK-RV64-NEXT:    ret [2 x i64] [[TMP4]]468//469// CHECK-RV32-LABEL: define dso_local void @fh3470// CHECK-RV32-SAME: (ptr dead_on_unwind noalias writable sret([[STRUCT_FLOATBFLOAT3:%.*]]) align 4 [[AGG_RESULT:%.*]], float noundef [[A:%.*]], bfloat noundef [[B:%.*]], bfloat noundef [[C:%.*]], bfloat noundef [[D:%.*]]) #[[ATTR0]] {471// CHECK-RV32-NEXT:  entry:472// CHECK-RV32-NEXT:    [[RESULT_PTR:%.*]] = alloca ptr, align 4473// CHECK-RV32-NEXT:    [[A_ADDR:%.*]] = alloca float, align 4474// CHECK-RV32-NEXT:    [[B_ADDR:%.*]] = alloca bfloat, align 2475// CHECK-RV32-NEXT:    [[C_ADDR:%.*]] = alloca bfloat, align 2476// CHECK-RV32-NEXT:    [[D_ADDR:%.*]] = alloca bfloat, align 2477// CHECK-RV32-NEXT:    store ptr [[AGG_RESULT]], ptr [[RESULT_PTR]], align 4478// CHECK-RV32-NEXT:    store float [[A]], ptr [[A_ADDR]], align 4479// CHECK-RV32-NEXT:    store bfloat [[B]], ptr [[B_ADDR]], align 2480// CHECK-RV32-NEXT:    store bfloat [[C]], ptr [[C_ADDR]], align 2481// CHECK-RV32-NEXT:    store bfloat [[D]], ptr [[D_ADDR]], align 2482// CHECK-RV32-NEXT:    [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 4483// CHECK-RV32-NEXT:    [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_FLOATBFLOAT3]], ptr [[AGG_RESULT]], i32 0, i32 0484// CHECK-RV32-NEXT:    store float [[TMP0]], ptr [[A1]], align 4485// CHECK-RV32-NEXT:    [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2486// CHECK-RV32-NEXT:    [[B2:%.*]] = getelementptr inbounds nuw [[STRUCT_FLOATBFLOAT3]], ptr [[AGG_RESULT]], i32 0, i32 1487// CHECK-RV32-NEXT:    store bfloat [[TMP1]], ptr [[B2]], align 4488// CHECK-RV32-NEXT:    [[TMP2:%.*]] = load bfloat, ptr [[C_ADDR]], align 2489// CHECK-RV32-NEXT:    [[C3:%.*]] = getelementptr inbounds nuw [[STRUCT_FLOATBFLOAT3]], ptr [[AGG_RESULT]], i32 0, i32 2490// CHECK-RV32-NEXT:    store bfloat [[TMP2]], ptr [[C3]], align 2491// CHECK-RV32-NEXT:    [[TMP3:%.*]] = load bfloat, ptr [[D_ADDR]], align 2492// CHECK-RV32-NEXT:    [[D4:%.*]] = getelementptr inbounds nuw [[STRUCT_FLOATBFLOAT3]], ptr [[AGG_RESULT]], i32 0, i32 3493// CHECK-RV32-NEXT:    store bfloat [[TMP3]], ptr [[D4]], align 4494// CHECK-RV32-NEXT:    ret void495//496struct floatbfloat3 fh3(float a, __bf16 b, __bf16 c, __bf16 d) {497  struct floatbfloat3 x;498  x.a = a;499  x.b = b;500  x.c = c;501  x.d = d;502  return x;503}504 505struct bfloat5 {506  __bf16 a;507  __bf16 b;508  __bf16 c;509  __bf16 d;510  __bf16 e;511};512 513// CHECK-RV64-LABEL: define dso_local [2 x i64] @h5514// CHECK-RV64-SAME: (bfloat noundef [[A:%.*]], bfloat noundef [[B:%.*]], bfloat noundef [[C:%.*]], bfloat noundef [[D:%.*]], bfloat noundef [[E:%.*]]) #[[ATTR0]] {515// CHECK-RV64-NEXT:  entry:516// CHECK-RV64-NEXT:    [[RETVAL:%.*]] = alloca [[STRUCT_BFLOAT5:%.*]], align 2517// CHECK-RV64-NEXT:    [[A_ADDR:%.*]] = alloca bfloat, align 2518// CHECK-RV64-NEXT:    [[B_ADDR:%.*]] = alloca bfloat, align 2519// CHECK-RV64-NEXT:    [[C_ADDR:%.*]] = alloca bfloat, align 2520// CHECK-RV64-NEXT:    [[D_ADDR:%.*]] = alloca bfloat, align 2521// CHECK-RV64-NEXT:    [[E_ADDR:%.*]] = alloca bfloat, align 2522// CHECK-RV64-NEXT:    [[RETVAL_COERCE:%.*]] = alloca [2 x i64], align 8523// CHECK-RV64-NEXT:    store bfloat [[A]], ptr [[A_ADDR]], align 2524// CHECK-RV64-NEXT:    store bfloat [[B]], ptr [[B_ADDR]], align 2525// CHECK-RV64-NEXT:    store bfloat [[C]], ptr [[C_ADDR]], align 2526// CHECK-RV64-NEXT:    store bfloat [[D]], ptr [[D_ADDR]], align 2527// CHECK-RV64-NEXT:    store bfloat [[E]], ptr [[E_ADDR]], align 2528// CHECK-RV64-NEXT:    [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 2529// CHECK-RV64-NEXT:    [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT5]], ptr [[RETVAL]], i32 0, i32 0530// CHECK-RV64-NEXT:    store bfloat [[TMP0]], ptr [[A1]], align 2531// CHECK-RV64-NEXT:    [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2532// CHECK-RV64-NEXT:    [[B2:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT5]], ptr [[RETVAL]], i32 0, i32 1533// CHECK-RV64-NEXT:    store bfloat [[TMP1]], ptr [[B2]], align 2534// CHECK-RV64-NEXT:    [[TMP2:%.*]] = load bfloat, ptr [[C_ADDR]], align 2535// CHECK-RV64-NEXT:    [[C3:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT5]], ptr [[RETVAL]], i32 0, i32 2536// CHECK-RV64-NEXT:    store bfloat [[TMP2]], ptr [[C3]], align 2537// CHECK-RV64-NEXT:    [[TMP3:%.*]] = load bfloat, ptr [[D_ADDR]], align 2538// CHECK-RV64-NEXT:    [[D4:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT5]], ptr [[RETVAL]], i32 0, i32 3539// CHECK-RV64-NEXT:    store bfloat [[TMP3]], ptr [[D4]], align 2540// CHECK-RV64-NEXT:    [[TMP4:%.*]] = load bfloat, ptr [[E_ADDR]], align 2541// CHECK-RV64-NEXT:    [[E5:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT5]], ptr [[RETVAL]], i32 0, i32 4542// CHECK-RV64-NEXT:    store bfloat [[TMP4]], ptr [[E5]], align 2543// CHECK-RV64-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[RETVAL_COERCE]], ptr align 2 [[RETVAL]], i64 10, i1 false)544// CHECK-RV64-NEXT:    [[TMP5:%.*]] = load [2 x i64], ptr [[RETVAL_COERCE]], align 8545// CHECK-RV64-NEXT:    ret [2 x i64] [[TMP5]]546//547// CHECK-RV32-LABEL: define dso_local void @h5548// CHECK-RV32-SAME: (ptr dead_on_unwind noalias writable sret([[STRUCT_BFLOAT5:%.*]]) align 2 [[AGG_RESULT:%.*]], bfloat noundef [[A:%.*]], bfloat noundef [[B:%.*]], bfloat noundef [[C:%.*]], bfloat noundef [[D:%.*]], bfloat noundef [[E:%.*]]) #[[ATTR0]] {549// CHECK-RV32-NEXT:  entry:550// CHECK-RV32-NEXT:    [[RESULT_PTR:%.*]] = alloca ptr, align 4551// CHECK-RV32-NEXT:    [[A_ADDR:%.*]] = alloca bfloat, align 2552// CHECK-RV32-NEXT:    [[B_ADDR:%.*]] = alloca bfloat, align 2553// CHECK-RV32-NEXT:    [[C_ADDR:%.*]] = alloca bfloat, align 2554// CHECK-RV32-NEXT:    [[D_ADDR:%.*]] = alloca bfloat, align 2555// CHECK-RV32-NEXT:    [[E_ADDR:%.*]] = alloca bfloat, align 2556// CHECK-RV32-NEXT:    store ptr [[AGG_RESULT]], ptr [[RESULT_PTR]], align 4557// CHECK-RV32-NEXT:    store bfloat [[A]], ptr [[A_ADDR]], align 2558// CHECK-RV32-NEXT:    store bfloat [[B]], ptr [[B_ADDR]], align 2559// CHECK-RV32-NEXT:    store bfloat [[C]], ptr [[C_ADDR]], align 2560// CHECK-RV32-NEXT:    store bfloat [[D]], ptr [[D_ADDR]], align 2561// CHECK-RV32-NEXT:    store bfloat [[E]], ptr [[E_ADDR]], align 2562// CHECK-RV32-NEXT:    [[TMP0:%.*]] = load bfloat, ptr [[A_ADDR]], align 2563// CHECK-RV32-NEXT:    [[A1:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT5]], ptr [[AGG_RESULT]], i32 0, i32 0564// CHECK-RV32-NEXT:    store bfloat [[TMP0]], ptr [[A1]], align 2565// CHECK-RV32-NEXT:    [[TMP1:%.*]] = load bfloat, ptr [[B_ADDR]], align 2566// CHECK-RV32-NEXT:    [[B2:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT5]], ptr [[AGG_RESULT]], i32 0, i32 1567// CHECK-RV32-NEXT:    store bfloat [[TMP1]], ptr [[B2]], align 2568// CHECK-RV32-NEXT:    [[TMP2:%.*]] = load bfloat, ptr [[C_ADDR]], align 2569// CHECK-RV32-NEXT:    [[C3:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT5]], ptr [[AGG_RESULT]], i32 0, i32 2570// CHECK-RV32-NEXT:    store bfloat [[TMP2]], ptr [[C3]], align 2571// CHECK-RV32-NEXT:    [[TMP3:%.*]] = load bfloat, ptr [[D_ADDR]], align 2572// CHECK-RV32-NEXT:    [[D4:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT5]], ptr [[AGG_RESULT]], i32 0, i32 3573// CHECK-RV32-NEXT:    store bfloat [[TMP3]], ptr [[D4]], align 2574// CHECK-RV32-NEXT:    [[TMP4:%.*]] = load bfloat, ptr [[E_ADDR]], align 2575// CHECK-RV32-NEXT:    [[E5:%.*]] = getelementptr inbounds nuw [[STRUCT_BFLOAT5]], ptr [[AGG_RESULT]], i32 0, i32 4576// CHECK-RV32-NEXT:    store bfloat [[TMP4]], ptr [[E5]], align 2577// CHECK-RV32-NEXT:    ret void578//579struct bfloat5 h5(__bf16 a, __bf16 b, __bf16 c, __bf16 d, __bf16 e) {580  struct bfloat5 x;581  x.a = a;582  x.b = b;583  x.c = c;584  x.d = d;585  x.e = e;586  return x;587}588