Skip to content

Commit 45348e8

Browse files
committed
allow alternatives in subaction statements
1 parent d602489 commit 45348e8

File tree

9 files changed

+468
-189
lines changed

9 files changed

+468
-189
lines changed

lib/dialect/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
rlcAddLibrary(dialect src/Dialect.cpp src/Types.cpp src/Operations.cpp src/Conversion.cpp src/EmitMain.cpp src/TypeCheck.cpp src/Interfaces.cpp src/SymbolTable.cpp src/ActionArgumentAnalysis.cpp src/LowerActionPass.cpp src/LowerArrayCalls.cpp src/LowerToCf.cpp src/ActionStatementsToCoro.cpp src/OverloadResolver.cpp src/LowerIsOperationsPass.cpp src/InstantiateTemplatesPass.cpp src/LowerAssignPass.cpp src/EmitImplicitAssignPass.cpp src/LowerConstructOpPass.cpp src/EmitImplicitInitPass.cpp src/EmitImplicitDestructorInvocationsPass.cpp src/LowerForFieldOpPass.cpp src/EmitEnumEntitiesPass.cpp src/SortTypeDeclarationsPass.cpp src/AddOutOfBoundsCheckPass.cpp src/PrintIRPass.cpp src/ExtractPreconditionPass.cpp src/LowerAssertsPass.cpp src/AddPreconditionsCheckPass.cpp src/ActionLiveness.cpp src/UncheckedAstToDot.cpp src/RewriteCallSignaturesPass.cpp src/RemoveUselessAllocaPass.cpp src/MembeFunctionsToRegularFunctionsPass.cpp src/LowerInitializerListsPass.cpp src/Enums.cpp src/HoistAllocaPass.cpp src/RemoveUninitConstructsPass.cpp src/ConstraintsAnalysis.cpp src/TypeInterface.cpp src/SerializeRLPass.cpp src/Attrs.cpp src/DebugInfo.cpp src/LowerForLoopsPass.cpp)
1+
rlcAddLibrary(dialect src/Dialect.cpp src/Types.cpp src/Operations.cpp src/Conversion.cpp src/EmitMain.cpp src/TypeCheck.cpp src/Interfaces.cpp src/SymbolTable.cpp src/ActionArgumentAnalysis.cpp src/LowerActionPass.cpp src/LowerArrayCalls.cpp src/LowerToCf.cpp src/ActionStatementsToCoro.cpp src/OverloadResolver.cpp src/LowerIsOperationsPass.cpp src/InstantiateTemplatesPass.cpp src/LowerAssignPass.cpp src/EmitImplicitAssignPass.cpp src/LowerConstructOpPass.cpp src/EmitImplicitInitPass.cpp src/EmitImplicitDestructorInvocationsPass.cpp src/LowerForFieldOpPass.cpp src/EmitEnumEntitiesPass.cpp src/SortTypeDeclarationsPass.cpp src/AddOutOfBoundsCheckPass.cpp src/PrintIRPass.cpp src/ExtractPreconditionPass.cpp src/LowerAssertsPass.cpp src/AddPreconditionsCheckPass.cpp src/ActionLiveness.cpp src/UncheckedAstToDot.cpp src/RewriteCallSignaturesPass.cpp src/RemoveUselessAllocaPass.cpp src/MembeFunctionsToRegularFunctionsPass.cpp src/LowerInitializerListsPass.cpp src/Enums.cpp src/HoistAllocaPass.cpp src/RemoveUninitConstructsPass.cpp src/ConstraintsAnalysis.cpp src/TypeInterface.cpp src/SerializeRLPass.cpp src/Attrs.cpp src/DebugInfo.cpp src/LowerForLoopsPass.cpp src/LowerSubActionStatements.cpp)
22
target_link_libraries(dialect PUBLIC rlc::utils MLIRSupport MLIRDialect MLIRLLVMDialect MLIRLLVMIRTransforms MLIRControlFlowDialect)
33

44
set(tblgen ${LLVM_BINARY_DIR}/bin/mlir-tblgen)

lib/dialect/src/Conversion.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -879,6 +879,38 @@ class LeftShiftRewriter
879879
}
880880
};
881881

882+
class LowerIsDoneOp: public mlir::OpConversionPattern<mlir::rlc::IsDoneOp>
883+
{
884+
using mlir::OpConversionPattern<mlir::rlc::IsDoneOp>::OpConversionPattern;
885+
886+
mlir::LogicalResult matchAndRewrite(
887+
mlir::rlc::IsDoneOp op,
888+
OpAdaptor adaptor,
889+
mlir::ConversionPatternRewriter& rewriter) const final
890+
{
891+
auto alloca = makeAlloca(rewriter, rewriter.getI8Type(), op.getLoc());
892+
auto loadedIndex = makeAlignedLoad(
893+
rewriter, rewriter.getI64Type(), adaptor.getCoroFrame(), op.getLoc());
894+
auto mask = rewriter.create<mlir::LLVM::ConstantOp>(
895+
op.getLoc(), rewriter.getI64Type(), rewriter.getI64IntegerAttr(-1));
896+
897+
auto result = rewriter.create<mlir::LLVM::ICmpOp>(
898+
op.getLoc(),
899+
rewriter.getI1Type(),
900+
mlir::LLVM::ICmpPredicate::eq,
901+
loadedIndex,
902+
mask);
903+
904+
auto extended = rewriter.create<mlir::LLVM::ZExtOp>(
905+
op.getLoc(), rewriter.getI8Type(), result);
906+
907+
makeAlignedStore(rewriter, extended, alloca, op.getLoc());
908+
909+
rewriter.replaceOp(op, alloca);
910+
return mlir::LogicalResult::success();
911+
}
912+
};
913+
882914
class BitAndRewriter: public mlir::OpConversionPattern<mlir::rlc::BitAndOp>
883915
{
884916
using mlir::OpConversionPattern<mlir::rlc::BitAndOp>::OpConversionPattern;
@@ -2265,6 +2297,7 @@ namespace mlir::rlc
22652297
converter, &getContext(), diGenerator, debug_info)
22662298
.add<ReferenceRewriter>(converter, &getContext())
22672299
.add<BuiltinAsPtrRewriter>(converter, &getContext())
2300+
.add<LowerIsDoneOp>(converter, &getContext())
22682301
.add<ClassDeclarationRewriter>(converter, &getContext())
22692302
.add<ExplicitConstructRewriter>(converter, &getContext())
22702303
.add<AbortRewriter>(
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
Copyright 2024 Massimo Fioravanti
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
#include "llvm/ADT/TypeSwitch.h"
17+
#include "mlir/IR/BuiltinDialect.h"
18+
#include "rlc/dialect/Operations.hpp"
19+
#include "rlc/dialect/Passes.hpp"
20+
21+
namespace mlir::rlc
22+
{
23+
#define GEN_PASS_DEF_LOWERSUBACTIONSTATEMENTS
24+
#include "rlc/dialect/Passes.inc"
25+
26+
struct LowerSubActionStatements
27+
: impl::LowerSubActionStatementsBase<LowerSubActionStatements>
28+
{
29+
void runOnOperation() override
30+
{
31+
mlir::IRRewriter rewriter(getOperation());
32+
llvm::SmallVector<mlir::rlc::SubActionInfo, 4> ops;
33+
getOperation().walk([&](mlir::rlc::SubActionInfo statement) {
34+
ops.push_back(statement);
35+
});
36+
37+
for (auto op : ops)
38+
{
39+
mlir::Block& block = op.getBody().front();
40+
while (not block.empty())
41+
block.front().moveBefore(op);
42+
op.erase();
43+
}
44+
}
45+
};
46+
47+
} // namespace mlir::rlc

0 commit comments

Comments
 (0)