193 lines · plain
1; RUN: mlir-translate -import-llvm -split-input-file %s | FileCheck %s2 3@_ZTIi = external dso_local constant ptr4@_ZTIii= external dso_local constant ptr5declare void @foo(ptr)6declare void @vararg_foo(ptr, ...)7declare ptr @bar(ptr)8declare i32 @__gxx_personality_v0(...)9 10; CHECK-LABEL: @invokeLandingpad11define i32 @invokeLandingpad() personality ptr @__gxx_personality_v0 {12 ; CHECK: %[[a1:[0-9]+]] = llvm.mlir.addressof @_ZTIii : !llvm.ptr13 ; CHECK: %[[a3:[0-9]+]] = llvm.alloca %{{[0-9]+}} x i8 {alignment = 1 : i64} : (i32) -> !llvm.ptr14 %1 = alloca i815 ; CHECK: llvm.invoke @foo(%[[a3]]) to ^[[bb1:.*]] unwind ^[[bb4:.*]] : (!llvm.ptr) -> ()16 invoke void @foo(ptr %1) to label %bb1 unwind label %bb417 18; CHECK: ^[[bb1]]:19bb1:20 ; CHECK: %{{[0-9]+}} = llvm.invoke @bar(%[[a3]]) to ^[[bb2:.*]] unwind ^[[bb4]] : (!llvm.ptr) -> !llvm.ptr21 %2 = invoke ptr @bar(ptr %1) to label %bb2 unwind label %bb422 23; CHECK: ^[[bb2]]:24bb2:25 ; CHECK: llvm.invoke @vararg_foo(%[[a3]], %{{.*}}) to ^[[bb3:.*]] unwind ^[[bb4]] vararg(!llvm.func<void (ptr, ...)>) : (!llvm.ptr, i32) -> ()26 invoke void (ptr, ...) @vararg_foo(ptr %1, i32 0) to label %bb3 unwind label %bb427 28; CHECK: ^[[bb3]]:29bb3:30 ; CHECK: llvm.invoke %{{.*}}(%[[a3]], %{{.*}}) to ^[[bb5:.*]] unwind ^[[bb4]] vararg(!llvm.func<void (ptr, ...)>) : !llvm.ptr, (!llvm.ptr, i32) -> ()31 invoke void (ptr, ...) undef(ptr %1, i32 0) to label %bb5 unwind label %bb432 33; CHECK: ^[[bb4]]:34bb4:35 ; CHECK: %{{[0-9]+}} = llvm.landingpad (catch %{{[0-9]+}} : !llvm.ptr) (catch %[[a1]] : !llvm.ptr) (filter %{{[0-9]+}} : !llvm.array<1 x i1>) : !llvm.struct<(ptr, i32)>36 %3 = landingpad { ptr, i32 } catch ptr @_ZTIi catch ptr @_ZTIii37 filter [1 x i1] [i1 1]38 resume { ptr, i32 } %339 40; CHECK: ^[[bb5]]:41bb5:42 ; CHECK: llvm.return %{{[0-9]+}} : i3243 ret i32 144}45 46declare i32 @foo2()47 48; CHECK-LABEL: @invokePhi49; CHECK-SAME: (%[[cond:.*]]: i1) -> i3250define i32 @invokePhi(i1 %cond) personality ptr @__gxx_personality_v0 {51entry:52 ; CHECK: %[[c0:.*]] = llvm.mlir.constant(0 : i32) : i3253 ; CHECK: llvm.cond_br %[[cond]], ^[[bb1:.*]], ^[[bb2:.*]]54 br i1 %cond, label %call, label %nocall55; CHECK: ^[[bb1]]:56call:57 ; CHECK: %[[invoke:.*]] = llvm.invoke @foo2() to ^[[bb3:.*]] unwind ^[[bb5:.*]] : () -> i3258 %invoke = invoke i32 @foo2() to label %bb0 unwind label %bb159; CHECK: ^[[bb2]]:60nocall:61 ; CHECK: llvm.br ^[[bb4:.*]](%[[c0]] : i32)62 br label %bb063; CHECK: ^[[bb3]]:64 ; CHECK: llvm.br ^[[bb4]](%[[invoke]] : i32)65; CHECK: ^[[bb4]](%[[barg:.*]]: i32):66bb0:67 %ret = phi i32 [ 0, %nocall ], [ %invoke, %call ]68 ; CHECK: llvm.return %[[barg]] : i3269 ret i32 %ret70; CHECK: ^[[bb5]]:71bb1:72 ; CHECK: %[[lp:.*]] = llvm.landingpad cleanup : i3273 %resume = landingpad i32 cleanup74 ; CHECK: llvm.resume %[[lp]] : i3275 resume i32 %resume76}77 78; CHECK-LABEL: @invokePhiComplex79; CHECK-SAME: (%[[cond:.*]]: i1) -> i3280define i32 @invokePhiComplex(i1 %cond) personality ptr @__gxx_personality_v0 {81entry:82 ; CHECK: %[[c0:.*]] = llvm.mlir.constant(0 : i32) : i3283 ; CHECK: %[[c1:.*]] = llvm.mlir.constant(1 : i32) : i3284 ; CHECK: %[[c2:.*]] = llvm.mlir.constant(2 : i32) : i3285 ; CHECK: %[[c20:.*]] = llvm.mlir.constant(20 : i32) : i3286 ; CHECK: llvm.cond_br %[[cond]], ^[[bb1:.*]], ^[[bb2:.*]]87 br i1 %cond, label %call, label %nocall88; CHECK: ^[[bb1]]:89call:90 ; CHECK: %[[invoke:.*]] = llvm.invoke @foo2() to ^[[bb3:.*]] unwind ^[[bb5:.*]] : () -> i3291 %invoke = invoke i32 @foo2() to label %bb0 unwind label %bb192; CHECK: ^[[bb2]]:93nocall:94 ; CHECK: llvm.br ^[[bb4:.*]](%[[c0]], %[[c1]], %[[c2]] : i32, i32, i32)95 br label %bb096; CHECK: ^[[bb3]]:97 ; CHECK: llvm.br ^[[bb4]](%[[invoke]], %[[c20]], %[[invoke]] : i32, i32, i32)98; CHECK: ^[[bb4]](%[[barg0:.*]]: i32, %[[barg1:.*]]: i32, %[[barg2:.*]]: i32):99bb0:100 %a = phi i32 [ 0, %nocall ], [ %invoke, %call ]101 %b = phi i32 [ 1, %nocall ], [ 20, %call ]102 %c = phi i32 [ 2, %nocall ], [ %invoke, %call ]103 ; CHECK: %[[add0:.*]] = llvm.add %[[barg0]], %[[barg1]] : i32104 ; CHECK: %[[add1:.*]] = llvm.add %[[barg2]], %[[add0]] : i32105 %d = add i32 %a, %b106 %e = add i32 %c, %d107 ; CHECK: llvm.return %[[add1]] : i32108 ret i32 %e109; CHECK: ^[[bb5]]:110bb1:111 ; CHECK: %[[lp:.*]] = llvm.landingpad cleanup : i32112 %resume = landingpad i32 cleanup113 ; CHECK: llvm.resume %[[lp]] : i32114 resume i32 %resume115}116 117declare void @f0(ptr)118declare void @f1(i32)119declare void @f2({ptr, i32})120 121; CHECK-LABEL: @landingpad_dominance122define void @landingpad_dominance() personality ptr @__gxx_personality_v0 {123entry:124 ; CHECK: %[[null:.*]] = llvm.mlir.zero : !llvm.ptr125 ; CHECK: %[[c1:.*]] = llvm.mlir.constant(0 : i32) : i32126 ; CHECK: %[[undef:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, i32)>127 ; CHECK: %[[tmpstruct:.*]] = llvm.insertvalue %[[null]], %[[undef]][0] : !llvm.struct<(ptr, i32)>128 ; CHECK: %[[struct:.*]] = llvm.insertvalue %[[c1]], %[[tmpstruct]][1] : !llvm.struct<(ptr, i32)>129 ; CHECK: llvm.call @f0(%[[null]]) : (!llvm.ptr) -> ()130 call void @f0(ptr null)131 ; CHECK: llvm.call @f1(%[[c1]]) : (i32) -> ()132 call void @f1(i32 0)133 ; CHECK: llvm.invoke @f0(%[[null]]) to ^[[block2:.*]] unwind ^[[block1:.*]] : (!llvm.ptr) -> ()134 invoke void @f0(ptr null)135 to label %exit unwind label %catch136 137; CHECK: ^[[block1]]:138catch:139 ; CHECK: %[[lp:.*]] = llvm.landingpad (catch %[[null]] : !llvm.ptr) : !llvm.struct<(ptr, i32)>140 %lp = landingpad { ptr, i32 } catch ptr null141 ; CHECK: llvm.call @f2(%[[struct]]) : (!llvm.struct<(ptr, i32)>) -> ()142 call void @f2({ptr, i32} {ptr null, i32 0})143 ; CHECK: llvm.resume %[[lp]] : !llvm.struct<(ptr, i32)>144 resume {ptr, i32} %lp145 146; CHECK: ^[[block2]]:147exit:148 ; CHECK: llvm.return149 ret void150}151 152; // -----153 154declare i32 @__gxx_personality_v0(...)155declare void @foo(ptr)156 157; CHECK-LABEL: @invokeLandingpad158define i32 @invokeLandingpad(ptr %addr) personality ptr @__gxx_personality_v0 {159entry:160 %1 = alloca i8161 %zzz = load i32, ptr %addr, align 4162 invoke void @foo(ptr %1) to label %bb1 unwind label %bb2163 164bb1:165 %yyy = load i32, ptr %addr, align 4166 invoke void @foo(ptr %1) to label %bb3 unwind label %bb2167 168; CHECK: ^bb{{.*}}(%[[ARG:.*]]: i32):169bb2:170 %phi_var = phi i32 [ %zzz, %entry ], [ %yyy, %bb1 ], !dbg !5171 ; CHECK: llvm.landingpad cleanup : !llvm.struct<(ptr, i32)>172 ; CHECK-NEXT: llvm.intr.dbg.value #di_local_variable #llvm.di_expression<[DW_OP_LLVM_fragment(64, 64)]> = %[[ARG]] : i32173 %3 = landingpad { ptr, i32 } cleanup, !dbg !5174 #dbg_value(i32 %phi_var, !8, !DIExpression(DW_OP_LLVM_fragment, 64, 64), !7)175 br label %bb3176 177bb3:178 ; CHECK: llvm.return %{{[0-9]+}} : i32179 ret i32 1180}181 182!llvm.dbg.cu = !{!1}183!llvm.module.flags = !{!0}184!0 = !{i32 2, !"Debug Info Version", i32 3}185!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2)186!2 = !DIFile(filename: "landingpad.ll", directory: "/")187!3 = distinct !DISubprogram(name: "instruction_loc", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1)188!4 = distinct !DISubprogram(name: "callee", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1)189!5 = !DILocation(line: 1, column: 2, scope: !3)190!6 = !DILocation(line: 2, column: 2, scope: !3)191!7 = !DILocation(line: 7, column: 4, scope: !4, inlinedAt: !6)192!8 = !DILocalVariable(scope: !4, name: "size")193