1// RUN: mlir-opt %s --pass-pipeline='builtin.module(llvm.func(mem2reg{region-simplify=false}))' | FileCheck %s 2 3llvm.func @use(i64) 4llvm.func @use_ptr(!llvm.ptr) 5 6#di_basic_type = #llvm.di_basic_type<tag = DW_TAG_base_type, name = "ptr sized type", sizeInBits = 64> 7#di_file = #llvm.di_file<"test.ll" in ""> 8#di_compile_unit = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C_plus_plus_14, file = #di_file, producer = "clang", isOptimized = false, emissionKind = Full> 9#di_subprogram = #llvm.di_subprogram<compileUnit = #di_compile_unit, scope = #di_file, name = "blah", linkageName = "blah", file = #di_file, line = 7, subprogramFlags = Definition> 10// CHECK: #[[$VAR:.*]] = #llvm.di_local_variable<{{.*}}name = "ptr sized var"{{.*}}> 11#di_local_variable = #llvm.di_local_variable<scope = #di_subprogram, name = "ptr sized var", file = #di_file, line = 7, arg = 1, type = #di_basic_type> 12#di_local_variable_2 = #llvm.di_local_variable<scope = #di_subprogram, name = "ptr sized var 2", file = #di_file, line = 7, arg = 1, type = #di_basic_type> 13 14// CHECK-LABEL: llvm.func @basic_store_load 15llvm.func @basic_store_load(%arg0: i64) -> i64 { 16 %0 = llvm.mlir.constant(1 : i32) : i32 17 // CHECK-NOT: = llvm.alloca 18 %1 = llvm.alloca %0 x i64 {alignment = 8 : i64} : (i32) -> !llvm.ptr 19 // CHECK-NOT: llvm.store 20 llvm.store %arg0, %1 {alignment = 4 : i64} : i64, !llvm.ptr 21 // CHECK-NOT: llvm.intr.dbg.declare 22 llvm.intr.dbg.declare #di_local_variable = %1 : !llvm.ptr 23 // CHECK: llvm.intr.dbg.value #[[$VAR]] = %[[LOADED:.*]] : i64 24 // CHECK-NOT: llvm.intr.dbg.value 25 // CHECK-NOT: llvm.intr.dbg.declare 26 // CHECK-NOT: llvm.store 27 %2 = llvm.load %1 {alignment = 4 : i64} : !llvm.ptr -> i64 28 // CHECK: llvm.return %[[LOADED]] : i64 29 llvm.return %2 : i64 30} 31 32// CHECK-LABEL: llvm.func @multiple_store_load 33llvm.func @multiple_store_load(%arg0: i64) -> i64 { 34 %0 = llvm.mlir.constant(1 : i32) : i32 35 // CHECK-NOT: = llvm.alloca 36 %1 = llvm.alloca %0 x i64 {alignment = 8 : i64} : (i32) -> !llvm.ptr 37 // CHECK-NOT: llvm.intr.dbg.declare 38 llvm.intr.dbg.declare #di_local_variable = %1 : !llvm.ptr 39 // CHECK-NOT: llvm.store 40 llvm.store %arg0, %1 {alignment = 4 : i64} : i64, !llvm.ptr 41 // CHECK-NOT: llvm.intr.dbg.declare 42 llvm.intr.dbg.declare #di_local_variable = %1 : !llvm.ptr 43 // CHECK: llvm.intr.dbg.value #[[$VAR]] = %[[LOADED:.*]] : i64 44 // CHECK: llvm.intr.dbg.value #[[$VAR]] = %[[LOADED]] : i64 45 // CHECK-NOT: llvm.intr.dbg.value 46 // CHECK-NOT: llvm.intr.dbg.declare 47 // CHECK-NOT: llvm.store 48 %2 = llvm.load %1 {alignment = 4 : i64} : !llvm.ptr -> i64 49 // CHECK: llvm.return %[[LOADED]] : i64 50 llvm.return %2 : i64 51} 52 53// CHECK-LABEL: llvm.func @block_argument_value 54// CHECK-SAME: (%[[ARG0:.*]]: i64, {{.*}}) 55llvm.func @block_argument_value(%arg0: i64, %arg1: i1) -> i64 { 56 %0 = llvm.mlir.constant(1 : i32) : i32 57 // CHECK-NOT: = llvm.alloca 58 %1 = llvm.alloca %0 x i64 {alignment = 8 : i64} : (i32) -> !llvm.ptr 59 // CHECK-NOT: llvm.intr.dbg.declare 60 llvm.intr.dbg.declare #di_local_variable = %1 : !llvm.ptr 61 llvm.cond_br %arg1, ^bb1, ^bb2 62// CHECK: ^{{.*}}: 63^bb1: 64 // CHECK: llvm.intr.dbg.value #[[$VAR]] = %[[ARG0]] 65 // CHECK-NOT: llvm.intr.dbg.value 66 llvm.store %arg0, %1 {alignment = 4 : i64} : i64, !llvm.ptr 67 llvm.br ^bb2 68// CHECK: ^{{.*}}(%[[BLOCKARG:.*]]: i64): 69^bb2: 70 // CHECK: llvm.intr.dbg.value #[[$VAR]] = %[[BLOCKARG]] 71 %2 = llvm.load %1 {alignment = 4 : i64} : !llvm.ptr -> i64 72 llvm.return %2 : i64 73} 74 75// CHECK-LABEL: llvm.func @double_block_argument_value 76// CHECK-SAME: (%[[ARG0:.*]]: i64, {{.*}}) 77llvm.func @double_block_argument_value(%arg0: i64, %arg1: i1) -> i64 { 78 %0 = llvm.mlir.constant(1 : i32) : i32 79 // CHECK-NOT: = llvm.alloca 80 %1 = llvm.alloca %0 x i64 {alignment = 8 : i64} : (i32) -> !llvm.ptr 81 // CHECK-NOT: llvm.intr.dbg.declare 82 llvm.intr.dbg.declare #di_local_variable = %1 : !llvm.ptr 83 llvm.cond_br %arg1, ^bb1, ^bb2 84// CHECK: ^{{.*}}(%[[BLOCKARG1:.*]]: i64): 85^bb1: 86 // CHECK: llvm.intr.dbg.value #[[$VAR]] = %[[BLOCKARG1]] 87 %2 = llvm.load %1 {alignment = 4 : i64} : !llvm.ptr -> i64 88 llvm.call @use(%2) : (i64) -> () 89 // CHECK: llvm.intr.dbg.value #[[$VAR]] = %[[ARG0]] 90 llvm.store %arg0, %1 {alignment = 4 : i64} : i64, !llvm.ptr 91 llvm.br ^bb2 92 // CHECK-NOT: llvm.intr.dbg.value 93// CHECK: ^{{.*}}(%[[BLOCKARG2:.*]]: i64): 94^bb2: 95 // CHECK: llvm.intr.dbg.value #[[$VAR]] = %[[BLOCKARG2]] 96 llvm.br ^bb1 97} 98 99// CHECK-LABEL: llvm.func @always_drop_promoted_declare 100// CHECK: %[[UNDEF:.*]] = llvm.mlir.undef 101// CHECK-NOT: = llvm.alloca 102// CHECK-NOT: llvm.intr.dbg.declare 103// CHECK: llvm.intr.dbg.value #{{.*}} = %[[UNDEF]] 104llvm.func @always_drop_promoted_declare() { 105 %0 = llvm.mlir.constant(1 : i32) : i32 106 %1 = llvm.alloca %0 x i64 {alignment = 8 : i64} : (i32) -> !llvm.ptr 107 llvm.intr.dbg.declare #di_local_variable = %1 : !llvm.ptr 108 llvm.intr.dbg.value #di_local_variable = %1 : !llvm.ptr 109 llvm.return 110} 111 112// CHECK-LABEL: llvm.func @keep_dbg_if_not_promoted 113llvm.func @keep_dbg_if_not_promoted() { 114 %0 = llvm.mlir.constant(1 : i32) : i32 115 // CHECK: %[[ALLOCA:.*]] = llvm.alloca 116 %1 = llvm.alloca %0 x i64 {alignment = 8 : i64} : (i32) -> !llvm.ptr 117 // CHECK-NOT: = llvm.alloca 118 // CHECK-NOT: llvm.intr.dbg.declare 119 // CHECK: llvm.intr.dbg.declare #[[$VAR]] = %[[ALLOCA]] 120 // CHECK-NOT: = llvm.alloca 121 // CHECK-NOT: llvm.intr.dbg.declare 122 // CHECK: llvm.call @use_ptr(%[[ALLOCA]]) 123 llvm.intr.dbg.declare #di_local_variable = %1 : !llvm.ptr 124 %2 = llvm.alloca %0 x i64 {alignment = 8 : i64} : (i32) -> !llvm.ptr 125 llvm.intr.dbg.declare #di_local_variable_2 = %2 : !llvm.ptr 126 llvm.call @use_ptr(%1) : (!llvm.ptr) -> () 127 llvm.return 128} 129