| ; 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 | 
 | } |