mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-24 13:33:37 +02:00
90a34e4908
We know that an argmemonly function can only access memory pointed to by it's pointer arguments. Rather than needing to consider all possible stores as aliasing (as we do for a readonly function), we can only consider the aliasing of the pointer arguments. Note that this change only addresses hoisting. I'm thinking about how to address speculation safety as well, but that will be a different change. FYI, argmemonly disallows accessing memory through non-pointer typed arguments. Differential Revision: http://reviews.llvm.org/D12771 llvm-svn: 248220
70 lines
1.3 KiB
LLVM
70 lines
1.3 KiB
LLVM
; RUN: opt -S -basicaa -licm %s | FileCheck %s
|
|
declare i32 @foo() readonly argmemonly nounwind
|
|
declare i32 @foo2() readonly nounwind
|
|
declare i32 @bar(i32* %loc2) readonly argmemonly nounwind
|
|
|
|
define void @test(i32* %loc) {
|
|
; CHECK-LABEL: @test
|
|
; CHECK: @foo
|
|
; CHECK-LABEL: loop:
|
|
br label %loop
|
|
|
|
loop:
|
|
%res = call i32 @foo()
|
|
store i32 %res, i32* %loc
|
|
br label %loop
|
|
}
|
|
|
|
; Negative test: show argmemonly is required
|
|
define void @test_neg(i32* %loc) {
|
|
; CHECK-LABEL: @test_neg
|
|
; CHECK-LABEL: loop:
|
|
; CHECK: @foo
|
|
br label %loop
|
|
|
|
loop:
|
|
%res = call i32 @foo2()
|
|
store i32 %res, i32* %loc
|
|
br label %loop
|
|
}
|
|
|
|
define void @test2(i32* noalias %loc, i32* noalias %loc2) {
|
|
; CHECK-LABEL: @test2
|
|
; CHECK: @bar
|
|
; CHECK-LABEL: loop:
|
|
br label %loop
|
|
|
|
loop:
|
|
%res = call i32 @bar(i32* %loc2)
|
|
store i32 %res, i32* %loc
|
|
br label %loop
|
|
}
|
|
|
|
; Negative test: %might clobber gep
|
|
define void @test3(i32* %loc) {
|
|
; CHECK-LABEL: @test3
|
|
; CHECK-LABEL: loop:
|
|
; CHECK: @bar
|
|
br label %loop
|
|
|
|
loop:
|
|
%res = call i32 @bar(i32* %loc)
|
|
%gep = getelementptr i32, i32 *%loc, i64 1000000
|
|
store i32 %res, i32* %gep
|
|
br label %loop
|
|
}
|
|
|
|
|
|
; Negative test: %loc might alias %loc2
|
|
define void @test4(i32* %loc, i32* %loc2) {
|
|
; CHECK-LABEL: @test4
|
|
; CHECK-LABEL: loop:
|
|
; CHECK: @bar
|
|
br label %loop
|
|
|
|
loop:
|
|
%res = call i32 @bar(i32* %loc2)
|
|
store i32 %res, i32* %loc
|
|
br label %loop
|
|
}
|