1// RUN: mlir-opt -allow-unregistered-dialect %s -mlir-print-debuginfo -mlir-print-local-scope | FileCheck %s
2// RUN: mlir-opt -allow-unregistered-dialect %s -mlir-print-debuginfo | FileCheck %s --check-prefix=CHECK-ALIAS
3// RUN: mlir-opt -allow-unregistered-dialect %s -mlir-print-debuginfo | mlir-opt -allow-unregistered-dialect -mlir-print-debuginfo | FileCheck %s --check-prefix=CHECK-ALIAS
4// This test verifies that debug locations are round-trippable.
5
6#set0 = affine_set<(d0) : (1 == 0)>
7
8// CHECK-LABEL: func @inline_notation
9func.func @inline_notation() -> i32 {
10  // CHECK: -> i32 loc("foo")
11  %1 = "foo"() : () -> i32 loc("foo")
12
13  // CHECK: arith.constant 4 : index loc(callsite("foo" at "mysource.cc":10:8))
14  %2 = arith.constant 4 : index loc(callsite("foo" at "mysource.cc":10:8))
15
16  // CHECK: affine.for %arg0 loc("IVlocation") = 0 to 8 {
17  // CHECK: } loc(fused["foo", "mysource.cc":10:8])
18  affine.for %i0 loc("IVlocation") = 0 to 8 {
19  } loc(fused["foo", "mysource.cc":10:8])
20
21  // CHECK: } loc(fused<"myPass">["foo", "foo2"])
22  affine.if #set0(%2) {
23  } loc(fused<"myPass">["foo", "foo2"])
24
25  // CHECK: } loc(fused<"myPass">["foo"])
26  affine.if #set0(%2) {
27  } loc(fused<"myPass">["foo"])
28
29  // CHECK: return %0 : i32 loc(unknown)
30  return %1 : i32 loc(unknown)
31}
32
33// CHECK-LABEL: func private @loc_attr(i1 {foo.loc_attr = loc(callsite("foo" at "mysource.cc":10:8))})
34func.func private @loc_attr(i1 {foo.loc_attr = loc(callsite("foo" at "mysource.cc":10:8))})
35
36  // Check that locations get properly escaped.
37// CHECK-LABEL: func @escape_strings()
38func.func @escape_strings() {
39  // CHECK: loc("escaped\0A")
40  "foo"() : () -> () loc("escaped\n")
41
42  // CHECK: loc("escaped\0A")
43  "foo"() : () -> () loc("escaped\0A")
44
45  // CHECK: loc("escaped\0A":0:0)
46  "foo"() : () -> () loc("escaped\n":0:0)
47  return
48}
49
50// CHECK-ALIAS: "foo.op"() : () -> () loc(#[[LOC:.*]])
51"foo.op"() : () -> () loc(#loc)
52
53// CHECK-LABEL: func @argLocs(
54// CHECK-SAME:  %arg0: i32 loc({{.*}}locations.mlir":[[# @LINE+1]]:20),
55func.func @argLocs(%x: i32,
56// CHECK-SAME:  %arg1: i64 loc("hotdog")
57              %y: i64 loc("hotdog")) {
58  return
59}
60
61// CHECK-LABEL: "foo.unknown_op_with_bbargs"()
62// CHECK-ALIAS: "foo.unknown_op_with_bbargs"()
63"foo.unknown_op_with_bbargs"() ({
64// CHECK-NEXT: ^bb0(%arg0: i32 loc({{.*}}locations.mlir":[[# @LINE+2]]:7),
65// CHECK-ALIAS-NEXT: ^bb0(%arg0: i32 loc({{.*}}locations.mlir":[[# @LINE+1]]:7),
66 ^bb0(%x: i32,
67// CHECK-SAME: %arg1: i32 loc("cheetos"),
68// CHECK-ALIAS-SAME: %arg1: i32 loc("cheetos"),
69      %y: i32 loc("cheetos"),
70// CHECK-SAME: %arg2: i32 loc("out_of_line_location2")):
71// CHECK-ALIAS-SAME: %arg2: i32 loc("out_of_line_location2")):
72      %z: i32 loc("out_of_line_location2")):
73    %1 = arith.addi %x, %y : i32
74    "foo.yield"(%1) : (i32) -> ()
75  }) : () -> ()
76
77// CHECK-LABEL: func @location_name_child_is_name
78func.func @location_name_child_is_name() {
79  // CHECK: "foo"("foo")
80  return loc("foo"("foo"))
81}
82
83// CHECK-ALIAS: #[[LOC]] = loc("out_of_line_location")
84#loc = loc("out_of_line_location")
85