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