; RUN: opt < %s -passes=aa-eval -print-all-alias-modref-info 2>&1 | FileCheck %s @c = constant [8 x i32] zeroinitializer declare void @dummy() declare void @foo(ptr) ; CHECK-LABEL: Function: basic ; CHECK: NoModRef: Ptr: i32* @c <-> call void @dummy() define void @basic(ptr %p) { call void @dummy() load i32, ptr @c ret void } ; CHECK-LABEL: Function: recphi ; CHECK: NoModRef: Ptr: i32* %p <-> call void @dummy() define void @recphi() { entry: br label %loop loop: %p = phi ptr [ @c, %entry ], [ %p.next, %loop ] call void @dummy() load i32, ptr %p %p.next = getelementptr i32, ptr %p, i64 1 %c = icmp ne ptr %p.next, getelementptr (i32, ptr @c, i64 8) br i1 %c, label %loop, label %exit exit: ret void } ; Tests that readonly noalias implies !Mod. ; ; CHECK-LABEL: Function: readonly_noalias ; CHECK: Just Ref: Ptr: i32* %p <-> call void @foo(ptr %p) define void @readonly_noalias(ptr readonly noalias %p) { call void @foo(ptr %p) load i32, ptr %p ret void } ; Tests that readnone noalias implies !Mod. ; ; CHECK-LABEL: Function: readnone_noalias ; CHECK: Just Ref: Ptr: i32* %p <-> call void @foo(ptr %p) define void @readnone_noalias(ptr readnone noalias %p) { call void @foo(ptr %p) load i32, ptr %p ret void } ; Tests that writeonly noalias doesn't imply !Ref (since it's still possible ; to read from the object through other pointers if the pointer wasn't ; written). ; ; CHECK-LABEL: Function: writeonly_noalias ; CHECK: Both ModRef: Ptr: i32* %p <-> call void @foo(ptr %p) define void @writeonly_noalias(ptr writeonly noalias %p) { call void @foo(ptr %p) load i32, ptr %p ret void } ; Tests that readonly doesn't imply !Mod without noalias. ; ; CHECK-LABEL: Function: just_readonly ; CHECK: Both ModRef: Ptr: i32* %p <-> call void @foo(ptr %p) define void @just_readonly(ptr readonly %p) { call void @foo(ptr %p) load i32, ptr %p ret void } ; Tests that readnone doesn't imply !Mod without noalias. ; ; CHECK-LABEL: Function: just_readnone ; CHECK: Both ModRef: Ptr: i32* %p <-> call void @foo(ptr %p) define void @just_readnone(ptr readnone %p) { call void @foo(ptr %p) load i32, ptr %p ret void } ; Tests that writeonly doesn't imply !Ref. ; ; CHECK-LABEL: Function: just_writeonly ; CHECK: Both ModRef: Ptr: i32* %p <-> call void @foo(ptr %p) define void @just_writeonly(ptr writeonly %p) { call void @foo(ptr %p) load i32, ptr %p ret void }