[all-commits] [llvm/llvm-project] d242aa: [MLIR] Added llvm.invoke and llvm.landingpad
Shraiysh via All-commits
all-commits at lists.llvm.org
Thu Jan 30 03:55:35 PST 2020
Branch: refs/heads/master
Home: https://github.com/llvm/llvm-project
Commit: d242aa245ccfaa527d27c75e50f9b73223aec14b
https://github.com/llvm/llvm-project/commit/d242aa245ccfaa527d27c75e50f9b73223aec14b
Author: Shraiysh Vaishay <cs17btech11050 at iith.ac.in>
Date: 2020-01-30 (Thu, 30 Jan 2020)
Changed paths:
M mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
M mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
M mlir/lib/Target/LLVMIR/ConvertFromLLVMIR.cpp
M mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
M mlir/test/Dialect/LLVMIR/invalid.mlir
M mlir/test/Dialect/LLVMIR/roundtrip.mlir
M mlir/test/Target/import.ll
M mlir/test/Target/llvmir.mlir
Log Message:
-----------
[MLIR] Added llvm.invoke and llvm.landingpad
Summary:
I have tried to implement `llvm.invoke` and `llvm.landingpad`.
# `llvm.invoke` is similar to `llvm.call` with two successors added, the first one is the normal label and the second one is unwind label.
# `llvm.launchpad` takes a variable number of args with either `catch` or `filter` associated with them. Catch clauses are not array types and filter clauses are array types. This is same as the criteria used by LLVM (https://github.com/llvm/llvm-project/blob/4f82af81a04d711721300f6ca32f402f2ea6faf4/llvm/include/llvm/IR/Instructions.h#L2866)
Examples:
LLVM IR
```
define i32 @caller(i32 %a) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
invoke i32 @foo(i32 2) to label %success unwind label %fail
success:
ret i32 2
fail:
landingpad {i8*, i32} catch i8** @_ZTIi catch i8** null catch i8* bitcast (i8** @_ZTIi to i8*) filter [1 x i8] [ i8 1 ]
ret i32 3
}
```
MLIR LLVM Dialect
```
llvm.func @caller(%arg0: !llvm.i32) -> !llvm.i32 {
%0 = llvm.mlir.constant(3 : i32) : !llvm.i32
%1 = llvm.mlir.constant("\01") : !llvm<"[1 x i8]">
%2 = llvm.mlir.addressof @_ZTIi : !llvm<"i8**">
%3 = llvm.bitcast %2 : !llvm<"i8**"> to !llvm<"i8*">
%4 = llvm.mlir.null : !llvm<"i8**">
%5 = llvm.mlir.addressof @_ZTIi : !llvm<"i8**">
%6 = llvm.mlir.constant(2 : i32) : !llvm.i32
%7 = llvm.invoke @foo(%6) to ^bb1 unwind ^bb2 : (!llvm.i32) -> !llvm.i32
^bb1: // pred: ^bb0
llvm.return %6 : !llvm.i32
^bb2: // pred: ^bb0
%8 = llvm.landingpad (catch %5 : !llvm<"i8**">) (catch %4 : !llvm<"i8**">) (catch %3 : !llvm<"i8*">) (filter %1 : !llvm<"[1 x i8]">) : !llvm<"{ i8*, i32 }">
llvm.return %0 : !llvm.i32
}
```
Signed-off-by: Shraiysh Vaishay <cs17btech11050 at iith.ac.in>
Differential Revision: https://reviews.llvm.org/D72006
More information about the All-commits
mailing list