xref: /llvm-project/clang/test/CodeGenCXX/LoongArch/abi-lp64d-struct-inherit.cpp (revision 7d88a05cc01c8d8950d88e96fd8516af67b10b8e)
1*7d88a05cSWeining Lu // RUN: %clang_cc1 -triple loongarch64 -target-feature +f -target-feature +d -target-abi lp64d \
2*7d88a05cSWeining Lu // RUN:   -emit-llvm %s -o - | FileCheck %s
3*7d88a05cSWeining Lu 
4*7d88a05cSWeining Lu #include <stdint.h>
5*7d88a05cSWeining Lu 
6*7d88a05cSWeining Lu /// Ensure that fields inherited from a parent struct are treated in the same
7*7d88a05cSWeining Lu /// way as fields directly in the child for the purposes of LoongArch ABI rules.
8*7d88a05cSWeining Lu 
9*7d88a05cSWeining Lu struct parent1_int32_s {
10*7d88a05cSWeining Lu   int32_t i1;
11*7d88a05cSWeining Lu };
12*7d88a05cSWeining Lu 
13*7d88a05cSWeining Lu struct child1_int32_s : parent1_int32_s {
14*7d88a05cSWeining Lu   int32_t i2;
15*7d88a05cSWeining Lu };
16*7d88a05cSWeining Lu 
17*7d88a05cSWeining Lu // CHECK-LABEL: define{{.*}} i64 @_Z30int32_int32_struct_inheritance14child1_int32_s(i64 %a.coerce)
int32_int32_struct_inheritance(struct child1_int32_s a)18*7d88a05cSWeining Lu struct child1_int32_s int32_int32_struct_inheritance(struct child1_int32_s a) {
19*7d88a05cSWeining Lu   return a;
20*7d88a05cSWeining Lu }
21*7d88a05cSWeining Lu 
22*7d88a05cSWeining Lu struct parent2_int32_s {
23*7d88a05cSWeining Lu   int32_t i1;
24*7d88a05cSWeining Lu };
25*7d88a05cSWeining Lu 
26*7d88a05cSWeining Lu struct child2_float_s : parent2_int32_s {
27*7d88a05cSWeining Lu   float f1;
28*7d88a05cSWeining Lu };
29*7d88a05cSWeining Lu 
30*7d88a05cSWeining Lu // CHECK-LABEL: define{{.*}} { i32, float } @_Z30int32_float_struct_inheritance14child2_float_s(i32 %0, float %1)
int32_float_struct_inheritance(struct child2_float_s a)31*7d88a05cSWeining Lu struct child2_float_s int32_float_struct_inheritance(struct child2_float_s a) {
32*7d88a05cSWeining Lu   return a;
33*7d88a05cSWeining Lu }
34*7d88a05cSWeining Lu 
35*7d88a05cSWeining Lu struct parent3_float_s {
36*7d88a05cSWeining Lu   float f1;
37*7d88a05cSWeining Lu };
38*7d88a05cSWeining Lu 
39*7d88a05cSWeining Lu struct child3_int64_s : parent3_float_s {
40*7d88a05cSWeining Lu   int64_t i1;
41*7d88a05cSWeining Lu };
42*7d88a05cSWeining Lu 
43*7d88a05cSWeining Lu // CHECK-LABEL: define{{.*}} { float, i64 } @_Z30float_int64_struct_inheritance14child3_int64_s(float %0, i64 %1)
float_int64_struct_inheritance(struct child3_int64_s a)44*7d88a05cSWeining Lu struct child3_int64_s float_int64_struct_inheritance(struct child3_int64_s a) {
45*7d88a05cSWeining Lu   return a;
46*7d88a05cSWeining Lu }
47*7d88a05cSWeining Lu 
48*7d88a05cSWeining Lu struct parent4_double_s {
49*7d88a05cSWeining Lu   double d1;
50*7d88a05cSWeining Lu };
51*7d88a05cSWeining Lu 
52*7d88a05cSWeining Lu struct child4_double_s : parent4_double_s {
53*7d88a05cSWeining Lu   double d1;
54*7d88a05cSWeining Lu };
55*7d88a05cSWeining Lu 
56*7d88a05cSWeining Lu // CHECK-LABEL: define{{.*}} { double, double } @_Z32double_double_struct_inheritance15child4_double_s(double %0, double %1)
double_double_struct_inheritance(struct child4_double_s a)57*7d88a05cSWeining Lu struct child4_double_s double_double_struct_inheritance(struct child4_double_s a) {
58*7d88a05cSWeining Lu   return a;
59*7d88a05cSWeining Lu }
60*7d88a05cSWeining Lu 
61*7d88a05cSWeining Lu /// When virtual inheritance is used, the resulting struct isn't eligible for
62*7d88a05cSWeining Lu /// passing in registers.
63*7d88a05cSWeining Lu 
64*7d88a05cSWeining Lu struct parent5_virtual_s {
65*7d88a05cSWeining Lu   int32_t i1;
66*7d88a05cSWeining Lu };
67*7d88a05cSWeining Lu 
68*7d88a05cSWeining Lu struct child5_virtual_s : virtual parent5_virtual_s {
69*7d88a05cSWeining Lu   float f1;
70*7d88a05cSWeining Lu };
71*7d88a05cSWeining Lu 
72*7d88a05cSWeining Lu // CHECK-LABEL: define{{.*}} void @_ZN16child5_virtual_sC1EOS_(ptr noundef nonnull align 8 dereferenceable(12) %this, ptr noundef nonnull align 8 dereferenceable(12) %0)
int32_float_virtual_struct_inheritance(struct child5_virtual_s a)73*7d88a05cSWeining Lu struct child5_virtual_s int32_float_virtual_struct_inheritance(struct child5_virtual_s a) {
74*7d88a05cSWeining Lu   return a;
75*7d88a05cSWeining Lu }
76*7d88a05cSWeining Lu 
77*7d88a05cSWeining Lu /// Check for correct lowering in the presence of diamond inheritance.
78*7d88a05cSWeining Lu 
79*7d88a05cSWeining Lu struct parent6_float_s {
80*7d88a05cSWeining Lu   float f1;
81*7d88a05cSWeining Lu };
82*7d88a05cSWeining Lu 
83*7d88a05cSWeining Lu struct child6a_s : parent6_float_s {
84*7d88a05cSWeining Lu };
85*7d88a05cSWeining Lu 
86*7d88a05cSWeining Lu struct child6b_s : parent6_float_s {
87*7d88a05cSWeining Lu };
88*7d88a05cSWeining Lu 
89*7d88a05cSWeining Lu struct grandchild_6_s : child6a_s, child6b_s {
90*7d88a05cSWeining Lu };
91*7d88a05cSWeining Lu 
92*7d88a05cSWeining Lu // CHECK-LABEL: define{{.*}} { float, float } @_Z38float_float_diamond_struct_inheritance14grandchild_6_s(float %0, float %1)
float_float_diamond_struct_inheritance(struct grandchild_6_s a)93*7d88a05cSWeining Lu struct grandchild_6_s float_float_diamond_struct_inheritance(struct grandchild_6_s a) {
94*7d88a05cSWeining Lu   return a;
95*7d88a05cSWeining Lu }
96