1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-22 04:22:57 +02:00
llvm-mirror/test/Transforms/LICM/argmemonly-call.ll
Philip Reames 90a34e4908 [LICM] Hoist calls to readonly argmemonly functions even with stores in the loop
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
2015-09-21 22:27:59 +00:00

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
}