104 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -S -passes=inline %s | FileCheck %s3 4declare ptr @get_ptr()5declare void @capture(ptr)6 7define void @callee_no_capture(ptr noalias %p) {8; CHECK-LABEL: define void @callee_no_capture(9; CHECK-SAME: ptr noalias [[P:%.*]]) {10; CHECK-NEXT: [[P2:%.*]] = call ptr @get_ptr()11; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[P]], align 412; CHECK-NEXT: store i32 [[V]], ptr [[P2]], align 413; CHECK-NEXT: ret void14;15 %p2 = call ptr @get_ptr()16 %v = load i32, ptr %p17 store i32 %v, ptr %p218 ret void19}20 21define void @test_no_capture(ptr %p) {22; CHECK-LABEL: define void @test_no_capture(23; CHECK-SAME: ptr [[P:%.*]]) {24; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META0:![0-9]+]])25; CHECK-NEXT: [[P2_I:%.*]] = call ptr @get_ptr(), !noalias [[META0]]26; CHECK-NEXT: [[V_I:%.*]] = load i32, ptr [[P]], align 4, !alias.scope [[META0]]27; CHECK-NEXT: store i32 [[V_I]], ptr [[P2_I]], align 4, !noalias [[META0]]28; CHECK-NEXT: ret void29;30 call void @callee_no_capture(ptr %p)31 ret void32}33 34define void @callee_capture(ptr noalias %p) {35; CHECK-LABEL: define void @callee_capture(36; CHECK-SAME: ptr noalias [[P:%.*]]) {37; CHECK-NEXT: call void @capture(ptr [[P]])38; CHECK-NEXT: [[P2:%.*]] = call ptr @get_ptr()39; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[P]], align 440; CHECK-NEXT: store i32 [[V]], ptr [[P2]], align 441; CHECK-NEXT: ret void42;43 call void @capture(ptr %p)44 %p2 = call ptr @get_ptr()45 %v = load i32, ptr %p46 store i32 %v, ptr %p247 ret void48}49 50define void @test_capture(ptr %p) {51; CHECK-LABEL: define void @test_capture(52; CHECK-SAME: ptr [[P:%.*]]) {53; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META3:![0-9]+]])54; CHECK-NEXT: call void @capture(ptr [[P]])55; CHECK-NEXT: [[P2_I:%.*]] = call ptr @get_ptr()56; CHECK-NEXT: [[V_I:%.*]] = load i32, ptr [[P]], align 4, !alias.scope [[META3]]57; CHECK-NEXT: store i32 [[V_I]], ptr [[P2_I]], align 458; CHECK-NEXT: ret void59;60 call void @callee_capture(ptr %p)61 ret void62}63 64define void @callee_addr_only_capture(ptr noalias %p) {65; CHECK-LABEL: define void @callee_addr_only_capture(66; CHECK-SAME: ptr noalias [[P:%.*]]) {67; CHECK-NEXT: call void @capture(ptr captures(address) [[P]])68; CHECK-NEXT: [[P2:%.*]] = call ptr @get_ptr()69; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[P]], align 470; CHECK-NEXT: store i32 [[V]], ptr [[P2]], align 471; CHECK-NEXT: ret void72;73 call void @capture(ptr captures(address) %p)74 %p2 = call ptr @get_ptr()75 %v = load i32, ptr %p76 store i32 %v, ptr %p277 ret void78}79 80define void @test_addr_only_capture(ptr %p) {81; CHECK-LABEL: define void @test_addr_only_capture(82; CHECK-SAME: ptr [[P:%.*]]) {83; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META6:![0-9]+]])84; CHECK-NEXT: call void @capture(ptr captures(address) [[P]])85; CHECK-NEXT: [[P2_I:%.*]] = call ptr @get_ptr(), !noalias [[META6]]86; CHECK-NEXT: [[V_I:%.*]] = load i32, ptr [[P]], align 4, !alias.scope [[META6]]87; CHECK-NEXT: store i32 [[V_I]], ptr [[P2_I]], align 4, !noalias [[META6]]88; CHECK-NEXT: ret void89;90 call void @callee_addr_only_capture(ptr %p)91 ret void92}93;.94; CHECK: [[META0]] = !{[[META1:![0-9]+]]}95; CHECK: [[META1]] = distinct !{[[META1]], [[META2:![0-9]+]], !"callee_no_capture: %p"}96; CHECK: [[META2]] = distinct !{[[META2]], !"callee_no_capture"}97; CHECK: [[META3]] = !{[[META4:![0-9]+]]}98; CHECK: [[META4]] = distinct !{[[META4]], [[META5:![0-9]+]], !"callee_capture: %p"}99; CHECK: [[META5]] = distinct !{[[META5]], !"callee_capture"}100; CHECK: [[META6]] = !{[[META7:![0-9]+]]}101; CHECK: [[META7]] = distinct !{[[META7]], [[META8:![0-9]+]], !"callee_addr_only_capture: %p"}102; CHECK: [[META8]] = distinct !{[[META8]], !"callee_addr_only_capture"}103;.104