Skip to content

Commit dcb3e80

Browse files
author
Krzysztof Parzyszek
committed
[Hexagon] Make conversions to vector predicate types explicit for builtins
HVX does not have load/store instructions for vector predicates (i.e. bool vectors). Because of that, vector predicates need to be converted to another type before being stored, and the most convenient representation is an HVX vector. As a consequence, in C/C++, source-level builtins that either take or produce vector predicates take or return regular vectors instead. On the other hand, the corresponding LLVM intrinsics do have boolean types that, and so a conversion of the operand or the return value was necessary. This conversion would happen inside clang's codegen, but was somewhat fragile. This patch changes the strategy: a builtin that takes a vector predicate now really expects a vector predicate. Since such a predicate cannot be provided via a variable, this builtin must be composed with other builtins that either convert vector to a predicate (V6_vandvrt) or predicate to a vector (V6_vandqrt). For users using builtins defined in hvx_hexagon_protos.h there is no impact: the conversions were added to that file. Other users will need to insert - __builtin_HEXAGON_V6_vandvrt[_128B](V, -1) to convert vector V to a vector predicate, or - __builtin_HEXAGON_V6_vandqrt[_128B](Q, -1) to convert vector predicate Q to a vector. Builtins __builtin_HEXAGON_V6_vmaskedstore.* are a temporary exception to that, but they are deprecated and should not be used anyway. In the future they will either follow the same rule, or be removed.
1 parent 86618e3 commit dcb3e80

File tree

8 files changed

+849
-1083
lines changed

8 files changed

+849
-1083
lines changed

clang/include/clang/Basic/BuiltinsHexagonMapCustomDep.def

Lines changed: 0 additions & 192 deletions
Original file line numberDiff line numberDiff line change
@@ -8,199 +8,7 @@
88
// Automatically generated file, do not edit!
99
//===----------------------------------------------------------------------===//
1010

11-
CUSTOM_BUILTIN_MAPPING(A2_add, 0)
12-
CUSTOM_BUILTIN_MAPPING(A2_addi, 0)
13-
CUSTOM_BUILTIN_MAPPING(A2_addp, 0)
14-
CUSTOM_BUILTIN_MAPPING(A2_and, 0)
15-
CUSTOM_BUILTIN_MAPPING(A2_andir, 0)
16-
CUSTOM_BUILTIN_MAPPING(A2_neg, 0)
17-
CUSTOM_BUILTIN_MAPPING(A2_not, 0)
18-
CUSTOM_BUILTIN_MAPPING(A2_or, 0)
19-
CUSTOM_BUILTIN_MAPPING(A2_orir, 0)
20-
CUSTOM_BUILTIN_MAPPING(A2_sub, 0)
21-
CUSTOM_BUILTIN_MAPPING(A2_subp, 0)
22-
CUSTOM_BUILTIN_MAPPING(A2_subri, 0)
23-
CUSTOM_BUILTIN_MAPPING(A2_sxtb, 0)
24-
CUSTOM_BUILTIN_MAPPING(A2_sxth, 0)
25-
CUSTOM_BUILTIN_MAPPING(A2_xor, 0)
26-
CUSTOM_BUILTIN_MAPPING(A2_zxtb, 0)
27-
CUSTOM_BUILTIN_MAPPING(A2_zxth, 0)
28-
CUSTOM_BUILTIN_MAPPING(M2_dpmpyss_s0, 0)
29-
CUSTOM_BUILTIN_MAPPING(M2_dpmpyuu_s0, 0)
30-
CUSTOM_BUILTIN_MAPPING(M2_mpyi, 0)
31-
CUSTOM_BUILTIN_MAPPING(M2_mpysmi, 0)
32-
CUSTOM_BUILTIN_MAPPING(M2_mpyui, 0)
33-
CUSTOM_BUILTIN_MAPPING(S2_asl_i_p, 0)
34-
CUSTOM_BUILTIN_MAPPING(S2_asl_i_r, 0)
35-
CUSTOM_BUILTIN_MAPPING(S2_asr_i_p, 0)
36-
CUSTOM_BUILTIN_MAPPING(S2_asr_i_r, 0)
37-
CUSTOM_BUILTIN_MAPPING(S2_lsr_i_p, 0)
38-
CUSTOM_BUILTIN_MAPPING(S2_lsr_i_r, 0)
39-
CUSTOM_BUILTIN_MAPPING(V6_pred_and, 64)
40-
CUSTOM_BUILTIN_MAPPING(V6_pred_and_128B, 128)
41-
CUSTOM_BUILTIN_MAPPING(V6_pred_and_n, 64)
42-
CUSTOM_BUILTIN_MAPPING(V6_pred_and_n_128B, 128)
43-
CUSTOM_BUILTIN_MAPPING(V6_pred_not, 64)
44-
CUSTOM_BUILTIN_MAPPING(V6_pred_not_128B, 128)
45-
CUSTOM_BUILTIN_MAPPING(V6_pred_or, 64)
46-
CUSTOM_BUILTIN_MAPPING(V6_pred_or_128B, 128)
47-
CUSTOM_BUILTIN_MAPPING(V6_pred_or_n, 64)
48-
CUSTOM_BUILTIN_MAPPING(V6_pred_or_n_128B, 128)
49-
CUSTOM_BUILTIN_MAPPING(V6_pred_scalar2, 64)
50-
CUSTOM_BUILTIN_MAPPING(V6_pred_scalar2_128B, 128)
51-
CUSTOM_BUILTIN_MAPPING(V6_pred_xor, 64)
52-
CUSTOM_BUILTIN_MAPPING(V6_pred_xor_128B, 128)
53-
CUSTOM_BUILTIN_MAPPING(V6_vS32b_nqpred_ai, 64)
54-
CUSTOM_BUILTIN_MAPPING(V6_vS32b_nqpred_ai_128B, 128)
55-
CUSTOM_BUILTIN_MAPPING(V6_vS32b_nt_nqpred_ai, 64)
56-
CUSTOM_BUILTIN_MAPPING(V6_vS32b_nt_nqpred_ai_128B, 128)
57-
CUSTOM_BUILTIN_MAPPING(V6_vS32b_nt_qpred_ai, 64)
58-
CUSTOM_BUILTIN_MAPPING(V6_vS32b_nt_qpred_ai_128B, 128)
59-
CUSTOM_BUILTIN_MAPPING(V6_vS32b_qpred_ai, 64)
60-
CUSTOM_BUILTIN_MAPPING(V6_vS32b_qpred_ai_128B, 128)
61-
CUSTOM_BUILTIN_MAPPING(V6_vaddbnq, 64)
62-
CUSTOM_BUILTIN_MAPPING(V6_vaddbnq_128B, 128)
63-
CUSTOM_BUILTIN_MAPPING(V6_vaddbq, 64)
64-
CUSTOM_BUILTIN_MAPPING(V6_vaddbq_128B, 128)
65-
CUSTOM_BUILTIN_MAPPING(V6_vaddhnq, 64)
66-
CUSTOM_BUILTIN_MAPPING(V6_vaddhnq_128B, 128)
67-
CUSTOM_BUILTIN_MAPPING(V6_vaddhq, 64)
68-
CUSTOM_BUILTIN_MAPPING(V6_vaddhq_128B, 128)
69-
CUSTOM_BUILTIN_MAPPING(V6_vaddwnq, 64)
70-
CUSTOM_BUILTIN_MAPPING(V6_vaddwnq_128B, 128)
71-
CUSTOM_BUILTIN_MAPPING(V6_vaddwq, 64)
72-
CUSTOM_BUILTIN_MAPPING(V6_vaddwq_128B, 128)
73-
CUSTOM_BUILTIN_MAPPING(V6_vandqrt, 64)
74-
CUSTOM_BUILTIN_MAPPING(V6_vandqrt_128B, 128)
75-
CUSTOM_BUILTIN_MAPPING(V6_vandqrt_acc, 64)
76-
CUSTOM_BUILTIN_MAPPING(V6_vandqrt_acc_128B, 128)
77-
CUSTOM_BUILTIN_MAPPING(V6_vandvrt, 64)
78-
CUSTOM_BUILTIN_MAPPING(V6_vandvrt_128B, 128)
79-
CUSTOM_BUILTIN_MAPPING(V6_vandvrt_acc, 64)
80-
CUSTOM_BUILTIN_MAPPING(V6_vandvrt_acc_128B, 128)
81-
CUSTOM_BUILTIN_MAPPING(V6_veqb, 64)
82-
CUSTOM_BUILTIN_MAPPING(V6_veqb_128B, 128)
83-
CUSTOM_BUILTIN_MAPPING(V6_veqb_and, 64)
84-
CUSTOM_BUILTIN_MAPPING(V6_veqb_and_128B, 128)
85-
CUSTOM_BUILTIN_MAPPING(V6_veqb_or, 64)
86-
CUSTOM_BUILTIN_MAPPING(V6_veqb_or_128B, 128)
87-
CUSTOM_BUILTIN_MAPPING(V6_veqb_xor, 64)
88-
CUSTOM_BUILTIN_MAPPING(V6_veqb_xor_128B, 128)
89-
CUSTOM_BUILTIN_MAPPING(V6_veqh, 64)
90-
CUSTOM_BUILTIN_MAPPING(V6_veqh_128B, 128)
91-
CUSTOM_BUILTIN_MAPPING(V6_veqh_and, 64)
92-
CUSTOM_BUILTIN_MAPPING(V6_veqh_and_128B, 128)
93-
CUSTOM_BUILTIN_MAPPING(V6_veqh_or, 64)
94-
CUSTOM_BUILTIN_MAPPING(V6_veqh_or_128B, 128)
95-
CUSTOM_BUILTIN_MAPPING(V6_veqh_xor, 64)
96-
CUSTOM_BUILTIN_MAPPING(V6_veqh_xor_128B, 128)
97-
CUSTOM_BUILTIN_MAPPING(V6_veqw, 64)
98-
CUSTOM_BUILTIN_MAPPING(V6_veqw_128B, 128)
99-
CUSTOM_BUILTIN_MAPPING(V6_veqw_and, 64)
100-
CUSTOM_BUILTIN_MAPPING(V6_veqw_and_128B, 128)
101-
CUSTOM_BUILTIN_MAPPING(V6_veqw_or, 64)
102-
CUSTOM_BUILTIN_MAPPING(V6_veqw_or_128B, 128)
103-
CUSTOM_BUILTIN_MAPPING(V6_veqw_xor, 64)
104-
CUSTOM_BUILTIN_MAPPING(V6_veqw_xor_128B, 128)
105-
CUSTOM_BUILTIN_MAPPING(V6_vgtb, 64)
106-
CUSTOM_BUILTIN_MAPPING(V6_vgtb_128B, 128)
107-
CUSTOM_BUILTIN_MAPPING(V6_vgtb_and, 64)
108-
CUSTOM_BUILTIN_MAPPING(V6_vgtb_and_128B, 128)
109-
CUSTOM_BUILTIN_MAPPING(V6_vgtb_or, 64)
110-
CUSTOM_BUILTIN_MAPPING(V6_vgtb_or_128B, 128)
111-
CUSTOM_BUILTIN_MAPPING(V6_vgtb_xor, 64)
112-
CUSTOM_BUILTIN_MAPPING(V6_vgtb_xor_128B, 128)
113-
CUSTOM_BUILTIN_MAPPING(V6_vgth, 64)
114-
CUSTOM_BUILTIN_MAPPING(V6_vgth_128B, 128)
115-
CUSTOM_BUILTIN_MAPPING(V6_vgth_and, 64)
116-
CUSTOM_BUILTIN_MAPPING(V6_vgth_and_128B, 128)
117-
CUSTOM_BUILTIN_MAPPING(V6_vgth_or, 64)
118-
CUSTOM_BUILTIN_MAPPING(V6_vgth_or_128B, 128)
119-
CUSTOM_BUILTIN_MAPPING(V6_vgth_xor, 64)
120-
CUSTOM_BUILTIN_MAPPING(V6_vgth_xor_128B, 128)
121-
CUSTOM_BUILTIN_MAPPING(V6_vgtub, 64)
122-
CUSTOM_BUILTIN_MAPPING(V6_vgtub_128B, 128)
123-
CUSTOM_BUILTIN_MAPPING(V6_vgtub_and, 64)
124-
CUSTOM_BUILTIN_MAPPING(V6_vgtub_and_128B, 128)
125-
CUSTOM_BUILTIN_MAPPING(V6_vgtub_or, 64)
126-
CUSTOM_BUILTIN_MAPPING(V6_vgtub_or_128B, 128)
127-
CUSTOM_BUILTIN_MAPPING(V6_vgtub_xor, 64)
128-
CUSTOM_BUILTIN_MAPPING(V6_vgtub_xor_128B, 128)
129-
CUSTOM_BUILTIN_MAPPING(V6_vgtuh, 64)
130-
CUSTOM_BUILTIN_MAPPING(V6_vgtuh_128B, 128)
131-
CUSTOM_BUILTIN_MAPPING(V6_vgtuh_and, 64)
132-
CUSTOM_BUILTIN_MAPPING(V6_vgtuh_and_128B, 128)
133-
CUSTOM_BUILTIN_MAPPING(V6_vgtuh_or, 64)
134-
CUSTOM_BUILTIN_MAPPING(V6_vgtuh_or_128B, 128)
135-
CUSTOM_BUILTIN_MAPPING(V6_vgtuh_xor, 64)
136-
CUSTOM_BUILTIN_MAPPING(V6_vgtuh_xor_128B, 128)
137-
CUSTOM_BUILTIN_MAPPING(V6_vgtuw, 64)
138-
CUSTOM_BUILTIN_MAPPING(V6_vgtuw_128B, 128)
139-
CUSTOM_BUILTIN_MAPPING(V6_vgtuw_and, 64)
140-
CUSTOM_BUILTIN_MAPPING(V6_vgtuw_and_128B, 128)
141-
CUSTOM_BUILTIN_MAPPING(V6_vgtuw_or, 64)
142-
CUSTOM_BUILTIN_MAPPING(V6_vgtuw_or_128B, 128)
143-
CUSTOM_BUILTIN_MAPPING(V6_vgtuw_xor, 64)
144-
CUSTOM_BUILTIN_MAPPING(V6_vgtuw_xor_128B, 128)
145-
CUSTOM_BUILTIN_MAPPING(V6_vgtw, 64)
146-
CUSTOM_BUILTIN_MAPPING(V6_vgtw_128B, 128)
147-
CUSTOM_BUILTIN_MAPPING(V6_vgtw_and, 64)
148-
CUSTOM_BUILTIN_MAPPING(V6_vgtw_and_128B, 128)
149-
CUSTOM_BUILTIN_MAPPING(V6_vgtw_or, 64)
150-
CUSTOM_BUILTIN_MAPPING(V6_vgtw_or_128B, 128)
151-
CUSTOM_BUILTIN_MAPPING(V6_vgtw_xor, 64)
152-
CUSTOM_BUILTIN_MAPPING(V6_vgtw_xor_128B, 128)
153-
CUSTOM_BUILTIN_MAPPING(V6_vmux, 64)
154-
CUSTOM_BUILTIN_MAPPING(V6_vmux_128B, 128)
155-
CUSTOM_BUILTIN_MAPPING(V6_vsubbnq, 64)
156-
CUSTOM_BUILTIN_MAPPING(V6_vsubbnq_128B, 128)
157-
CUSTOM_BUILTIN_MAPPING(V6_vsubbq, 64)
158-
CUSTOM_BUILTIN_MAPPING(V6_vsubbq_128B, 128)
159-
CUSTOM_BUILTIN_MAPPING(V6_vsubhnq, 64)
160-
CUSTOM_BUILTIN_MAPPING(V6_vsubhnq_128B, 128)
161-
CUSTOM_BUILTIN_MAPPING(V6_vsubhq, 64)
162-
CUSTOM_BUILTIN_MAPPING(V6_vsubhq_128B, 128)
163-
CUSTOM_BUILTIN_MAPPING(V6_vsubwnq, 64)
164-
CUSTOM_BUILTIN_MAPPING(V6_vsubwnq_128B, 128)
165-
CUSTOM_BUILTIN_MAPPING(V6_vsubwq, 64)
166-
CUSTOM_BUILTIN_MAPPING(V6_vsubwq_128B, 128)
167-
CUSTOM_BUILTIN_MAPPING(V6_vswap, 64)
168-
CUSTOM_BUILTIN_MAPPING(V6_vswap_128B, 128)
169-
CUSTOM_BUILTIN_MAPPING(V6_pred_scalar2v2, 64)
170-
CUSTOM_BUILTIN_MAPPING(V6_pred_scalar2v2_128B, 128)
171-
CUSTOM_BUILTIN_MAPPING(V6_shuffeqh, 64)
172-
CUSTOM_BUILTIN_MAPPING(V6_shuffeqh_128B, 128)
173-
CUSTOM_BUILTIN_MAPPING(V6_shuffeqw, 64)
174-
CUSTOM_BUILTIN_MAPPING(V6_shuffeqw_128B, 128)
17511
CUSTOM_BUILTIN_MAPPING(V6_vaddcarry, 64)
17612
CUSTOM_BUILTIN_MAPPING(V6_vaddcarry_128B, 128)
177-
CUSTOM_BUILTIN_MAPPING(V6_vandnqrt, 64)
178-
CUSTOM_BUILTIN_MAPPING(V6_vandnqrt_128B, 128)
179-
CUSTOM_BUILTIN_MAPPING(V6_vandnqrt_acc, 64)
180-
CUSTOM_BUILTIN_MAPPING(V6_vandnqrt_acc_128B, 128)
181-
CUSTOM_BUILTIN_MAPPING(V6_vandvnqv, 64)
182-
CUSTOM_BUILTIN_MAPPING(V6_vandvnqv_128B, 128)
183-
CUSTOM_BUILTIN_MAPPING(V6_vandvqv, 64)
184-
CUSTOM_BUILTIN_MAPPING(V6_vandvqv_128B, 128)
18513
CUSTOM_BUILTIN_MAPPING(V6_vsubcarry, 64)
18614
CUSTOM_BUILTIN_MAPPING(V6_vsubcarry_128B, 128)
187-
CUSTOM_BUILTIN_MAPPING(V6_vgathermhq, 64)
188-
CUSTOM_BUILTIN_MAPPING(V6_vgathermhq_128B, 128)
189-
CUSTOM_BUILTIN_MAPPING(V6_vgathermhwq, 64)
190-
CUSTOM_BUILTIN_MAPPING(V6_vgathermhwq_128B, 128)
191-
CUSTOM_BUILTIN_MAPPING(V6_vgathermwq, 64)
192-
CUSTOM_BUILTIN_MAPPING(V6_vgathermwq_128B, 128)
193-
CUSTOM_BUILTIN_MAPPING(V6_vprefixqb, 64)
194-
CUSTOM_BUILTIN_MAPPING(V6_vprefixqb_128B, 128)
195-
CUSTOM_BUILTIN_MAPPING(V6_vprefixqh, 64)
196-
CUSTOM_BUILTIN_MAPPING(V6_vprefixqh_128B, 128)
197-
CUSTOM_BUILTIN_MAPPING(V6_vprefixqw, 64)
198-
CUSTOM_BUILTIN_MAPPING(V6_vprefixqw_128B, 128)
199-
CUSTOM_BUILTIN_MAPPING(V6_vscattermhq, 64)
200-
CUSTOM_BUILTIN_MAPPING(V6_vscattermhq_128B, 128)
201-
CUSTOM_BUILTIN_MAPPING(V6_vscattermhwq, 64)
202-
CUSTOM_BUILTIN_MAPPING(V6_vscattermhwq_128B, 128)
203-
CUSTOM_BUILTIN_MAPPING(V6_vscattermwq, 64)
204-
CUSTOM_BUILTIN_MAPPING(V6_vscattermwq_128B, 128)
205-
CUSTOM_BUILTIN_MAPPING(V6_vaddcarrysat, 64)
206-
CUSTOM_BUILTIN_MAPPING(V6_vaddcarrysat_128B, 128)

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 22 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -18596,6 +18596,7 @@ getIntrinsicForHexagonNonGCCBuiltin(unsigned BuiltinID) {
1859618596
CUSTOM_BUILTIN_MAPPING(S2_storerf_pcr, 0)
1859718597
CUSTOM_BUILTIN_MAPPING(S2_storeri_pcr, 0)
1859818598
CUSTOM_BUILTIN_MAPPING(S2_storerd_pcr, 0)
18599+
// Legacy builtins that take a vector in place of a vector predicate.
1859918600
CUSTOM_BUILTIN_MAPPING(V6_vmaskedstoreq, 64)
1860018601
CUSTOM_BUILTIN_MAPPING(V6_vmaskedstorenq, 64)
1860118602
CUSTOM_BUILTIN_MAPPING(V6_vmaskedstorentq, 64)
@@ -18733,6 +18734,27 @@ Value *CodeGenFunction::EmitHexagonBuiltinExpr(unsigned BuiltinID,
1873318734
return Builder.CreateExtractValue(Result, 0);
1873418735
}
1873518736

18737+
case Hexagon::BI__builtin_HEXAGON_V6_vmaskedstoreq:
18738+
case Hexagon::BI__builtin_HEXAGON_V6_vmaskedstorenq:
18739+
case Hexagon::BI__builtin_HEXAGON_V6_vmaskedstorentq:
18740+
case Hexagon::BI__builtin_HEXAGON_V6_vmaskedstorentnq:
18741+
case Hexagon::BI__builtin_HEXAGON_V6_vmaskedstoreq_128B:
18742+
case Hexagon::BI__builtin_HEXAGON_V6_vmaskedstorenq_128B:
18743+
case Hexagon::BI__builtin_HEXAGON_V6_vmaskedstorentq_128B:
18744+
case Hexagon::BI__builtin_HEXAGON_V6_vmaskedstorentnq_128B: {
18745+
SmallVector<llvm::Value*,4> Ops;
18746+
const Expr *PredOp = E->getArg(0);
18747+
// There will be an implicit cast to a boolean vector. Strip it.
18748+
if (auto *Cast = dyn_cast<ImplicitCastExpr>(PredOp)) {
18749+
if (Cast->getCastKind() == CK_BitCast)
18750+
PredOp = Cast->getSubExpr();
18751+
Ops.push_back(V2Q(EmitScalarExpr(PredOp)));
18752+
}
18753+
for (int i = 1, e = E->getNumArgs(); i != e; ++i)
18754+
Ops.push_back(EmitScalarExpr(E->getArg(i)));
18755+
return Builder.CreateCall(CGM.getIntrinsic(ID), Ops);
18756+
}
18757+
1873618758
case Hexagon::BI__builtin_HEXAGON_L2_loadrub_pci:
1873718759
case Hexagon::BI__builtin_HEXAGON_L2_loadrb_pci:
1873818760
case Hexagon::BI__builtin_HEXAGON_L2_loadruh_pci:
@@ -18769,40 +18791,6 @@ Value *CodeGenFunction::EmitHexagonBuiltinExpr(unsigned BuiltinID,
1876918791
return MakeBrevLd(Intrinsic::hexagon_L2_loadri_pbr, Int32Ty);
1877018792
case Hexagon::BI__builtin_brev_ldd:
1877118793
return MakeBrevLd(Intrinsic::hexagon_L2_loadrd_pbr, Int64Ty);
18772-
18773-
default: {
18774-
if (ID == Intrinsic::not_intrinsic)
18775-
return nullptr;
18776-
18777-
auto IsVectorPredTy = [](llvm::Type *T) {
18778-
return T->isVectorTy() &&
18779-
cast<llvm::VectorType>(T)->getElementType()->isIntegerTy(1);
18780-
};
18781-
18782-
llvm::Function *IntrFn = CGM.getIntrinsic(ID);
18783-
llvm::FunctionType *IntrTy = IntrFn->getFunctionType();
18784-
SmallVector<llvm::Value*,4> Ops;
18785-
for (unsigned i = 0, e = IntrTy->getNumParams(); i != e; ++i) {
18786-
llvm::Type *T = IntrTy->getParamType(i);
18787-
const Expr *A = E->getArg(i);
18788-
if (IsVectorPredTy(T)) {
18789-
// There will be an implicit cast to a boolean vector. Strip it.
18790-
if (auto *Cast = dyn_cast<ImplicitCastExpr>(A)) {
18791-
if (Cast->getCastKind() == CK_BitCast)
18792-
A = Cast->getSubExpr();
18793-
}
18794-
Ops.push_back(V2Q(EmitScalarExpr(A)));
18795-
} else {
18796-
Ops.push_back(EmitScalarExpr(A));
18797-
}
18798-
}
18799-
18800-
llvm::Value *Call = Builder.CreateCall(IntrFn, Ops);
18801-
if (IsVectorPredTy(IntrTy->getReturnType()))
18802-
Call = Q2V(Call);
18803-
18804-
return Call;
18805-
} // default
1880618794
} // switch
1880718795

1880818796
return nullptr;

0 commit comments

Comments
 (0)