[mlir][llvm] Use cached constants when importing landingpad instructions
authorVictor Perez <victor.perez@codeplay.com>
Wed, 26 Apr 2023 08:58:13 +0000 (09:58 +0100)
committerVictor Perez <victor.perez@codeplay.com>
Wed, 26 Apr 2023 13:32:04 +0000 (14:32 +0100)
Not using cached constants when importing instructions may lead to
undesired results, as breaking dominance rules in the translated MLIR
module.

Signed-off-by: Victor Perez <victor.perez@codeplay.com>
Differential Revision: https://reviews.llvm.org/D149247

mlir/lib/Target/LLVMIR/ModuleImport.cpp
mlir/test/Target/LLVMIR/Import/exception.ll

index 4338f0314cdd85a721f3b48af649c4330e26b8c3..64d4843f06388db23c36930b4ead9420467d5c33 100644 (file)
@@ -1273,7 +1273,7 @@ LogicalResult ModuleImport::convertInstruction(llvm::Instruction *inst) {
     SmallVector<Value> operands;
     operands.reserve(lpInst->getNumClauses());
     for (auto i : llvm::seq<unsigned>(0, lpInst->getNumClauses())) {
-      FailureOr<Value> operand = convertConstantExpr(lpInst->getClause(i));
+      FailureOr<Value> operand = convertValue(lpInst->getClause(i));
       if (failed(operand))
         return failure();
       operands.push_back(*operand);
index 374f51e06e840e781791f413fb7af70a30768292..944e5de6badd9d73aec228b9c4f372af137056e7 100644 (file)
@@ -103,3 +103,38 @@ bb1:
   ; CHECK: llvm.resume %[[lp]] : i32
   resume i32 %resume
 }
+
+declare void @f0(ptr)
+declare void @f1(i32)
+declare void @f2({ptr, i32})
+
+; CHECK-LABEL: @landingpad_dominance
+define void @landingpad_dominance() personality ptr @__gxx_personality_v0 {
+entry:
+  ; CHECK:    %[[null:.*]] = llvm.mlir.null : !llvm.ptr
+  ; CHECK:    %[[c1:.*]] = llvm.mlir.constant(0 : i32) : i32
+  ; CHECK:    %[[undef:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, i32)>
+  ; CHECK:    %[[tmpstruct:.*]] = llvm.insertvalue %[[null]], %[[undef]][0] : !llvm.struct<(ptr, i32)>
+  ; CHECK:    %[[struct:.*]] = llvm.insertvalue %[[c1]], %[[tmpstruct]][1] : !llvm.struct<(ptr, i32)>
+  ; CHECK:    llvm.call @f0(%[[null]]) : (!llvm.ptr) -> ()
+  call void @f0(ptr null)
+  ; CHECK:    llvm.call @f1(%[[c1]]) : (i32) -> ()
+  call void @f1(i32 0)
+  ; CHECK:    llvm.invoke @f0(%[[null]]) to ^[[block2:.*]] unwind ^[[block1:.*]] : (!llvm.ptr) -> ()
+  invoke void @f0(ptr null)
+      to label %exit unwind label %catch
+
+; CHECK:  ^[[block1]]:
+catch:
+  ; CHECK:    %[[lp:.*]] = llvm.landingpad (catch %[[null]] : !llvm.ptr) : !llvm.struct<(ptr, i32)>
+  %lp = landingpad { ptr, i32 } catch ptr null
+  ; CHECK:    llvm.call @f2(%[[struct]]) : (!llvm.struct<(ptr, i32)>) -> ()
+  call void @f2({ptr, i32} {ptr null, i32 0})
+  ; CHECK:    llvm.resume %[[lp]] : !llvm.struct<(ptr, i32)>
+  resume {ptr, i32} %lp
+
+; CHECK:  ^[[block2]]:
+exit:
+  ; CHECK:    llvm.return
+  ret void
+}