Skip to content

Commit 560d94f

Browse files
committed
Delete Shader Model version based overload type specification.
1 parent 0b838b8 commit 560d94f

File tree

6 files changed

+54
-179
lines changed

6 files changed

+54
-179
lines changed

llvm/include/llvm/Support/DXILABI.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,4 @@ enum class ElementType : uint32_t {
9090
} // namespace dxil
9191
} // namespace llvm
9292

93-
struct DXILShaderModel {
94-
unsigned Major = 0;
95-
unsigned Minor = 0;
96-
};
97-
9893
#endif // LLVM_SUPPORT_DXILABI_H

llvm/lib/Target/DirectX/DXIL.td

Lines changed: 37 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,6 @@
1313

1414
include "llvm/IR/Intrinsics.td"
1515

16-
// Abstract class to represent major and minor version values
17-
class Version<int major, int minor> {
18-
int Major = major;
19-
int Minor = minor;
20-
}
21-
22-
// Valid minimum Shader model version records
23-
24-
// Shader Model 6.0 - 6.8
25-
foreach i = 0...8 in {
26-
def SM6_#i : Version<6, i>;
27-
}
28-
29-
// Abstraction of class mapping valid DXIL Op overloads the minimum
30-
// version of Shader Model they are supported
31-
class DXILOpOverload<Version minsm, list<LLVMType> overloads> {
32-
Version ShaderModel = minsm;
33-
list<LLVMType> OpOverloads = overloads;
34-
}
35-
3616
// Abstraction of DXIL Operation class.
3717
// It encapsulates an associated function signature viz.,
3818
// returnTy(param1Ty, param2Ty, ...) represented as a list of LLVMTypes.
@@ -44,10 +24,9 @@ class DXILOpClass<list<LLVMType> OpSig> {
4424
}
4525

4626
// Concrete definitions of DXIL Op Classes
47-
// Note that these class name strings are specified as the third argument
48-
// of add_dixil_op in utils/hct/hctdb.py and case converted in
49-
// utils/hct/hctdb_instrhelp.py of DirectXShaderCompiler repo. The function
50-
// name has the format "dx.op.<class-name>.<return-type>", in most cases.
27+
// Refer to the design document
28+
// (https://github.com/llvm/llvm-project/blob/main/llvm/docs/DirectX/DXILOpTableGenDesign.rst)
29+
// for details about the use of DXIL Op Class name.
5130

5231
// NOTE: The following list is not complete. Classes need to be defined as new DXIL Ops
5332
// are added.
@@ -81,123 +60,120 @@ class DXILOpPropertiesBase {
8160
int OpCode = 0; // Opcode of DXIL Operation
8261
DXILOpClass OpClass = UnknownOpClass;// Class of DXIL Operation.
8362
Intrinsic LLVMIntrinsic = ?; // LLVM Intrinsic DXIL Operation maps to
84-
list<DXILOpOverload> OpOverloadTypes = ?; // Valid overload type
63+
list<LLVMType> OpOverloadTypes = ?; // Valid overload type
8564
// of DXIL Operation
8665
string Doc = ""; // A short description of the operation
8766
}
8867

8968
class DXILOpProperties<int opCode,
9069
Intrinsic intrinsic,
91-
list<DXILOpOverload> overloadTypes,
70+
list<LLVMType> overloadTypes,
9271
string doc> : DXILOpPropertiesBase {
9372
int OpCode = opCode;
9473
Intrinsic LLVMIntrinsic = intrinsic;
95-
list<DXILOpOverload> OpOverloadTypes = overloadTypes;
74+
list<LLVMType> OpOverloadTypes = overloadTypes;
9675
string Doc = doc;
9776
}
9877

9978
// Concrete definitions of DXIL Operation Properties to corresponding LLVM intrinsic
10079

10180
// IsSpecialFloat Class
10281
let OpClass = isSpecialFloat in {
103-
def IsInf : DXILOpProperties<9, int_dx_isinf, [DXILOpOverload<SM6_0, [llvm_half_ty, llvm_float_ty]>],
82+
def IsInf : DXILOpProperties<9, int_dx_isinf, [llvm_half_ty, llvm_float_ty],
10483
"Determines if the specified value is infinite.">;
10584
}
10685

10786
let OpClass = unary in {
108-
def Abs : DXILOpProperties<6, int_fabs, [DXILOpOverload<SM6_0, [llvm_half_ty, llvm_float_ty, llvm_double_ty]>],
87+
def Abs : DXILOpProperties<6, int_fabs, [llvm_half_ty, llvm_float_ty, llvm_double_ty],
10988
"Returns the absolute value of the input.">;
11089

111-
def Cos : DXILOpProperties<12, int_cos, [DXILOpOverload<SM6_0, [llvm_half_ty, llvm_float_ty]>],
90+
def Cos : DXILOpProperties<12, int_cos, [llvm_half_ty, llvm_float_ty],
11291
"Returns cosine(theta) for theta in radians.">;
113-
def Sin : DXILOpProperties<13, int_sin, [DXILOpOverload<SM6_0, [llvm_half_ty, llvm_float_ty]>],
92+
def Sin : DXILOpProperties<13, int_sin, [llvm_half_ty, llvm_float_ty],
11493
"Returns sine(theta) for theta in radians.">;
115-
def Tan : DXILOpProperties<14, int_tan, [DXILOpOverload<SM6_0, [llvm_half_ty, llvm_float_ty]>],
94+
def Tan : DXILOpProperties<14, int_tan, [llvm_half_ty, llvm_float_ty],
11695
"Returns tangent(theta) for theta in radians.">;
117-
def Exp2 : DXILOpProperties<21, int_exp2, [DXILOpOverload<SM6_0, [llvm_half_ty, llvm_float_ty]>],
96+
def Exp2 : DXILOpProperties<21, int_exp2, [llvm_half_ty, llvm_float_ty],
11897
"Returns the base 2 exponential, or 2**x, of the"
11998
" specified value. exp2(x) = 2**x.">;
120-
def Frac : DXILOpProperties<22, int_dx_frac, [DXILOpOverload<SM6_0, [llvm_half_ty, llvm_float_ty]>],
99+
def Frac : DXILOpProperties<22, int_dx_frac, [llvm_half_ty, llvm_float_ty],
121100
"Returns a fraction from 0 to 1 that represents the"
122101
" decimal part of the input.">;
123-
def Log2 : DXILOpProperties<23, int_log2, [DXILOpOverload<SM6_0, [llvm_half_ty, llvm_float_ty]>],
102+
def Log2 : DXILOpProperties<23, int_log2, [llvm_half_ty, llvm_float_ty],
124103
"Returns the base-2 logarithm of the specified value.">;
125-
def Sqrt : DXILOpProperties<24, int_sqrt, [DXILOpOverload<SM6_0, [llvm_half_ty, llvm_float_ty]>],
104+
def Sqrt : DXILOpProperties<24, int_sqrt, [llvm_half_ty, llvm_float_ty],
126105
"Returns the square root of the specified floating-point"
127106
"value, per component.">;
128-
def RSqrt : DXILOpProperties<25, int_dx_rsqrt, [DXILOpOverload<SM6_0, [llvm_half_ty, llvm_float_ty]>],
107+
def RSqrt : DXILOpProperties<25, int_dx_rsqrt, [llvm_half_ty, llvm_float_ty],
129108
"Returns the reciprocal of the square root of the"
130109
" specified value. rsqrt(x) = 1 / sqrt(x).">;
131-
def Round : DXILOpProperties<26, int_roundeven, [DXILOpOverload<SM6_0, [llvm_half_ty, llvm_float_ty]>],
110+
def Round : DXILOpProperties<26, int_roundeven, [llvm_half_ty, llvm_float_ty],
132111
"Returns the input rounded to the nearest integer"
133112
"within a floating-point type.">;
134-
def Floor : DXILOpProperties<27, int_floor, [DXILOpOverload<SM6_0, [llvm_half_ty, llvm_float_ty]>],
113+
def Floor : DXILOpProperties<27, int_floor, [llvm_half_ty, llvm_float_ty],
135114
"Returns the largest integer that is less than or equal to the input.">;
136-
def Ceil : DXILOpProperties<28, int_ceil, [DXILOpOverload<SM6_0, [llvm_half_ty, llvm_float_ty]>],
115+
def Ceil : DXILOpProperties<28, int_ceil, [llvm_half_ty, llvm_float_ty],
137116
"Returns the smallest integer that is greater than or equal to the input.">;
138-
def Trunc : DXILOpProperties<29, int_trunc, [DXILOpOverload<SM6_0, [llvm_half_ty, llvm_float_ty]>],
117+
def Trunc : DXILOpProperties<29, int_trunc, [llvm_half_ty, llvm_float_ty],
139118
"Returns the specified value truncated to the integer component.">;
140-
def Rbits : DXILOpProperties<30, int_bitreverse, [DXILOpOverload<SM6_0, [llvm_i16_ty, llvm_i32_ty, llvm_i64_ty]>],
119+
def Rbits : DXILOpProperties<30, int_bitreverse, [llvm_i16_ty, llvm_i32_ty, llvm_i64_ty],
141120
"Returns the specified value with its bits reversed.">;
142121
}
143122

144123
let OpClass = binary in {
145124
// Float overloads
146-
def FMax : DXILOpProperties<35, int_maxnum, [DXILOpOverload<SM6_0, [llvm_half_ty, llvm_float_ty, llvm_double_ty]>],
125+
def FMax : DXILOpProperties<35, int_maxnum, [llvm_half_ty, llvm_float_ty, llvm_double_ty],
147126
"Float maximum. FMax(a,b) = a > b ? a : b">;
148-
def FMin : DXILOpProperties<36, int_minnum, [DXILOpOverload<SM6_0, [llvm_half_ty, llvm_float_ty, llvm_double_ty]>],
127+
def FMin : DXILOpProperties<36, int_minnum, [llvm_half_ty, llvm_float_ty, llvm_double_ty],
149128
"Float minimum. FMin(a,b) = a < b ? a : b">;
150129
// Int overloads
151-
def SMax : DXILOpProperties<37, int_smax, [DXILOpOverload<SM6_0,[llvm_i16_ty, llvm_i32_ty, llvm_i64_ty]>],
130+
def SMax : DXILOpProperties<37, int_smax, [llvm_i16_ty, llvm_i32_ty, llvm_i64_ty],
152131
"Signed integer maximum. SMax(a,b) = a > b ? a : b">;
153-
def SMin : DXILOpProperties<38, int_smin, [DXILOpOverload<SM6_0,[llvm_i16_ty, llvm_i32_ty, llvm_i64_ty]>],
132+
def SMin : DXILOpProperties<38, int_smin, [llvm_i16_ty, llvm_i32_ty, llvm_i64_ty],
154133
"Signed integer minimum. SMin(a,b) = a < b ? a : b">;
155-
def UMax : DXILOpProperties<39, int_umax, [DXILOpOverload<SM6_0,[llvm_i16_ty, llvm_i32_ty, llvm_i64_ty]>],
134+
def UMax : DXILOpProperties<39, int_umax, [llvm_i16_ty, llvm_i32_ty, llvm_i64_ty],
156135
"Unsigned integer maximum. UMax(a,b) = a > b ? a : b">;
157-
def UMin : DXILOpProperties<40, int_umin, [DXILOpOverload<SM6_0,[llvm_i16_ty, llvm_i32_ty, llvm_i64_ty]>],
136+
def UMin : DXILOpProperties<40, int_umin, [llvm_i16_ty, llvm_i32_ty, llvm_i64_ty],
158137
"Unsigned integer minimum. UMin(a,b) = a < b ? a : b">;
159138
}
160139

161140
let OpClass = tertiary in {
162-
def FMad : DXILOpProperties<46, int_fmuladd, [DXILOpOverload<SM6_0, [llvm_half_ty, llvm_float_ty, llvm_double_ty]>],
141+
def FMad : DXILOpProperties<46, int_fmuladd, [llvm_half_ty, llvm_float_ty, llvm_double_ty],
163142
"Floating point arithmetic multiply/add operation."
164143
" fmad(m,a,b) = m * a + b.">;
165144
// Int overloads
166-
def IMad : DXILOpProperties<48, int_dx_imad, [DXILOpOverload<SM6_0, [llvm_i16_ty, llvm_i32_ty, llvm_i64_ty]>],
145+
def IMad : DXILOpProperties<48, int_dx_imad, [llvm_i16_ty, llvm_i32_ty, llvm_i64_ty],
167146
"Signed integer arithmetic multiply/add operation."
168147
" imad(m,a,b) = m * a + b.">;
169-
def UMad : DXILOpProperties<49, int_dx_umad, [DXILOpOverload<SM6_0, [llvm_i16_ty, llvm_i32_ty, llvm_i64_ty]>],
148+
def UMad : DXILOpProperties<49, int_dx_umad, [llvm_i16_ty, llvm_i32_ty, llvm_i64_ty],
170149
"Unsigned integer arithmetic multiply/add operation."
171150
" umad(m,a, = m * a + b.">;
172151
}
173152

174-
// Dot Operations
175153
let OpClass = dot2 in
176-
def Dot2 : DXILOpProperties<54, int_dx_dot2, [DXILOpOverload<SM6_0, [llvm_half_ty, llvm_float_ty]>],
154+
def Dot2 : DXILOpProperties<54, int_dx_dot2, [llvm_half_ty, llvm_float_ty],
177155
"dot product of two float vectors Dot(a,b) = a[0]*b[0] +"
178156
" ... + a[n]*b[n] where n is between 0 and 1">;
179157
let OpClass = dot3 in
180-
def Dot3 : DXILOpProperties<55, int_dx_dot3, [DXILOpOverload<SM6_0, [llvm_half_ty, llvm_float_ty]>],
158+
def Dot3 : DXILOpProperties<55, int_dx_dot3, [llvm_half_ty, llvm_float_ty],
181159
"dot product of two float vectors Dot(a,b) = a[0]*b[0] +"
182160
" ... + a[n]*b[n] where n is between 0 and 2">;
183161
let OpClass = dot4 in
184-
def Dot4 : DXILOpProperties<56, int_dx_dot4, [DXILOpOverload<SM6_0, [llvm_half_ty, llvm_float_ty]>],
162+
def Dot4 : DXILOpProperties<56, int_dx_dot4, [llvm_half_ty, llvm_float_ty],
185163
"dot product of two float vectors Dot(a,b) = a[0]*b[0] +"
186164
" ... + a[n]*b[n] where n is between 0 and 3">;
187-
188-
// Thread Operations
189165
let OpClass = threadId in
190-
def ThreadId : DXILOpProperties<93, int_dx_thread_id, [DXILOpOverload<SM6_0, [llvm_i32_ty]>],
166+
def ThreadId : DXILOpProperties<93, int_dx_thread_id, [llvm_i32_ty],
191167
"Reads the thread ID">;
192168
let OpClass = groupId in
193-
def GroupId : DXILOpProperties<94, int_dx_group_id, [DXILOpOverload<SM6_0, [llvm_i32_ty]>],
169+
def GroupId : DXILOpProperties<94, int_dx_group_id, [llvm_i32_ty],
194170
"Reads the group ID (SV_GroupID)">;
195171
let OpClass = threadIdInGroup in
196-
def ThreadIdInGroup : DXILOpProperties<95, int_dx_thread_id_in_group, [DXILOpOverload<SM6_0, [llvm_i32_ty]>],
172+
def ThreadIdInGroup : DXILOpProperties<95, int_dx_thread_id_in_group, [llvm_i32_ty],
197173
"Reads the thread ID within the group "
198174
"(SV_GroupThreadID)">;
199175
let OpClass = flattenedThreadIdInGroup in
200176
def FlattenedThreadIdInGroup : DXILOpProperties<96, int_dx_flattened_thread_id_in_group,
201-
[DXILOpOverload<SM6_0, [llvm_i32_ty]>],
177+
[llvm_i32_ty],
202178
"Provides a flattened index for a given"
203179
" thread within a given group (SV_GroupIndex)">;

llvm/lib/Target/DirectX/DXILOpBuilder.cpp

Lines changed: 5 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,6 @@
1515
#include "llvm/IR/Module.h"
1616
#include "llvm/Support/DXILABI.h"
1717
#include "llvm/Support/ErrorHandling.h"
18-
#include "llvm/Support/VersionTuple.h"
19-
#include <algorithm>
20-
#include <cassert>
21-
#include <string>
2218

2319
using namespace llvm;
2420
using namespace llvm::dxil;
@@ -127,11 +123,6 @@ static std::string getTypeName(OverloadKind Kind, Type *Ty) {
127123
}
128124
}
129125

130-
struct OpSMOverloadProp {
131-
DXILShaderModel ShaderModelVer;
132-
uint16_t ValidTys;
133-
};
134-
135126
// Static properties.
136127
struct OpCodeProperty {
137128
dxil::OpCode OpCode;
@@ -140,7 +131,7 @@ struct OpCodeProperty {
140131
dxil::OpCodeClass OpCodeClass;
141132
// Offset in DXILOpCodeClassNameTable.
142133
unsigned OpCodeClassNameOffset;
143-
std::vector<OpSMOverloadProp> OverloadProp;
134+
uint16_t OverloadTys;
144135
llvm::Attribute::AttrKind FuncAttr;
145136
int OverloadParamIndex; // parameter index which control the overload.
146137
// When < 0, should be only 1 overload type.
@@ -258,38 +249,16 @@ static FunctionType *getDXILOpFunctionType(const OpCodeProperty *Prop,
258249
ArgTys[0], ArrayRef<Type *>(&ArgTys[1], ArgTys.size() - 1), false);
259250
}
260251

261-
static uint16_t getValidOverloadMask(const OpCodeProperty *Prop,
262-
VersionTuple SMVer) {
263-
uint16_t ValidTyMask = 0;
264-
// std::vector Prop->OverloadProp is in ascending order of SM Version
265-
// Overloads of highest SM version that is not greater than SMVer
266-
// are the ones that are valid for SMVer.
267-
268-
// Get the lower bound value iterator of SMVer
269-
auto LaterSM = std::lower_bound(
270-
Prop->OverloadProp.begin(), Prop->OverloadProp.end(), SMVer,
271-
[](const OpSMOverloadProp OL, VersionTuple VerTup) {
272-
return (VersionTuple(OL.ShaderModelVer.Major,
273-
OL.ShaderModelVer.Minor) <= VerTup);
274-
});
275-
// Valid overloads are of the version prior to the lower bound
276-
ValidTyMask = (--LaterSM)->ValidTys;
277-
assert(ValidTyMask != 0 && "No valid overload types found");
278-
return ValidTyMask;
279-
}
280-
281252
namespace llvm {
282253
namespace dxil {
283254

284-
CallInst *DXILOpBuilder::createDXILOpCall(dxil::OpCode OpCode,
285-
VersionTuple &SMVer, Type *ReturnTy,
255+
CallInst *DXILOpBuilder::createDXILOpCall(dxil::OpCode OpCode, Type *ReturnTy,
286256
Type *OverloadTy,
287257
SmallVector<Value *> Args) {
288258
const OpCodeProperty *Prop = getOpCodeProperty(OpCode);
289-
uint16_t ValidTyMask = getValidOverloadMask(Prop, SMVer);
290259

291260
OverloadKind Kind = getOverloadKind(OverloadTy);
292-
if ((ValidTyMask & (uint16_t)Kind) == 0) {
261+
if ((Prop->OverloadTys & (uint16_t)Kind) == 0) {
293262
report_fatal_error("Invalid Overload Type", /* gen_crash_diag=*/false);
294263
}
295264

@@ -307,17 +276,14 @@ CallInst *DXILOpBuilder::createDXILOpCall(dxil::OpCode OpCode,
307276
return B.CreateCall(DXILFn, Args);
308277
}
309278

310-
Type *DXILOpBuilder::getOverloadTy(dxil::OpCode OpCode, VersionTuple &SMVer,
311-
FunctionType *FT) {
279+
Type *DXILOpBuilder::getOverloadTy(dxil::OpCode OpCode, FunctionType *FT) {
312280

313281
const OpCodeProperty *Prop = getOpCodeProperty(OpCode);
314282
// If DXIL Op has no overload parameter, just return the
315283
// precise return type specified.
316284
if (Prop->OverloadParamIndex < 0) {
317285
auto &Ctx = FT->getContext();
318-
uint16_t ValidTyMask = getValidOverloadMask(Prop, SMVer);
319-
320-
switch (ValidTyMask) {
286+
switch (Prop->OverloadTys) {
321287
case OverloadKind::VOID:
322288
return Type::getVoidTy(Ctx);
323289
case OverloadKind::HALF:

llvm/lib/Target/DirectX/DXILOpBuilder.h

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
#include "DXILConstants.h"
1616
#include "llvm/ADT/SmallVector.h"
17-
#include "llvm/Support/VersionTuple.h"
1817

1918
namespace llvm {
2019
class Module;
@@ -34,15 +33,13 @@ class DXILOpBuilder {
3433
/// opcode, and call arguments.
3534
///
3635
/// \param OpCode Opcode of the DXIL Op call constructed
37-
/// \param SMVer Shader Model Version of DXIL Op call to construct
3836
/// \param ReturnTy Return type of the DXIL Op call constructed
3937
/// \param OverloadTy Overload type of the DXIL Op call constructed
38+
/// \param Args Arguments for the DXIL Op call constructed
4039
/// \return DXIL Op call constructed
41-
CallInst *createDXILOpCall(dxil::OpCode OpCode, VersionTuple &SMVer,
42-
Type *ReturnTy, Type *OverloadTy,
43-
SmallVector<Value *> Args);
44-
Type *getOverloadTy(dxil::OpCode OpCode, VersionTuple &SMVer,
45-
FunctionType *FT);
40+
CallInst *createDXILOpCall(dxil::OpCode OpCode, Type *ReturnTy,
41+
Type *OverloadTy, SmallVector<Value *> Args);
42+
Type *getOverloadTy(dxil::OpCode OpCode, FunctionType *FT);
4643
static const char *getOpCodeName(dxil::OpCode DXILOp);
4744

4845
private:

llvm/lib/Target/DirectX/DXILOpLowering.cpp

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,8 @@
2222
#include "llvm/IR/IntrinsicsDirectX.h"
2323
#include "llvm/IR/Module.h"
2424
#include "llvm/IR/PassManager.h"
25-
#include "llvm/MC/TargetRegistry.h"
2625
#include "llvm/Pass.h"
2726
#include "llvm/Support/ErrorHandling.h"
28-
#include "llvm/Support/VersionTuple.h"
2927

3028
#define DEBUG_TYPE "dxil-op-lower"
3129

@@ -74,23 +72,10 @@ static SmallVector<Value *> argVectorFlatten(CallInst *Orig,
7472
return NewOperands;
7573
}
7674

77-
static VersionTuple getModuleShaderModelVersion(Module &M) {
78-
std::string TTStr = M.getTargetTriple();
79-
std::string Error;
80-
auto Target = TargetRegistry::lookupTarget(TTStr, Error);
81-
if (!Target) {
82-
if (TTStr.empty()) {
83-
report_fatal_error(StringRef(Error), /*gen_crash_diag*/ false);
84-
}
85-
}
86-
return Triple(TTStr).getOSVersion();
87-
}
88-
8975
static void lowerIntrinsic(dxil::OpCode DXILOp, Function &F, Module &M) {
9076
IRBuilder<> B(M.getContext());
9177
DXILOpBuilder DXILB(M, B);
92-
VersionTuple SMVer = getModuleShaderModelVersion(M);
93-
Type *OverloadTy = DXILB.getOverloadTy(DXILOp, SMVer, F.getFunctionType());
78+
Type *OverloadTy = DXILB.getOverloadTy(DXILOp, F.getFunctionType());
9479
for (User *U : make_early_inc_range(F.users())) {
9580
CallInst *CI = dyn_cast<CallInst>(U);
9681
if (!CI)
@@ -106,8 +91,8 @@ static void lowerIntrinsic(dxil::OpCode DXILOp, Function &F, Module &M) {
10691
} else
10792
Args.append(CI->arg_begin(), CI->arg_end());
10893

109-
CallInst *DXILCI = DXILB.createDXILOpCall(DXILOp, SMVer, F.getReturnType(),
110-
OverloadTy, Args);
94+
CallInst *DXILCI =
95+
DXILB.createDXILOpCall(DXILOp, F.getReturnType(), OverloadTy, Args);
11196

11297
CI->replaceAllUsesWith(DXILCI);
11398
CI->eraseFromParent();

0 commit comments

Comments
 (0)