Skip to content

Commit 92bf5f7

Browse files
committed
More review feedback changes
- CastKind enum now aligns with classic codegen CastKind - Try to emit a value of the expected type after errorNYI()s
1 parent c1cf00e commit 92bf5f7

File tree

3 files changed

+127
-52
lines changed

3 files changed

+127
-52
lines changed

clang/include/clang/CIR/Dialect/IR/CIROps.td

Lines changed: 82 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -82,47 +82,92 @@ class CIR_Op<string mnemonic, list<Trait> traits = []> :
8282
// CastOp
8383
//===----------------------------------------------------------------------===//
8484

85-
// The enumaration value isn't in sync with clang.
86-
def CK_IntegralToBoolean : I32EnumAttrCase<"int_to_bool", 1>;
87-
def CK_ArrayToPointerDecay : I32EnumAttrCase<"array_to_ptrdecay", 2>;
88-
def CK_IntegralCast : I32EnumAttrCase<"integral", 3>;
89-
def CK_BitCast : I32EnumAttrCase<"bitcast", 4>;
90-
def CK_FloatingCast : I32EnumAttrCase<"floating", 5>;
91-
def CK_PtrToBoolean : I32EnumAttrCase<"ptr_to_bool", 6>;
92-
def CK_FloatToIntegral : I32EnumAttrCase<"float_to_int", 7>;
93-
def CK_IntegralToPointer : I32EnumAttrCase<"int_to_ptr", 8>;
94-
def CK_PointerToIntegral : I32EnumAttrCase<"ptr_to_int", 9>;
95-
def CK_FloatToBoolean : I32EnumAttrCase<"float_to_bool", 10>;
96-
def CK_BooleanToIntegral : I32EnumAttrCase<"bool_to_int", 11>;
97-
def CK_IntegralToFloat : I32EnumAttrCase<"int_to_float", 12>;
98-
def CK_BooleanToFloat : I32EnumAttrCase<"bool_to_float", 13>;
99-
def CK_AddressSpaceConversion : I32EnumAttrCase<"address_space", 14>;
100-
def CK_FloatToComplex : I32EnumAttrCase<"float_to_complex", 15>;
101-
def CK_IntegralToComplex : I32EnumAttrCase<"int_to_complex", 16>;
102-
def CK_FloatComplexToReal : I32EnumAttrCase<"float_complex_to_real", 17>;
103-
def CK_IntegralComplexToReal : I32EnumAttrCase<"int_complex_to_real", 18>;
104-
def CK_FloatComplexToBoolean : I32EnumAttrCase<"float_complex_to_bool", 19>;
105-
def CK_IntegralComplexToBoolean : I32EnumAttrCase<"int_complex_to_bool", 20>;
106-
def CK_FloatComplexCast : I32EnumAttrCase<"float_complex", 21>;
107-
def CK_FloatComplexToIntegralComplex
108-
: I32EnumAttrCase<"float_complex_to_int_complex", 22>;
109-
def CK_IntegralComplexCast : I32EnumAttrCase<"int_complex", 23>;
110-
def CK_IntegralComplexToFloatComplex
111-
: I32EnumAttrCase<"int_complex_to_float_complex", 24>;
112-
def CK_MemberPtrToBoolean : I32EnumAttrCase<"member_ptr_to_bool", 25>;
85+
// CK_Dependent
86+
def CK_BitCast : I32EnumAttrCase<"bitcast", 1>;
87+
// CK_LValueBitCast
88+
// CK_LValueToRValueBitCast
89+
// CK_LValueToRValue
90+
// CK_NoOp
91+
// CK_BaseToDerived
92+
// CK_DerivedToBase
93+
// CK_UncheckedDerivedToBase
94+
// CK_Dynamic
95+
// CK_ToUnion
96+
def CK_ArrayToPointerDecay : I32EnumAttrCase<"array_to_ptrdecay", 11>;
97+
// CK_FunctionToPointerDecay
98+
// CK_NullToPointer
99+
// CK_NullToMemberPointer
100+
// CK_BaseToDerivedMemberPointer
101+
// CK_DerivedToBaseMemberPointer
102+
def CK_MemberPointerToBoolean : I32EnumAttrCase<"member_ptr_to_bool", 17>;
103+
// CK_ReinterpretMemberPointer
104+
// CK_UserDefinedConversion
105+
// CK_ConstructorConversion
106+
def CK_IntegralToPointer : I32EnumAttrCase<"int_to_ptr", 21>;
107+
def CK_PointerToIntegral : I32EnumAttrCase<"ptr_to_int", 22>;
108+
def CK_PointerToBoolean : I32EnumAttrCase<"ptr_to_bool", 23>;
109+
// CK_ToVoid
110+
// CK_MatrixCast
111+
// CK_VectorSplat
112+
def CK_IntegralCast : I32EnumAttrCase<"integral", 27>;
113+
def CK_IntegralToBoolean : I32EnumAttrCase<"int_to_bool", 28>;
114+
def CK_IntegralToFloating : I32EnumAttrCase<"int_to_float", 29>;
115+
// CK_FloatingToFixedPoint
116+
// CK_FixedPointToFloating
117+
// CK_FixedPointCast
118+
// CK_FixedPointToIntegral
119+
// CK_IntegralToFixedPoint
120+
// CK_FixedPointToBoolean
121+
def CK_FloatingToIntegral : I32EnumAttrCase<"float_to_int", 36>;
122+
def CK_FloatingToBoolean : I32EnumAttrCase<"float_to_bool", 37>;
123+
def CK_BooleanToSignedIntegral : I32EnumAttrCase<"bool_to_int", 38>;
124+
def CK_FloatingCast : I32EnumAttrCase<"floating", 39>;
125+
// CK_CPointerToObjCPointerCast
126+
// CK_BlockPointerToObjCPointerCast
127+
// CK_AnyPointerToBlockPointerCast
128+
// CK_ObjCObjectLValueCast
129+
// CK_FloatingRealToComplex
130+
// CK_FloatingComplexToReal
131+
// CK_FloatingComplexToBoolean
132+
def CK_FloatingComplexCast : I32EnumAttrCase<"float_complex", 47>;
133+
// CK_FloatingComplexToIntegralComplex
134+
// CK_IntegralRealToComplex
135+
def CK_IntegralComplexToReal : I32EnumAttrCase<"int_complex_to_real", 50>;
136+
def CK_IntegralComplexToBoolean : I32EnumAttrCase<"int_complex_to_bool", 51>;
137+
def CK_IntegralComplexCast : I32EnumAttrCase<"int_complex", 52>;
138+
def CK_IntegralComplexToFloatingComplex
139+
: I32EnumAttrCase<"int_complex_to_float_complex", 53>;
140+
// CK_ARCProduceObject
141+
// CK_ARCConsumeObject
142+
// CK_ARCReclaimReturnedObject
143+
// CK_ARCExtendBlockObject
144+
// CK_AtomicToNonAtomic
145+
// CK_NonAtomicToAtomic
146+
// CK_CopyAndAutoreleaseBlockObject
147+
// CK_BuiltinFnToFnPtr
148+
// CK_ZeroToOCLOpaqueType
149+
def CK_AddressSpaceConversion : I32EnumAttrCase<"address_space", 63>;
150+
// CK_IntToOCLSampler
151+
// CK_HLSLVectorTruncation
152+
// CK_HLSLArrayRValue
153+
// CK_HLSLElementwiseCast
154+
// CK_HLSLAggregateSplatCast
155+
156+
// Enums below are specific to CIR and don't have a correspondence to classic
157+
// codegen:
158+
def CK_BooleanToFloat : I32EnumAttrCase<"bool_to_float", 1000>;
113159

114160
def CastKind : I32EnumAttr<
115161
"CastKind",
116162
"cast kind",
117-
[CK_IntegralToBoolean, CK_ArrayToPointerDecay, CK_IntegralCast,
118-
CK_BitCast, CK_FloatingCast, CK_PtrToBoolean, CK_FloatToIntegral,
119-
CK_IntegralToPointer, CK_PointerToIntegral, CK_FloatToBoolean,
120-
CK_BooleanToIntegral, CK_IntegralToFloat, CK_BooleanToFloat,
121-
CK_AddressSpaceConversion, CK_FloatToComplex, CK_IntegralToComplex,
122-
CK_FloatComplexToReal, CK_IntegralComplexToReal, CK_FloatComplexToBoolean,
123-
CK_IntegralComplexToBoolean, CK_FloatComplexCast,
124-
CK_FloatComplexToIntegralComplex, CK_IntegralComplexCast,
125-
CK_IntegralComplexToFloatComplex, CK_MemberPtrToBoolean]> {
163+
[CK_BitCast, CK_ArrayToPointerDecay, CK_MemberPointerToBoolean,
164+
CK_IntegralToPointer, CK_PointerToIntegral, CK_PointerToBoolean,
165+
CK_IntegralCast, CK_IntegralToBoolean, CK_IntegralToFloating,
166+
CK_FloatingToIntegral, CK_FloatingToBoolean, CK_BooleanToSignedIntegral,
167+
CK_FloatingCast, CK_FloatingComplexCast, CK_IntegralComplexToReal,
168+
CK_IntegralComplexToBoolean, CK_IntegralComplexCast,
169+
CK_IntegralComplexToFloatingComplex, CK_AddressSpaceConversion,
170+
CK_BooleanToFloat]> {
126171
let cppNamespace = "::cir";
127172
}
128173

clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,16 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> {
128128
if (srcType->isRealFloatingType())
129129
return emitFloatToBoolConversion(src, loc);
130130

131-
if (llvm::isa<MemberPointerType>(srcType))
131+
if (llvm::isa<MemberPointerType>(srcType)) {
132132
cgf.getCIRGenModule().errorNYI(loc, "member pointer to bool conversion");
133+
auto boolType = cgf.getContext().getBOOLType();
134+
auto cirBoolType = cgf.convertType(boolType);
135+
CharUnits alignment = cgf.getContext().getTypeAlignInChars(boolType);
136+
auto addr =
137+
builder.createAlloca(loc, builder.getPointerTo(cirBoolType),
138+
cirBoolType, {}, cgf.cgm.getSize(alignment));
139+
return builder.createLoad(loc, addr);
140+
}
133141

134142
if (srcType->isIntegerType())
135143
return emitIntToBoolConversion(src, loc);
@@ -203,6 +211,11 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> {
203211
castKind = cir::CastKind::float_to_int;
204212
} else if (mlir::isa<cir::CIRFPTypeInterface>(dstTy)) {
205213
cgf.getCIRGenModule().errorNYI("floating point casts");
214+
CharUnits alignment = cgf.getContext().getTypeAlignInChars(dstType);
215+
auto addr =
216+
builder.createAlloca(src.getLoc(), builder.getPointerTo(dstTy),
217+
dstTy, {}, cgf.cgm.getSize(alignment));
218+
return builder.createLoad(src.getLoc(), addr);
206219
} else {
207220
llvm_unreachable("Internal error: Cast to unexpected type");
208221
}
@@ -230,10 +243,10 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> {
230243
// TODO(leonardchan): When necessary, add another if statement checking for
231244
// conversions to fixed point types from other types.
232245
// conversions to fixed point types from other types.
233-
if (srcType->isFixedPointType())
234-
cgf.getCIRGenModule().errorNYI(loc, "fixed point conversions");
235-
else if (dstType->isFixedPointType())
246+
if (srcType->isFixedPointType() || dstType->isFixedPointType()) {
236247
cgf.getCIRGenModule().errorNYI(loc, "fixed point conversions");
248+
return nullptr;
249+
}
237250

238251
srcType = srcType.getCanonicalType();
239252
dstType = dstType.getCanonicalType();
@@ -294,6 +307,11 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> {
294307
// some native types (like Obj-C id) may map to a pointer type.
295308
if (auto dstPT = dyn_cast<cir::PointerType>(mlirDstType)) {
296309
cgf.getCIRGenModule().errorNYI(loc, "pointer casts");
310+
CharUnits alignment = cgf.getContext().getTypeAlignInChars(dstType);
311+
auto addr =
312+
builder.createAlloca(src.getLoc(), builder.getPointerTo(dstPT), dstPT,
313+
{}, cgf.cgm.getSize(alignment));
314+
return builder.createLoad(src.getLoc(), addr);
297315
}
298316

299317
if (isa<cir::PointerType>(mlirSrcType)) {
@@ -310,7 +328,8 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> {
310328
srcType.getTypePtr() &&
311329
"Splatted expr doesn't match with vector element type?");
312330

313-
llvm_unreachable("not implemented");
331+
cgf.getCIRGenModule().errorNYI(loc, "vector splatting");
332+
return nullptr;
314333
}
315334

316335
if (srcType->isMatrixType() && dstType->isMatrixType())
@@ -328,10 +347,11 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> {
328347
if (mlirDstType != resTy) {
329348
if (cgf.getContext().getTargetInfo().useFP16ConversionIntrinsics()) {
330349
cgf.getCIRGenModule().errorNYI(loc, "cast via llvm.convert.to.fp16");
331-
} else {
332-
res = builder.createCast(cgf.getLoc(loc), cir::CastKind::floating, res,
333-
resTy);
334350
}
351+
// FIXME(cir): For now we never use FP16 conversion intrinsics even if
352+
// required by the target. Change that once this is implemented
353+
res = builder.createCast(cgf.getLoc(loc), cir::CastKind::floating, res,
354+
resTy);
335355
}
336356

337357
if (opts.emitImplicitIntegerTruncationChecks)
@@ -342,10 +362,6 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> {
342362
"implicit integer sign change checks");
343363

344364
return res;
345-
346-
cgf.getCIRGenModule().errorNYI(loc,
347-
"emitScalarConversion for unequal types");
348-
return {};
349365
}
350366
};
351367

@@ -485,14 +501,30 @@ mlir::Value ScalarExprEmitter::VisitCastExpr(CastExpr *ce) {
485501
case CK_PointerToIntegral: {
486502
assert(!destTy->isBooleanType() && "bool should use PointerToBool");
487503
if (cgf.cgm.getCodeGenOpts().StrictVTablePointers)
488-
llvm_unreachable("NYI");
504+
cgf.getCIRGenModule().errorNYI(subExpr->getSourceRange(),
505+
"strict vtable pointers");
489506
return builder.createPtrToInt(Visit(subExpr), cgf.convertType(destTy));
490507
}
491508
case CK_ToVoid:
492509
cgf.getCIRGenModule().errorNYI(subExpr->getSourceRange(),
493510
"ignored expression on void cast");
494511
return nullptr;
495512

513+
case CK_IntegralToFloating:
514+
case CK_FloatingToIntegral:
515+
case CK_FloatingCast:
516+
case CK_FixedPointToFloating:
517+
case CK_FloatingToFixedPoint: {
518+
if (kind == CK_FixedPointToFloating || kind == CK_FloatingToFixedPoint) {
519+
cgf.getCIRGenModule().errorNYI(subExpr->getSourceRange(),
520+
"fixed point casts");
521+
return {};
522+
}
523+
cgf.getCIRGenModule().errorNYI(subExpr->getSourceRange(), "fp options");
524+
return emitScalarConversion(Visit(subExpr), subExpr->getType(), destTy,
525+
ce->getExprLoc());
526+
}
527+
496528
case CK_IntegralToBoolean:
497529
return emitIntToBoolConversion(Visit(subExpr),
498530
cgf.getLoc(ce->getSourceRange()));
@@ -508,7 +540,6 @@ mlir::Value ScalarExprEmitter::VisitCastExpr(CastExpr *ce) {
508540
cir::CastKind::member_ptr_to_bool, memPtr,
509541
cgf.convertType(destTy));
510542
}
511-
return nullptr;
512543

513544
default:
514545
cgf.getCIRGenModule().errorNYI(subExpr->getSourceRange(),

clang/test/CIR/CodeGen/cast.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ void should_not_cast() {
5858

5959
unsigned uu = (unsigned)x1;
6060
bool ib = (bool)x1;
61-
return (void) x1;
6261
}
6362

6463
// CHECK: cir.func @should_not_cast

0 commit comments

Comments
 (0)