[clang] [CIR] Upstream ArraySubscriptExpr for fixed size array (PR #134536)
Amr Hesham via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 9 11:06:53 PDT 2025
================
@@ -390,6 +391,148 @@ LValue CIRGenFunction::emitUnaryOpLValue(const UnaryOperator *e) {
llvm_unreachable("Unknown unary operator kind!");
}
+/// If the specified expr is a simple decay from an array to pointer,
+/// return the array subexpression.
+/// FIXME: this could be abstracted into a common AST helper.
+static const Expr *getSimpleArrayDecayOperand(const Expr *e) {
+ // If this isn't just an array->pointer decay, bail out.
+ const auto *castExpr = dyn_cast<CastExpr>(e);
+ if (!castExpr || castExpr->getCastKind() != CK_ArrayToPointerDecay)
+ return nullptr;
+
+ // If this is a decay from variable width array, bail out.
+ const Expr *subExpr = castExpr->getSubExpr();
+ if (subExpr->getType()->isVariableArrayType())
+ return nullptr;
+
+ return subExpr;
+}
+
+static mlir::IntegerAttr getConstantIndexOrNull(mlir::Value idx) {
+ // TODO(cir): should we consider using MLIRs IndexType instead of IntegerAttr?
+ if (auto constantOp = dyn_cast<cir::ConstantOp>(idx.getDefiningOp()))
+ return mlir::dyn_cast<mlir::IntegerAttr>(constantOp.getValue());
----------------
AmrDeveloper wrote:
I updated the function signature and cast, I will understand this part more in the incubator because that means it was only depend on that condition `(!CGF.IsInPreservedAIRegion && !isPreserveAIArrayBase(CGF, Base))` not the index itself
https://github.com/llvm/llvm-project/pull/134536
More information about the cfe-commits
mailing list