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