================
@@ -700,32 +700,25 @@ class ScalarExprEmitter : public
StmtVisitor<ScalarExprEmitter, mlir::Value> {
}
} else if (type->isVectorType()) {
if (type->hasIntegerRepresentation()) {
- value = emitIncOrDec(e, input, /*nsw=*/false);
+ value = emitIntIncOrDec(e, input, /*nsw=*/false);
} else {
cgf.cgm.errorNYI(e->getSourceRange(), "Unary inc/dec vector of float");
return {};
}
} else if (type->isRealFloatingType()) {
CIRGenFunction::CIRGenFPOptionsRAII FPOptsRAII(cgf, e);
- if (type->isHalfType() &&
- !cgf.getContext().getLangOpts().NativeHalfType) {
- cgf.cgm.errorNYI(e->getSourceRange(), "Unary inc/dec half");
- return {};
- }
+ // Another special case: half FP increment should be done via float.
+ if (type->isHalfType() && !cgf.getContext().getLangOpts().NativeHalfType)
+ value = builder.createFloatingCast(value, builder.getSingleTy());
- if (mlir::isa<cir::SingleType, cir::DoubleType, cir::LongDoubleType>(
- value.getType())) {
- mlir::Location loc = cgf.getLoc(e->getExprLoc());
- auto fpType = mlir::cast<cir::FPTypeInterface>(value.getType());
- mlir::Value amount = builder.getConstFP(
- loc, value.getType(), llvm::APFloat(fpType.getFloatSemantics(),
1));
- value = e->isIncrementOp() ? builder.createFAdd(loc, value, amount)
- : builder.createFSub(loc, value, amount);
- } else {
- cgf.cgm.errorNYI(e->getSourceRange(), "Unary inc/dec other fp type");
- return {};
- }
+ // Create the inc/dec operation.
+ // NOTE(CIR): clang calls CreateAdd but folds this to a unary op
+ assert(!::cir::MissingFeatures::isPPC_FP128Ty());
+ value = emitFloatIncOrDec(e, value);
----------------
Luhaocong wrote:
done
https://github.com/llvm/llvm-project/pull/193215
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits