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