[Mlir-commits] [mlir] 5609720 - [mlir][LLVM] Implement mapping of phi source values of `llvm.invoke`
Markus Böck
llvmlistbot at llvm.org
Thu Jan 6 02:28:43 PST 2022
Author: Markus Böck
Date: 2022-01-06T11:27:14+01:00
New Revision: 560972052a25ada0efd47ddaf21ece1cd286ae65
URL: https://github.com/llvm/llvm-project/commit/560972052a25ada0efd47ddaf21ece1cd286ae65
DIFF: https://github.com/llvm/llvm-project/commit/560972052a25ada0efd47ddaf21ece1cd286ae65.diff
LOG: [mlir][LLVM] Implement mapping of phi source values of `llvm.invoke`
This patch allows the usage of the normalDestOperands and unwindDestOperands operands of llvm.invoke and have them be correctly mapped to phis in the successor when exported to LLVM IR.
Differential Revision: https://reviews.llvm.org/D116706
Added:
Modified:
mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp
mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
mlir/test/Target/LLVMIR/llvmir.mlir
Removed:
################################################################################
diff --git a/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp
index 3254aed6c3412..e4932e84cd28a 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp
@@ -340,9 +340,9 @@ convertOperationImpl(Operation &opInst, llvm::IRBuilderBase &builder,
}
if (auto invOp = dyn_cast<LLVM::InvokeOp>(opInst)) {
- auto operands = moduleTranslation.lookupValues(opInst.getOperands());
+ auto operands = moduleTranslation.lookupValues(invOp.getCalleeOperands());
ArrayRef<llvm::Value *> operandsRef(operands);
- llvm::Value *result;
+ llvm::Instruction *result;
if (auto attr = opInst.getAttrOfType<FlatSymbolRefAttr>("callee")) {
result = builder.CreateInvoke(
moduleTranslation.lookupFunction(attr.getValue()),
@@ -359,6 +359,7 @@ convertOperationImpl(Operation &opInst, llvm::IRBuilderBase &builder,
moduleTranslation.lookupBlock(invOp.getSuccessor(1)),
operandsRef.drop_front());
}
+ moduleTranslation.mapBranch(invOp, result);
// InvokeOp can only have 0 or 1 result
if (invOp->getNumResults() != 0) {
moduleTranslation.mapValue(opInst.getResult(0), result);
diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
index 404018bebe932..1ca3fb2fc6649 100644
--- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
@@ -386,8 +386,15 @@ static Value getPHISourceValue(Block *current, Block *pred,
return switchOp.getCaseOperands(i.index())[index];
}
- llvm_unreachable("only branch or switch operations can be terminators of a "
- "block that has successors");
+ if (auto invokeOp = dyn_cast<LLVM::InvokeOp>(terminator)) {
+ return invokeOp.getNormalDest() == current
+ ? invokeOp.getNormalDestOperands()[index]
+ : invokeOp.getUnwindDestOperands()[index];
+ }
+
+ llvm_unreachable(
+ "only branch, switch or invoke operations can be terminators "
+ "of a block that has successors");
}
/// Connect the PHI nodes to the results of preceding blocks.
diff --git a/mlir/test/Target/LLVMIR/llvmir.mlir b/mlir/test/Target/LLVMIR/llvmir.mlir
index 6741d51b5f395..54dfd519d81c7 100644
--- a/mlir/test/Target/LLVMIR/llvmir.mlir
+++ b/mlir/test/Target/LLVMIR/llvmir.mlir
@@ -1326,6 +1326,34 @@ llvm.func @invoke_result(%arg0 : !llvm.ptr<i8>) attributes { personality = @__gx
// -----
+llvm.func @foo()
+llvm.func @__gxx_personality_v0(...) -> i32
+
+// CHECK-LABEL: @invoke_phis
+llvm.func @invoke_phis() -> i32 attributes { personality = @__gxx_personality_v0 } {
+// CHECK: invoke void @foo()
+// CHECK-NEXT: to label %[[normal:[0-9]+]] unwind label %[[unwind:[0-9]+]]
+ %0 = llvm.mlir.constant(0 : i32) : i32
+ llvm.invoke @foo() to ^bb1(%0 : i32) unwind ^bb2 : () -> ()
+
+// CHECK: [[normal]]:
+// CHECK-NEXT: %[[a1:[0-9]+]] = phi i32 [ 1, %[[unwind]] ], [ 0, %0 ]
+// CHECK-NEXT: ret i32 %[[a1]]
+^bb1(%1 : i32):
+ llvm.return %1 : i32
+
+// CHECK: [[unwind]]:
+// CHECK-NEXT: landingpad { i8*, i32 }
+// CHECK-NEXT: cleanup
+// CHECK-NEXT: br label %[[normal]]
+^bb2:
+ %2 = llvm.landingpad cleanup : !llvm.struct<(ptr<i8>, i32)>
+ %3 = llvm.mlir.constant(1 : i32) : i32
+ llvm.br ^bb1(%3 : i32)
+}
+
+// -----
+
// CHECK-LABEL: @callFreezeOp
llvm.func @callFreezeOp(%x : i32) {
// CHECK: freeze i32 %{{[0-9]+}}
More information about the Mlir-commits
mailing list