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