llvm-project/llvm/test/Analysis/MemorySSA/function-clobber.ll
CarolineConcatto 570fffe044
[MemorySSA] Relax clobbering checks for calls to consider writes only (#179721)
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
2026-02-10 09:19:01 +00:00

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
}