From a232909ce7377206c276c0b671614076f7d4ea4b Mon Sep 17 00:00:00 2001 From: Eugene Epshteyn Date: Sun, 16 Nov 2025 15:12:15 -0500 Subject: [PATCH 1/2] [flang] Optimization for length 1 char 1 compare in lowering --- .../Optimizer/Builder/Runtime/Character.cpp | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/flang/lib/Optimizer/Builder/Runtime/Character.cpp b/flang/lib/Optimizer/Builder/Runtime/Character.cpp index 540ecba299dc3..f8f1346ca730c 100644 --- a/flang/lib/Optimizer/Builder/Runtime/Character.cpp +++ b/flang/lib/Optimizer/Builder/Runtime/Character.cpp @@ -94,27 +94,34 @@ fir::runtime::genCharCompare(fir::FirOpBuilder &builder, mlir::Location loc, mlir::arith::CmpIPredicate cmp, mlir::Value lhsBuff, mlir::Value lhsLen, mlir::Value rhsBuff, mlir::Value rhsLen) { - mlir::func::FuncOp beginFunc; - switch (discoverKind(lhsBuff.getType())) { + int lhsKind = discoverKind(lhsBuff.getType()); + int rhsKind = discoverKind(rhsBuff.getType()); + if (lhsKind != rhsKind) { + fir::emitFatalError( + loc, "runtime does not support comparison of different CHARACTER kind values"); + } + mlir::func::FuncOp func; + switch (lhsKind) { case 1: - beginFunc = fir::runtime::getRuntimeFunc( + func = fir::runtime::getRuntimeFunc( loc, builder); break; case 2: - beginFunc = fir::runtime::getRuntimeFunc( + func = fir::runtime::getRuntimeFunc( loc, builder); break; case 4: - beginFunc = fir::runtime::getRuntimeFunc( + func = fir::runtime::getRuntimeFunc( loc, builder); break; default: - llvm_unreachable("runtime does not support CHARACTER KIND"); + fir::emitFatalError( + loc, "unsupported CHARACTER kind value. Runtime expects 1, 2, or 4."); } - auto fTy = beginFunc.getFunctionType(); + auto fTy = func.getFunctionType(); auto args = fir::runtime::createArguments(builder, loc, fTy, lhsBuff, rhsBuff, lhsLen, rhsLen); - auto tri = fir::CallOp::create(builder, loc, beginFunc, args).getResult(0); + auto tri = fir::CallOp::create(builder, loc, func, args).getResult(0); auto zero = builder.createIntegerConstant(loc, tri.getType(), 0); return mlir::arith::CmpIOp::create(builder, loc, cmp, tri, zero); } From 5d0ef79d754d0b3c05dd212c2453d97de1c678e0 Mon Sep 17 00:00:00 2001 From: Eugene Epshteyn Date: Tue, 18 Nov 2025 11:36:35 -0500 Subject: [PATCH 2/2] clang-format --- flang/lib/Optimizer/Builder/Runtime/Character.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flang/lib/Optimizer/Builder/Runtime/Character.cpp b/flang/lib/Optimizer/Builder/Runtime/Character.cpp index f8f1346ca730c..2f1772f602ac4 100644 --- a/flang/lib/Optimizer/Builder/Runtime/Character.cpp +++ b/flang/lib/Optimizer/Builder/Runtime/Character.cpp @@ -97,8 +97,8 @@ fir::runtime::genCharCompare(fir::FirOpBuilder &builder, mlir::Location loc, int lhsKind = discoverKind(lhsBuff.getType()); int rhsKind = discoverKind(rhsBuff.getType()); if (lhsKind != rhsKind) { - fir::emitFatalError( - loc, "runtime does not support comparison of different CHARACTER kind values"); + fir::emitFatalError(loc, "runtime does not support comparison of different " + "CHARACTER kind values"); } mlir::func::FuncOp func; switch (lhsKind) {