Now that getModRefInfo for calls handles read and write effects by examining both calls, the clobbering query no longer needs to treat reads as clobbers. Update the check to consider writes only, aligning call handling with other instructions
67 lines
1.6 KiB
LLVM
67 lines
1.6 KiB
LLVM
; RUN: opt -aa-pipeline=basic-aa -passes='print<memoryssa>,verify<memoryssa>' -disable-output < %s 2>&1 | FileCheck %s
|
|
;
|
|
; Ensuring that external functions without attributes are MemoryDefs
|
|
|
|
@g = external global i32
|
|
declare void @modifyG()
|
|
|
|
define i32 @foo(i1 %arg) {
|
|
; CHECK: MemoryUse(liveOnEntry)
|
|
; CHECK-NEXT: %1 = load i32
|
|
%1 = load i32, ptr @g
|
|
|
|
; CHECK: 1 = MemoryDef(liveOnEntry)
|
|
; CHECK-NEXT: store i32 4
|
|
store i32 4, ptr @g, align 4
|
|
|
|
; CHECK: 2 = MemoryDef(1)
|
|
; CHECK-NEXT: call void @modifyG()
|
|
call void @modifyG()
|
|
|
|
; CHECK: MemoryUse(2)
|
|
; CHECK-NEXT: %2 = load i32
|
|
%2 = load i32, ptr @g
|
|
%3 = add i32 %2, %1
|
|
ret i32 %3
|
|
}
|
|
|
|
declare void @readEverything() readonly
|
|
declare void @clobberEverything()
|
|
|
|
; CHECK-LABEL: define void @bar
|
|
define void @bar(i1 %arg) {
|
|
; CHECK: 1 = MemoryDef(liveOnEntry)
|
|
; CHECK-NEXT: call void @clobberEverything()
|
|
call void @clobberEverything()
|
|
br i1 %arg, label %if.end, label %if.then
|
|
|
|
if.then:
|
|
; CHECK: MemoryUse(1)
|
|
; CHECK-NEXT: call void @readEverything()
|
|
call void @readEverything()
|
|
; CHECK: 2 = MemoryDef(1)
|
|
; CHECK-NEXT: call void @clobberEverything()
|
|
call void @clobberEverything()
|
|
br label %if.end
|
|
|
|
if.end:
|
|
; CHECK: 3 = MemoryPhi({%0,1},{if.then,2})
|
|
; CHECK: MemoryUse(3)
|
|
; CHECK-NEXT: call void @readEverything()
|
|
call void @readEverything()
|
|
ret void
|
|
}
|
|
|
|
declare void @fn(ptr %p)
|
|
|
|
define void @baz(ptr %p) {
|
|
; CHECK: 1 = MemoryDef(liveOnEntry)
|
|
; CHECK-NEXT: call void @fn(ptr %p)
|
|
call void @fn(ptr %p) memory(argmem: read, inaccessiblemem: readwrite)
|
|
|
|
; CHECK: MemoryUse(liveOnEntry)
|
|
; CHECK-NEXT: call void @fn(ptr %p)
|
|
call void @fn(ptr %p) memory(argmem: read)
|
|
ret void
|
|
}
|