Skip to content

Commit 4351398

Browse files
committed
add roundtrip test for operand bundle syntax
1 parent 2290580 commit 4351398

File tree

2 files changed

+94
-6
lines changed

2 files changed

+94
-6
lines changed

mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -228,9 +228,13 @@ static void printOneOpBundle(OpAsmPrinter &p, OperandRange operands,
228228
TypeRange operandTypes, StringRef tag) {
229229
p.printString(tag);
230230
p << "(";
231-
p.printOperands(operands);
232-
p << " : ";
233-
llvm::interleaveComma(operandTypes, p);
231+
232+
if (!operands.empty()) {
233+
p.printOperands(operands);
234+
p << " : ";
235+
llvm::interleaveComma(operandTypes, p);
236+
}
237+
234238
p << ")";
235239
}
236240

@@ -1611,7 +1615,7 @@ void InvokeOp::print(OpAsmPrinter &p) {
16111615
else
16121616
p << getOperand(0);
16131617

1614-
p << '(' << getOperands().drop_front(isDirect ? 0 : 1) << ')';
1618+
p << '(' << getCalleeOperands().drop_front(isDirect ? 0 : 1) << ')';
16151619
p << " to ";
16161620
p.printSuccessorAndUseList(getNormalDest(), getNormalDestOperands());
16171621
p << " unwind ";
@@ -1635,8 +1639,9 @@ void InvokeOp::print(OpAsmPrinter &p) {
16351639
p << " : ";
16361640
if (!isDirect)
16371641
p << getOperand(0).getType() << ", ";
1638-
p.printFunctionalType(llvm::drop_begin(getOperandTypes(), isDirect ? 0 : 1),
1639-
getResultTypes());
1642+
p.printFunctionalType(
1643+
llvm::drop_begin(getCalleeOperands().getTypes(), isDirect ? 0 : 1),
1644+
getResultTypes());
16401645
}
16411646

16421647
// <operation> ::= `llvm.invoke` (cconv)? (function-id | ssa-use)

mlir/test/Dialect/LLVMIR/roundtrip.mlir

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -751,3 +751,86 @@ llvm.func @vector_predication_intrinsics(%A: vector<8xi32>, %B: vector<8xi32>,
751751
(vector<8xi32>, vector<8xi32>, vector<8xi1>, i32) -> vector<8xi32>
752752
llvm.return
753753
}
754+
755+
llvm.func @op_bundle_target()
756+
757+
// CHECK-LABEL: @test_call_with_empty_opbundle
758+
llvm.func @test_call_with_empty_opbundle() {
759+
// CHECK: llvm.call @op_bundle_target() : () -> ()
760+
llvm.call @op_bundle_target() [] : () -> ()
761+
llvm.return
762+
}
763+
764+
// CHECK-LABEL: @test_call_with_empty_opbundle_operands
765+
llvm.func @test_call_with_empty_opbundle_operands() {
766+
// CHECK: llvm.call @op_bundle_target() ["tag"()] : () -> ()
767+
llvm.call @op_bundle_target() ["tag"()] : () -> ()
768+
llvm.return
769+
}
770+
771+
// CHECK-LABEL: @test_call_with_opbundle
772+
llvm.func @test_call_with_opbundle() {
773+
%0 = llvm.mlir.constant(0 : i32) : i32
774+
%1 = llvm.mlir.constant(1 : i32) : i32
775+
%2 = llvm.mlir.constant(2 : i32) : i32
776+
// CHECK: llvm.call @op_bundle_target() ["tag1"(%{{.+}}, %{{.+}} : i32, i32), "tag2"(%{{.+}} : i32)] : () -> ()
777+
llvm.call @op_bundle_target() ["tag1"(%0, %1 : i32, i32), "tag2"(%2 : i32)] : () -> ()
778+
llvm.return
779+
}
780+
781+
// CHECK-LABEL: @test_invoke_with_empty_opbundle
782+
llvm.func @test_invoke_with_empty_opbundle() attributes { personality = @__gxx_personality_v0 } {
783+
%0 = llvm.mlir.constant(1 : i32) : i32
784+
%1 = llvm.mlir.constant(2 : i32) : i32
785+
%2 = llvm.mlir.constant(3 : i32) : i32
786+
// CHECK: llvm.invoke @op_bundle_target() to ^{{.+}} unwind ^{{.+}} : () -> ()
787+
llvm.invoke @op_bundle_target() to ^bb2 unwind ^bb1 [] : () -> ()
788+
789+
^bb1:
790+
%3 = llvm.landingpad cleanup : !llvm.struct<(ptr, i32)>
791+
llvm.return
792+
793+
^bb2:
794+
llvm.return
795+
}
796+
797+
// CHECK-LABEL: @test_invoke_with_empty_opbundle_operands
798+
llvm.func @test_invoke_with_empty_opbundle_operands() attributes { personality = @__gxx_personality_v0 } {
799+
%0 = llvm.mlir.constant(1 : i32) : i32
800+
%1 = llvm.mlir.constant(2 : i32) : i32
801+
%2 = llvm.mlir.constant(3 : i32) : i32
802+
// CHECK: llvm.invoke @op_bundle_target() to ^{{.+}} unwind ^{{.+}} ["tag"()] : () -> ()
803+
llvm.invoke @op_bundle_target() to ^bb2 unwind ^bb1 ["tag"()] : () -> ()
804+
805+
^bb1:
806+
%3 = llvm.landingpad cleanup : !llvm.struct<(ptr, i32)>
807+
llvm.return
808+
809+
^bb2:
810+
llvm.return
811+
}
812+
813+
// CHECK-LABEL: @test_invoke_with_opbundle
814+
llvm.func @test_invoke_with_opbundle() attributes { personality = @__gxx_personality_v0 } {
815+
%0 = llvm.mlir.constant(1 : i32) : i32
816+
%1 = llvm.mlir.constant(2 : i32) : i32
817+
%2 = llvm.mlir.constant(3 : i32) : i32
818+
// CHECK: llvm.invoke @op_bundle_target() to ^{{.+}} unwind ^{{.+}} ["tag1"(%{{.+}}, %{{.+}} : i32, i32), "tag2"(%{{.+}} : i32)] : () -> ()
819+
llvm.invoke @op_bundle_target() to ^bb2 unwind ^bb1 ["tag1"(%0, %1 : i32, i32), "tag2"(%2 : i32)] : () -> ()
820+
821+
^bb1:
822+
%3 = llvm.landingpad cleanup : !llvm.struct<(ptr, i32)>
823+
llvm.return
824+
825+
^bb2:
826+
llvm.return
827+
}
828+
829+
// CHECK-LABEL: @test_call_intrin_with_opbundle
830+
llvm.func @test_call_intrin_with_opbundle(%arg0 : !llvm.ptr) {
831+
%0 = llvm.mlir.constant(1 : i1) : i1
832+
%1 = llvm.mlir.constant(16 : i32) : i32
833+
// CHECK: llvm.call_intrinsic "llvm.assume"(%{{.+}}) ["align"(%{{.+}}, %{{.+}} : !llvm.ptr, i32)] : (i1) -> ()
834+
llvm.call_intrinsic "llvm.assume"(%0) ["align"(%arg0, %1 : !llvm.ptr, i32)] : (i1) -> ()
835+
llvm.return
836+
}

0 commit comments

Comments
 (0)