1; RUN: opt -aa-pipeline=basic-aa -passes='print<memoryssa>,verify<memoryssa>' -disable-output < %s 2>&1 | FileCheck %s 2; 3; Test that various function attributes give us sane results. 4 5@g = external global i32 6 7declare void @readonlyFunction() readonly 8declare void @noattrsFunction() 9 10define void @readonlyAttr() { 11; CHECK: 1 = MemoryDef(liveOnEntry) 12; CHECK-NEXT: store i32 0 13 store i32 0, ptr @g, align 4 14 15 %1 = alloca i32, align 4 16; CHECK: 2 = MemoryDef(1) 17; CHECK-NEXT: store i32 0 18 store i32 0, ptr %1, align 4 19 20; CHECK: MemoryUse(1) 21; CHECK-NEXT: call void @readonlyFunction() 22 call void @readonlyFunction() 23 24; CHECK: MemoryUse(1) 25; CHECK-NEXT: call void @noattrsFunction() # 26; Assume that #N is readonly 27 call void @noattrsFunction() readonly 28 29 ; Verify that noattrsFunction is otherwise a MemoryDef 30; CHECK: 3 = MemoryDef(2) 31; CHECK-NEXT: call void @noattrsFunction() 32 call void @noattrsFunction() 33 ret void 34} 35 36declare void @argMemOnly(ptr) argmemonly 37 38define void @inaccessableOnlyAttr() { 39 %1 = alloca i32, align 4 40; CHECK: 1 = MemoryDef(liveOnEntry) 41; CHECK-NEXT: store i32 0 42 store i32 0, ptr %1, align 4 43 44; CHECK: 2 = MemoryDef(1) 45; CHECK-NEXT: store i32 0 46 store i32 0, ptr @g, align 4 47 48; CHECK: MemoryUse(1) 49; CHECK-NEXT: call void @argMemOnly(ptr %1) # 50; Assume that #N is readonly 51 call void @argMemOnly(ptr %1) readonly 52 53; CHECK: 3 = MemoryDef(2) 54; CHECK-NEXT: call void @argMemOnly(ptr %1) 55 call void @argMemOnly(ptr %1) 56 57 ret void 58} 59