559 lines · plain
1// RUN: mlir-opt %s -inline -split-input-file | FileCheck %s2 3#alias_scope_domain = #llvm.alias_scope_domain<id = distinct[0]<>, description = "foo">4#alias_scope = #llvm.alias_scope<id = distinct[1]<>, domain = #alias_scope_domain, description = "foo load">5#alias_scope1 = #llvm.alias_scope<id = distinct[2]<>, domain = #alias_scope_domain, description = "foo store">6 7// CHECK-DAG: #[[FOO_DOMAIN:.*]] = #llvm.alias_scope_domain<{{.*}}>8// CHECK-DAG: #[[$FOO_LOAD:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[FOO_DOMAIN]], description = {{.*}}>9// CHECK-DAG: #[[$FOO_STORE:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[FOO_DOMAIN]], description = {{.*}}>10 11// CHECK-DAG: #[[BAR_DOMAIN:.*]] = #llvm.alias_scope_domain<{{.*}}>12// CHECK-DAG: #[[$BAR_LOAD:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[BAR_DOMAIN]], description = {{.*}}>13// CHECK-DAG: #[[$BAR_STORE:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[BAR_DOMAIN]], description = {{.*}}>14 15// CHECK-LABEL: llvm.func @foo16// CHECK: llvm.intr.experimental.noalias.scope.decl #[[$FOO_LOAD]]17// CHECK: llvm.load18// CHECK-SAME: alias_scopes = [#[[$FOO_LOAD]]]19// CHECK-SAME: noalias_scopes = [#[[$FOO_STORE]]]20// CHECK: llvm.store21// CHECK-SAME: alias_scopes = [#[[$FOO_STORE]]]22// CHECK-SAME: noalias_scopes = [#[[$FOO_LOAD]]]23llvm.func @foo(%arg0: !llvm.ptr, %arg1: !llvm.ptr) {24 %0 = llvm.mlir.constant(5 : i64) : i6425 llvm.intr.experimental.noalias.scope.decl #alias_scope26 %2 = llvm.load %arg1 {alias_scopes = [#alias_scope], alignment = 4 : i64, noalias_scopes = [#alias_scope1]} : !llvm.ptr -> f3227 "test.one_region_op"() ({28 %3 = llvm.getelementptr inbounds %arg0[%0] : (!llvm.ptr, i64) -> !llvm.ptr, f3229 llvm.store %2, %3 {alias_scopes = [#alias_scope1], alignment = 4 : i64, noalias_scopes = [#alias_scope]} : f32, !llvm.ptr30 "test.terminator"() : () -> ()31 }) : () -> ()32 llvm.return33}34 35// CHECK-LABEL: llvm.func @clone_alias_scopes36// CHECK: llvm.intr.experimental.noalias.scope.decl #[[$BAR_LOAD]]37// CHECK: llvm.load38// CHECK-SAME: alias_scopes = [#[[$BAR_LOAD]]]39// CHECK-SAME: noalias_scopes = [#[[$BAR_STORE]]]40// CHECK: llvm.store41// CHECK-SAME: alias_scopes = [#[[$BAR_STORE]]]42// CHECK-SAME: noalias_scopes = [#[[$BAR_LOAD]]]43llvm.func @clone_alias_scopes(%arg0: !llvm.ptr, %arg1: !llvm.ptr) {44 llvm.call @foo(%arg0, %arg1) : (!llvm.ptr, !llvm.ptr) -> ()45 llvm.return46}47 48// -----49 50#alias_scope_domain = #llvm.alias_scope_domain<id = distinct[0]<>, description = "hello2">51#alias_scope_domain1 = #llvm.alias_scope_domain<id = distinct[1]<>, description = "hello">52#alias_scope = #llvm.alias_scope<id = distinct[2]<>, domain = #alias_scope_domain, description = "hello2: %a">53#alias_scope1 = #llvm.alias_scope<id = distinct[3]<>, domain = #alias_scope_domain, description = "hello2: %b">54#alias_scope2 = #llvm.alias_scope<id = distinct[4]<>, domain = #alias_scope_domain1, description = "hello: %a">55 56// CHECK-DAG: #[[WITH_DOMAIN:.*]] = #llvm.alias_scope_domain<{{.*}}>57// CHECK-DAG: #[[$WITH_DOMAIN_SCOPE1:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[WITH_DOMAIN]], description = {{.*}}>58// CHECK-DAG: #[[$WITH_DOMAIN_SCOPE2:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[WITH_DOMAIN]], description = {{.*}}>59 60// CHECK-DAG: #[[CALL_DOMAIN:.*]] = #llvm.alias_scope_domain<{{.*}}>61// CHECK-DAG: #[[$CALL_DOMAIN_SCOPE:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[CALL_DOMAIN]], description = {{.*}}>62 63// CHECK-DAG: #[[WITH_DOMAIN_NO_ALIAS:.*]] = #llvm.alias_scope_domain<{{.*}}>64// CHECK-DAG: #[[$WITH_DOMAIN_NO_ALIAS_SCOPE1:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[WITH_DOMAIN_NO_ALIAS]], description = {{.*}}>65// CHECK-DAG: #[[$WITH_DOMAIN_NO_ALIAS_SCOPE2:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[WITH_DOMAIN_NO_ALIAS]], description = {{.*}}>66 67// CHECK-DAG: #[[WITH_DOMAIN_ALIAS:.*]] = #llvm.alias_scope_domain<{{.*}}>68// CHECK-DAG: #[[$WITH_DOMAIN_ALIAS_SCOPE1:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[WITH_DOMAIN_ALIAS]], description = {{.*}}>69// CHECK-DAG: #[[$WITH_DOMAIN_ALIAS_SCOPE2:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[WITH_DOMAIN_ALIAS]], description = {{.*}}>70 71// CHECK-LABEL: llvm.func @callee_with_metadata(72// CHECK: llvm.load73// CHECK-SAME: noalias_scopes = [#[[$WITH_DOMAIN_SCOPE1]], #[[$WITH_DOMAIN_SCOPE2]]]74// CHECK: llvm.store75// CHECK-SAME: alias_scopes = [#[[$WITH_DOMAIN_SCOPE1]]]76// CHECK-SAME: noalias_scopes = [#[[$WITH_DOMAIN_SCOPE2]]]77// CHECK: llvm.store78// CHECK-SAME: alias_scopes = [#[[$WITH_DOMAIN_SCOPE2]]]79// CHECK-SAME: noalias_scopes = [#[[$WITH_DOMAIN_SCOPE1]]]80// CHECK: llvm.load81// CHECK-NOT: {{(no)?}}alias_scopes =82// CHECK: llvm.store83// CHECK-NOT: {{(no)?}}alias_scopes =84llvm.func @callee_with_metadata(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) {85 %0 = llvm.mlir.constant(5 : i64) : i6486 %1 = llvm.mlir.constant(8 : i64) : i6487 %2 = llvm.mlir.constant(7 : i64) : i6488 %3 = llvm.load %arg2 {alignment = 4 : i64, noalias_scopes = [#alias_scope, #alias_scope1]} : !llvm.ptr -> f3289 %4 = llvm.getelementptr inbounds %arg0[%0] : (!llvm.ptr, i64) -> !llvm.ptr, f3290 llvm.store %3, %4 {alias_scopes = [#alias_scope], alignment = 4 : i64, noalias_scopes = [#alias_scope1]} : f32, !llvm.ptr91 %5 = llvm.getelementptr inbounds %arg1[%1] : (!llvm.ptr, i64) -> !llvm.ptr, f3292 llvm.store %3, %5 {alias_scopes = [#alias_scope1], alignment = 4 : i64, noalias_scopes = [#alias_scope]} : f32, !llvm.ptr93 "test.one_region_op"() ({94 %6 = llvm.load %arg2 {alignment = 4 : i64} : !llvm.ptr -> f3295 %7 = llvm.getelementptr inbounds %arg0[%2] : (!llvm.ptr, i64) -> !llvm.ptr, f3296 llvm.store %6, %7 {alignment = 4 : i64} : f32, !llvm.ptr97 "test.terminator"() : () -> ()98 }) : () -> ()99 llvm.return100}101 102// CHECK-LABEL: llvm.func @callee_without_metadata(103// CHECK-NOT: {{(no)?}}alias_scopes =104 105llvm.func @callee_without_metadata(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) {106 %0 = llvm.mlir.constant(5 : i64) : i64107 %1 = llvm.mlir.constant(8 : i64) : i64108 %2 = llvm.mlir.constant(7 : i64) : i64109 %3 = llvm.load %arg2 {alignment = 4 : i64} : !llvm.ptr -> f32110 %4 = llvm.getelementptr inbounds %arg0[%0] : (!llvm.ptr, i64) -> !llvm.ptr, f32111 llvm.store %3, %4 {alignment = 4 : i64} : f32, !llvm.ptr112 %5 = llvm.getelementptr inbounds %arg1[%1] : (!llvm.ptr, i64) -> !llvm.ptr, f32113 llvm.store %3, %5 {alignment = 4 : i64} : f32, !llvm.ptr114 "test.one_region_op"() ({115 %6 = llvm.load %arg2 {alignment = 4 : i64} : !llvm.ptr -> f32116 %7 = llvm.getelementptr inbounds %arg0[%2] : (!llvm.ptr, i64) -> !llvm.ptr, f32117 llvm.store %6, %7 {alignment = 4 : i64} : f32, !llvm.ptr118 "test.terminator"() : () -> ()119 }) : () -> ()120 121 llvm.return122}123 124// CHECK-LABEL: llvm.func @caller(125// CHECK: llvm.load126// CHECK-SAME: alias_scopes = [#[[$CALL_DOMAIN_SCOPE]]]127// CHECK-NOT: noalias_scopes128 129// Inlining @callee_with_metadata with noalias_scopes.130 131// CHECK: llvm.load132// CHECK-SAME: noalias_scopes = [#[[$WITH_DOMAIN_NO_ALIAS_SCOPE1]], #[[$WITH_DOMAIN_NO_ALIAS_SCOPE2]], #[[$CALL_DOMAIN_SCOPE]]]133// CHECK: llvm.store134// CHECK-SAME: alias_scopes = [#[[$WITH_DOMAIN_NO_ALIAS_SCOPE1]]]135// CHECK-SAME: noalias_scopes = [#[[$WITH_DOMAIN_NO_ALIAS_SCOPE2]], #[[$CALL_DOMAIN_SCOPE]]]136// CHECK: llvm.store137// CHECK-SAME: alias_scopes = [#[[$WITH_DOMAIN_NO_ALIAS_SCOPE2]]]138// CHECK-SAME: noalias_scopes = [#[[$WITH_DOMAIN_NO_ALIAS_SCOPE1]], #[[$CALL_DOMAIN_SCOPE]]]139// CHECK: llvm.load140// CHECK-NOT: alias_scopes141// CHECK-SAME: noalias_scopes = [#[[$CALL_DOMAIN_SCOPE]]]142// CHECK: llvm.store143// CHECK-NOT: alias_scopes144// CHECK-SAME: noalias_scopes = [#[[$CALL_DOMAIN_SCOPE]]]145 146// Inlining @callee_with_metadata with alias_scopes.147 148// CHECK: llvm.load149// CHECK-SAME: alias_scopes = [#[[$CALL_DOMAIN_SCOPE]]]150// CHECK-SAME: noalias_scopes = [#[[$WITH_DOMAIN_ALIAS_SCOPE1]], #[[$WITH_DOMAIN_ALIAS_SCOPE2]]]151// CHECK: llvm.store152// CHECK-SAME: alias_scopes = [#[[$WITH_DOMAIN_ALIAS_SCOPE1]], #[[$CALL_DOMAIN_SCOPE]]]153// CHECK-SAME: noalias_scopes = [#[[$WITH_DOMAIN_ALIAS_SCOPE2]]]154// CHECK: llvm.store155// CHECK-SAME: alias_scopes = [#[[$WITH_DOMAIN_ALIAS_SCOPE2]], #[[$CALL_DOMAIN_SCOPE]]]156// CHECK-SAME: noalias_scopes = [#[[$WITH_DOMAIN_ALIAS_SCOPE1]]]157// CHECK: llvm.load158// CHECK-SAME: alias_scopes = [#[[$CALL_DOMAIN_SCOPE]]]159// CHECK-NOT: noalias_scopes160// CHECK: llvm.store161// CHECK-SAME: alias_scopes = [#[[$CALL_DOMAIN_SCOPE]]]162// CHECK-NOT: noalias_scopes163 164// Inlining @callee_without_metadata with noalias_scopes.165 166// CHECK: llvm.load167// CHECK-NOT: alias_scopes168// CHECK-SAME: noalias_scopes = [#[[$CALL_DOMAIN_SCOPE]]]169// CHECK: llvm.store170// CHECK-NOT: alias_scopes171// CHECK-SAME: noalias_scopes = [#[[$CALL_DOMAIN_SCOPE]]]172// CHECK: llvm.store173// CHECK-NOT: alias_scopes174// CHECK-SAME: noalias_scopes = [#[[$CALL_DOMAIN_SCOPE]]]175// CHECK: llvm.load176// CHECK-NOT: alias_scopes177// CHECK-SAME: noalias_scopes = [#[[$CALL_DOMAIN_SCOPE]]]178// CHECK: llvm.store179// CHECK-NOT: alias_scopes180// CHECK-SAME: noalias_scopes = [#[[$CALL_DOMAIN_SCOPE]]]181 182// Inlining @callee_without_metadata with alias_scopes.183 184// CHECK: llvm.load185// CHECK-SAME: alias_scopes = [#[[$CALL_DOMAIN_SCOPE]]]186// CHECK-NOT: noalias_scopes187// CHECK: llvm.store188// CHECK-SAME: alias_scopes = [#[[$CALL_DOMAIN_SCOPE]]]189// CHECK-NOT: noalias_scopes190// CHECK: llvm.store191// CHECK-SAME: alias_scopes = [#[[$CALL_DOMAIN_SCOPE]]]192// CHECK-NOT: noalias_scopes193// CHECK: llvm.load194// CHECK-SAME: alias_scopes = [#[[$CALL_DOMAIN_SCOPE]]]195// CHECK-NOT: noalias_scopes196// CHECK: llvm.store197// CHECK-SAME: alias_scopes = [#[[$CALL_DOMAIN_SCOPE]]]198// CHECK-NOT: noalias_scopes199 200llvm.func @caller(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) {201 %0 = llvm.load %arg2 {alias_scopes = [#alias_scope2], alignment = 8 : i64} : !llvm.ptr -> !llvm.ptr202 llvm.call @callee_with_metadata(%arg0, %arg1, %0) {noalias_scopes = [#alias_scope2]} : (!llvm.ptr, !llvm.ptr, !llvm.ptr) -> ()203 llvm.call @callee_with_metadata(%arg1, %arg1, %arg0) {alias_scopes = [#alias_scope2]} : (!llvm.ptr, !llvm.ptr, !llvm.ptr) -> ()204 llvm.call @callee_without_metadata(%arg0, %arg1, %0) {noalias_scopes = [#alias_scope2]} : (!llvm.ptr, !llvm.ptr, !llvm.ptr) -> ()205 llvm.call @callee_without_metadata(%arg1, %arg1, %arg0) {alias_scopes = [#alias_scope2]} : (!llvm.ptr, !llvm.ptr, !llvm.ptr) -> ()206 llvm.return207}208 209// -----210 211// CHECK-DAG: #[[DOMAIN:.*]] = #llvm.alias_scope_domain<{{.*}}>212// CHECK-DAG: #[[$ARG0_SCOPE:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[DOMAIN]]{{(,.*)?}}>213// CHECK-DAG: #[[$ARG1_SCOPE:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[DOMAIN]]{{(,.*)?}}>214 215llvm.func @foo(%arg0: !llvm.ptr {llvm.noalias}, %arg1: !llvm.ptr {llvm.noalias}) {216 %0 = llvm.mlir.constant(5 : i64) : i64217 %1 = llvm.load %arg1 {alignment = 4 : i64} : !llvm.ptr -> f32218 %2 = llvm.getelementptr inbounds %arg0[%0] : (!llvm.ptr, i64) -> !llvm.ptr, f32219 llvm.store %1, %2 {alignment = 4 : i64} : f32, !llvm.ptr220 llvm.return221}222 223// CHECK-LABEL: llvm.func @bar224// CHECK: llvm.load225// CHECK-SAME: alias_scopes = [#[[$ARG1_SCOPE]]]226// CHECK-SAME: noalias_scopes = [#[[$ARG0_SCOPE]]]227// CHECK: llvm.store228// CHECK-SAME: alias_scopes = [#[[$ARG0_SCOPE]]]229// CHECK-SAME: noalias_scopes = [#[[$ARG1_SCOPE]]]230llvm.func @bar(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) {231 llvm.call @foo(%arg0, %arg2) : (!llvm.ptr, !llvm.ptr) -> ()232 llvm.return233}234 235// -----236 237// CHECK-DAG: #[[DOMAIN:.*]] = #llvm.alias_scope_domain<{{.*}}>238// CHECK-DAG: #[[$ARG_SCOPE:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[DOMAIN]]{{(,.*)?}}>239 240llvm.func @foo(%arg0: !llvm.ptr {llvm.noalias}, %arg1: !llvm.ptr) {241 %0 = llvm.mlir.constant(5 : i64) : i64242 %1 = llvm.load %arg0 {alignment = 4 : i64} : !llvm.ptr -> f32243 %2 = llvm.getelementptr inbounds %arg1[%0] : (!llvm.ptr, i64) -> !llvm.ptr, f32244 llvm.store %1, %2 {alignment = 4 : i64} : f32, !llvm.ptr245 llvm.return246}247 248// CHECK-LABEL: llvm.func @missing_noalias_on_one_ptr249// CHECK: llvm.load250// CHECK-SAME: alias_scopes = [#[[$ARG_SCOPE]]]251// CHECK: llvm.store252// CHECK-SAME: noalias_scopes = [#[[$ARG_SCOPE]]]253llvm.func @missing_noalias_on_one_ptr(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) {254 llvm.call @foo(%arg0, %arg2) : (!llvm.ptr, !llvm.ptr) -> ()255 llvm.return256}257 258// -----259 260// CHECK-DAG: #[[DOMAIN:.*]] = #llvm.alias_scope_domain<{{.*}}>261// CHECK-DAG: #[[$ARG0_SCOPE:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[DOMAIN]]{{(,.*)?}}>262// CHECK-DAG: #[[$ARG1_SCOPE:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[DOMAIN]]{{(,.*)?}}>263 264llvm.func @might_return_arg_derived(!llvm.ptr) -> !llvm.ptr265 266llvm.func @foo(%arg0: !llvm.ptr {llvm.noalias}, %arg1: !llvm.ptr {llvm.noalias}) {267 %0 = llvm.mlir.constant(5 : i64) : i32268 %1 = llvm.call @might_return_arg_derived(%arg0) : (!llvm.ptr) -> !llvm.ptr269 llvm.store %0, %1 : i32, !llvm.ptr270 llvm.return271}272 273// CHECK-LABEL: llvm.func @bar274// CHECK: llvm.call275// CHECK-NOT: alias_scopes276// CHECK-SAME: noalias_scopes = [#[[$ARG1_SCOPE]]]277// CHECK: llvm.store278// CHECK-NOT: alias_scopes279// CHECK-NOT: noalias_scopes280llvm.func @bar(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) {281 llvm.call @foo(%arg0, %arg2) : (!llvm.ptr, !llvm.ptr) -> ()282 llvm.return283}284 285// -----286 287// CHECK-DAG: #[[DOMAIN:.*]] = #llvm.alias_scope_domain<{{.*}}>288// CHECK-DAG: #[[$ARG0_SCOPE:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[DOMAIN]]{{(,.*)?}}>289// CHECK-DAG: #[[$ARG1_SCOPE:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[DOMAIN]]{{(,.*)?}}>290 291llvm.func @random() -> i1292 293llvm.func @block_arg(%arg0: !llvm.ptr {llvm.noalias}, %arg1: !llvm.ptr {llvm.noalias}) {294 %0 = llvm.mlir.constant(5 : i64) : i32295 %1 = llvm.call @random() : () -> i1296 llvm.cond_br %1, ^bb0(%arg0 : !llvm.ptr), ^bb0(%arg1 : !llvm.ptr)297 298^bb0(%arg2: !llvm.ptr):299 llvm.store %0, %arg2 : i32, !llvm.ptr300 llvm.return301}302 303// CHECK-LABEL: llvm.func @bar304// CHECK: llvm.call305// CHECK-NOT: alias_scopes306// CHECK-SAME: noalias_scopes = [#[[$ARG0_SCOPE]], #[[$ARG1_SCOPE]]]307// CHECK: llvm.store308// CHECK: alias_scopes = [#[[$ARG0_SCOPE]], #[[$ARG1_SCOPE]]]309llvm.func @bar(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) {310 llvm.call @block_arg(%arg0, %arg2) : (!llvm.ptr, !llvm.ptr) -> ()311 llvm.return312}313 314// -----315 316// CHECK-DAG: #[[DOMAIN:.*]] = #llvm.alias_scope_domain<{{.*}}>317// CHECK-DAG: #[[$ARG0_SCOPE:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[DOMAIN]]{{(,.*)?}}>318// CHECK-DAG: #[[$ARG1_SCOPE:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[DOMAIN]]{{(,.*)?}}>319 320llvm.func @random() -> i1321 322llvm.func @region_branch(%arg0: !llvm.ptr {llvm.noalias}, %arg1: !llvm.ptr {llvm.noalias}) {323 %0 = llvm.mlir.constant(5 : i64) : i32324 test.region_if %arg0: !llvm.ptr -> !llvm.ptr then {325 ^bb0(%arg2: !llvm.ptr):326 test.region_if_yield %arg0 : !llvm.ptr327 } else {328 ^bb0(%arg2: !llvm.ptr):329 test.region_if_yield %arg0 : !llvm.ptr330 } join {331 ^bb0(%arg2: !llvm.ptr):332 llvm.store %0, %arg2 : i32, !llvm.ptr333 test.region_if_yield %arg0 : !llvm.ptr334 }335 llvm.return336}337 338// CHECK-LABEL: llvm.func @region_branch_inlining339// CHECK: llvm.store340// CHECK-SAME: alias_scopes = [#[[$ARG0_SCOPE]]]341// CHECK-SAME: noalias_scopes = [#[[$ARG1_SCOPE]]]342llvm.func @region_branch_inlining(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) {343 llvm.call @region_branch(%arg0, %arg2) : (!llvm.ptr, !llvm.ptr) -> ()344 llvm.return345}346 347// -----348 349llvm.func @missing_region_branch(%arg0: !llvm.ptr {llvm.noalias}, %arg1: !llvm.ptr {llvm.noalias}) {350 %0 = llvm.mlir.constant(5 : i64) : i32351 "test.one_region_op"() ({352 ^bb0(%arg2: !llvm.ptr):353 llvm.store %0, %arg2 : i32, !llvm.ptr354 "test.terminator"() : () -> ()355 }) : () -> ()356 llvm.return357}358 359// CHECK-LABEL: llvm.func @missing_region_branch_inlining360// CHECK: llvm.store361// CHECK-NOT: alias_scopes362// CHECK-NOT: noalias_scopes363llvm.func @missing_region_branch_inlining(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) {364 llvm.call @missing_region_branch(%arg0, %arg2) : (!llvm.ptr, !llvm.ptr) -> ()365 llvm.return366}367 368// -----369 370// CHECK-DAG: #[[DOMAIN:.*]] = #llvm.alias_scope_domain<{{.*}}>371// CHECK-DAG: #[[$ARG0_SCOPE:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[DOMAIN]]{{(,.*)?}}>372// CHECK-DAG: #[[$ARG1_SCOPE:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[DOMAIN]]{{(,.*)?}}>373 374llvm.func @random() -> i1375 376llvm.func @block_arg(%arg0: !llvm.ptr {llvm.noalias}, %arg1: !llvm.ptr {llvm.noalias}) {377 %0 = llvm.mlir.constant(5 : i64) : i32378 %1 = llvm.mlir.constant(1 : i64) : i64379 %2 = llvm.alloca %1 x i32 : (i64) -> !llvm.ptr380 %3 = llvm.call @random() : () -> i1381 llvm.cond_br %3, ^bb0(%arg0 : !llvm.ptr), ^bb0(%2 : !llvm.ptr)382 383^bb0(%arg2: !llvm.ptr):384 llvm.store %0, %arg2 : i32, !llvm.ptr385 llvm.return386}387 388// CHECK-LABEL: llvm.func @bar389// CHECK: llvm.call390// CHECK-NOT: alias_scopes391// CHECK-SAME: noalias_scopes = [#[[$ARG0_SCOPE]], #[[$ARG1_SCOPE]]]392// CHECK: llvm.store393// CHECK-NOT: alias_scopes394// CHECK-SAME: noalias_scopes = [#[[$ARG1_SCOPE]]]395llvm.func @bar(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) {396 llvm.call @block_arg(%arg0, %arg2) : (!llvm.ptr, !llvm.ptr) -> ()397 llvm.return398}399 400// -----401 402// CHECK-DAG: #[[DOMAIN:.*]] = #llvm.alias_scope_domain<{{.*}}>403// CHECK-DAG: #[[$ARG0_SCOPE:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[DOMAIN]]{{(,.*)?}}>404// CHECK-DAG: #[[$ARG1_SCOPE:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[DOMAIN]]{{(,.*)?}}>405 406llvm.func @unknown() -> !llvm.ptr407llvm.func @random() -> i1408 409llvm.func @unknown_object(%arg0: !llvm.ptr {llvm.noalias}, %arg1: !llvm.ptr {llvm.noalias}) {410 %0 = llvm.mlir.constant(5 : i64) : i32411 %1 = llvm.call @random() : () -> i1412 %2 = llvm.call @unknown() : () -> !llvm.ptr413 llvm.cond_br %1, ^bb0(%arg0 : !llvm.ptr), ^bb0(%2 : !llvm.ptr)414 415^bb0(%arg2: !llvm.ptr):416 llvm.store %0, %arg2 : i32, !llvm.ptr417 llvm.return418}419 420// CHECK-LABEL: llvm.func @bar421// CHECK: llvm.call422// CHECK-NOT: alias_scopes423// CHECK-SAME: noalias_scopes = [#[[$ARG0_SCOPE]], #[[$ARG1_SCOPE]]]424// CHECK: llvm.call425// CHECK-NOT: alias_scopes426// CHECK-SAME: noalias_scopes = [#[[$ARG0_SCOPE]], #[[$ARG1_SCOPE]]]427// CHECK: llvm.store428// CHECK-NOT: alias_scopes429// CHECK-NOT: noalias_scopes430llvm.func @bar(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) {431 llvm.call @unknown_object(%arg0, %arg2) : (!llvm.ptr, !llvm.ptr) -> ()432 llvm.return433}434 435// -----436 437// CHECK-DAG: #[[DOMAIN:.*]] = #llvm.alias_scope_domain<{{.*}}>438// CHECK-DAG: #[[$ARG0_SCOPE:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[DOMAIN]]{{(,.*)?}}>439// CHECK-DAG: #[[$ARG1_SCOPE:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[DOMAIN]]{{(,.*)?}}>440 441llvm.func @supported_operations(%arg0: !llvm.ptr {llvm.noalias}, %arg1: !llvm.ptr {llvm.noalias}) {442 %0 = llvm.mlir.constant(5 : i64) : i32443 llvm.store %0, %arg1 : i32, !llvm.ptr444 %1 = llvm.load %arg1 : !llvm.ptr -> i32445 "llvm.intr.memcpy"(%arg0, %arg1, %1) <{ isVolatile = false }> : (!llvm.ptr, !llvm.ptr, i32) -> ()446 "llvm.intr.memmove"(%arg0, %arg1, %1) <{ isVolatile = false }> : (!llvm.ptr, !llvm.ptr, i32) -> ()447 "llvm.intr.memcpy.inline"(%arg0, %arg1) <{ isVolatile = false, len = 4 : i32}> : (!llvm.ptr, !llvm.ptr) -> ()448 %2 = llvm.trunc %0 : i32 to i8449 "llvm.intr.memset"(%arg0, %2, %1) <{ isVolatile = false}> : (!llvm.ptr, i8, i32) -> ()450 %3 = llvm.cmpxchg %arg0, %0, %1 seq_cst seq_cst : !llvm.ptr, i32451 %4 = llvm.atomicrmw add %arg0, %0 seq_cst : !llvm.ptr, i32452 llvm.return453}454 455// CHECK-LABEL: llvm.func @bar456// CHECK: llvm.store457// CHECK-SAME: alias_scopes = [#[[$ARG1_SCOPE]]]458// CHECK-SAME: noalias_scopes = [#[[$ARG0_SCOPE]]]459// CHECK: llvm.load460// CHECK-SAME: alias_scopes = [#[[$ARG1_SCOPE]]]461// CHECK-SAME: noalias_scopes = [#[[$ARG0_SCOPE]]]462// CHECK: "llvm.intr.memcpy"463// CHECK-SAME: alias_scopes = [#[[$ARG0_SCOPE]], #[[$ARG1_SCOPE]]]464// CHECK-NOT: noalias_scopes465// CHECK: "llvm.intr.memmove"466// CHECK-SAME: alias_scopes = [#[[$ARG0_SCOPE]], #[[$ARG1_SCOPE]]]467// CHECK-NOT: noalias_scopes468// CHECK: "llvm.intr.memcpy.inline"469// CHECK-SAME: alias_scopes = [#[[$ARG0_SCOPE]], #[[$ARG1_SCOPE]]]470// CHECK-NOT: noalias_scopes471// CHECK: "llvm.intr.memset"472// CHECK-SAME: alias_scopes = [#[[$ARG0_SCOPE]]]473// CHECK-SAME: noalias_scopes = [#[[$ARG1_SCOPE]]]474// CHECK: llvm.cmpxchg475// CHECK-SAME: alias_scopes = [#[[$ARG0_SCOPE]]]476// CHECK-SAME: noalias_scopes = [#[[$ARG1_SCOPE]]]477// CHECK: llvm.atomicrmw478// CHECK-SAME: alias_scopes = [#[[$ARG0_SCOPE]]]479// CHECK-SAME: noalias_scopes = [#[[$ARG1_SCOPE]]]480llvm.func @bar(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) {481 llvm.call @supported_operations(%arg0, %arg2) : (!llvm.ptr, !llvm.ptr) -> ()482 llvm.return483}484 485// -----486 487// CHECK-DAG: #[[DOMAIN:.*]] = #llvm.alias_scope_domain<{{.*}}>488// CHECK-DAG: #[[$ARG_SCOPE:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[DOMAIN]]{{(,.*)?}}>489 490llvm.func @foo(%arg: i32)491 492llvm.func @region(%arg0: !llvm.ptr {llvm.noalias}) {493 "test.one_region_op"() ({494 %1 = llvm.load %arg0 : !llvm.ptr -> i32495 llvm.call @foo(%1) : (i32) -> ()496 "test.terminator"() : () -> ()497 }) : () -> ()498 llvm.return499}500 501// CHECK-LABEL: llvm.func @noalias_with_region502// CHECK: llvm.load503// CHECK-SAME: alias_scopes = [#[[$ARG_SCOPE]]]504// CHECK: llvm.call505// CHECK-NOT: alias_scopes506// CHECK-SAME: noalias_scopes = [#[[$ARG_SCOPE]]]507llvm.func @noalias_with_region(%arg0: !llvm.ptr) {508 llvm.call @region(%arg0) : (!llvm.ptr) -> ()509 llvm.return510}511 512// -----513 514// CHECK-DAG: #[[DOMAIN:.*]] = #llvm.alias_scope_domain<{{.*}}>515// CHECK-DAG: #[[$ARG_SCOPE:.*]] = #llvm.alias_scope<id = {{.*}}, domain = #[[DOMAIN]]{{(,.*)?}}>516 517llvm.func @foo(%arg: i32)518 519llvm.func @func(%arg0: !llvm.ptr {llvm.noalias}, %arg1: !llvm.ptr) {520 %cond = llvm.load %arg1 : !llvm.ptr -> i1521 %1 = llvm.getelementptr inbounds %arg0[1] : (!llvm.ptr) -> !llvm.ptr, f32522 %selected = llvm.select %cond, %arg0, %1 : i1, !llvm.ptr523 %2 = llvm.load %selected : !llvm.ptr -> i32524 llvm.call @foo(%2) : (i32) -> ()525 llvm.return526}527 528// CHECK-LABEL: llvm.func @selects529// CHECK: llvm.load530// CHECK-NOT: alias_scopes531// CHECK-SAME: noalias_scopes = [#[[$ARG_SCOPE]]]532// CHECK: llvm.load533// CHECK-SAME: alias_scopes = [#[[$ARG_SCOPE]]]534llvm.func @selects(%arg0: !llvm.ptr, %arg1: !llvm.ptr) {535 llvm.call @func(%arg0, %arg1) : (!llvm.ptr, !llvm.ptr) -> ()536 llvm.return537}538 539// -----540 541llvm.func @foo(%arg: i32)542 543llvm.func @func(%cond: i1, %arg0: !llvm.ptr {llvm.noalias}, %arg1: !llvm.ptr) {544 %selected = llvm.select %cond, %arg0, %arg1 : i1, !llvm.ptr545 %2 = llvm.load %selected : !llvm.ptr -> i32546 llvm.call @foo(%2) : (i32) -> ()547 llvm.return548}549 550// CHECK-LABEL: llvm.func @multi_ptr_select551// CHECK: llvm.load552// CHECK-NOT: alias_scopes553// CHECK-NOT: noalias_scopes554// CHECK: llvm.call @foo555llvm.func @multi_ptr_select(%cond: i1, %arg0: !llvm.ptr, %arg1: !llvm.ptr) {556 llvm.call @func(%cond, %arg0, %arg1) : (i1, !llvm.ptr, !llvm.ptr) -> ()557 llvm.return558}559