| // RUN: mlir-opt -allow-unregistered-dialect %s -symbol-dce -split-input-file -verify-diagnostics | FileCheck %s |
| // RUN: mlir-opt -allow-unregistered-dialect %s -pass-pipeline="builtin.module(symbol-dce)" -split-input-file | FileCheck %s --check-prefix=NESTED |
| |
| // Check that trivially dead and trivially live non-nested cases are handled. |
| |
| // CHECK-LABEL: module attributes {test.simple} |
| module attributes {test.simple} { |
| // CHECK-NOT: func private @dead_private_function |
| func private @dead_private_function() |
| |
| // CHECK-NOT: func nested @dead_nested_function |
| func nested @dead_nested_function() |
| |
| // CHECK: func private @live_private_function |
| func private @live_private_function() |
| |
| // CHECK: func nested @live_nested_function |
| func nested @live_nested_function() |
| |
| // CHECK: func @public_function |
| func @public_function() { |
| "foo.return"() {uses = [@live_private_function, @live_nested_function]} : () -> () |
| } |
| } |
| |
| // ----- |
| |
| // Check that we don't DCE nested symbols if they are used. |
| // CHECK-LABEL: module attributes {test.nested} |
| module attributes {test.nested} { |
| // CHECK: module @public_module |
| module @public_module { |
| // CHECK-NOT: func nested @dead_nested_function |
| func nested @dead_nested_function() |
| |
| // CHECK: func private @private_function |
| func private @private_function() |
| |
| // CHECK: func nested @nested_function |
| func nested @nested_function() { |
| "foo.return"() {uses = [@private_function]} : () -> () |
| } |
| } |
| |
| "live.user"() {uses = [@public_module::@nested_function]} : () -> () |
| } |
| |
| // ----- |
| |
| // Check that we don't DCE symbols if we can't prove that the top-level symbol |
| // table that we are running on is hidden from above. |
| // NESTED-LABEL: module attributes {test.no_dce_non_hidden_parent} |
| module attributes {test.no_dce_non_hidden_parent} { |
| // NESTED: module @public_module |
| module @public_module { |
| // NESTED: func nested @nested_function |
| func nested @nested_function() |
| } |
| // NESTED: module @nested_module |
| module @nested_module attributes { sym_visibility = "nested" } { |
| // NESTED: func nested @nested_function |
| func nested @nested_function() |
| } |
| |
| // Only private modules can be assumed to be hidden. |
| // NESTED: module @private_module |
| module @private_module attributes { sym_visibility = "private" } { |
| // NESTED-NOT: func nested @nested_function |
| func nested @nested_function() |
| } |
| |
| "live.user"() {uses = [@nested_module, @private_module]} : () -> () |
| } |
| |
| // ----- |
| |
| module { |
| func private @private_symbol() |
| |
| // expected-error@+1 {{contains potentially unknown symbol table}} |
| "foo.possibly_unknown_symbol_table"() ({ |
| }) : () -> () |
| } |
| |
| // ----- |
| |
| module { |
| // expected-error@+1 {{unable to resolve reference to symbol}} |
| "live.user"() {uses = [@unknown_symbol]} : () -> () |
| } |