mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
aeeb963599
llvm.invariant.group.barrier may accept pointers to arbitrary address space. This patch let it accept pointers to i8 in any address space and returns pointer to i8 in the same address space. Differential Revision: https://reviews.llvm.org/D39973 llvm-svn: 318413
63 lines
2.0 KiB
LLVM
63 lines
2.0 KiB
LLVM
; RUN: opt -S -early-cse < %s | FileCheck %s
|
|
; RUN: opt -S -gvn < %s | FileCheck %s
|
|
; RUN: opt -S -newgvn < %s | FileCheck %s
|
|
; RUN: opt -S -O3 < %s | FileCheck %s
|
|
|
|
; These tests checks if passes with CSE functionality can do CSE on
|
|
; invariant.group.barrier, that is prohibited if there is a memory clobber
|
|
; between barriers call.
|
|
|
|
; CHECK-LABEL: define i8 @optimizable()
|
|
define i8 @optimizable() {
|
|
entry:
|
|
%ptr = alloca i8
|
|
store i8 42, i8* %ptr, !invariant.group !0
|
|
; CHECK: call i8* @llvm.invariant.group.barrier.p0i8
|
|
%ptr2 = call i8* @llvm.invariant.group.barrier.p0i8(i8* %ptr)
|
|
; CHECK-NOT: call i8* @llvm.invariant.group.barrier.p0i8
|
|
%ptr3 = call i8* @llvm.invariant.group.barrier.p0i8(i8* %ptr)
|
|
; CHECK: call void @clobber(i8* {{.*}}%ptr)
|
|
call void @clobber(i8* %ptr)
|
|
|
|
; CHECK: call void @use(i8* {{.*}}%ptr2)
|
|
call void @use(i8* %ptr2)
|
|
; CHECK: call void @use(i8* {{.*}}%ptr2)
|
|
call void @use(i8* %ptr3)
|
|
; CHECK: load i8, i8* %ptr2, {{.*}}!invariant.group
|
|
%v = load i8, i8* %ptr3, !invariant.group !0
|
|
|
|
ret i8 %v
|
|
}
|
|
|
|
; CHECK-LABEL: define i8 @unoptimizable()
|
|
define i8 @unoptimizable() {
|
|
entry:
|
|
%ptr = alloca i8
|
|
store i8 42, i8* %ptr, !invariant.group !0
|
|
; CHECK: call i8* @llvm.invariant.group.barrier.p0i8
|
|
%ptr2 = call i8* @llvm.invariant.group.barrier.p0i8(i8* %ptr)
|
|
call void @clobber(i8* %ptr)
|
|
; CHECK: call i8* @llvm.invariant.group.barrier.p0i8
|
|
%ptr3 = call i8* @llvm.invariant.group.barrier.p0i8(i8* %ptr)
|
|
; CHECK: call void @clobber(i8* {{.*}}%ptr)
|
|
call void @clobber(i8* %ptr)
|
|
; CHECK: call void @use(i8* {{.*}}%ptr2)
|
|
call void @use(i8* %ptr2)
|
|
; CHECK: call void @use(i8* {{.*}}%ptr3)
|
|
call void @use(i8* %ptr3)
|
|
; CHECK: load i8, i8* %ptr3, {{.*}}!invariant.group
|
|
%v = load i8, i8* %ptr3, !invariant.group !0
|
|
|
|
ret i8 %v
|
|
}
|
|
|
|
declare void @use(i8* readonly)
|
|
|
|
declare void @clobber(i8*)
|
|
; CHECK: Function Attrs: argmemonly nounwind readonly
|
|
; CHECK-NEXT: declare i8* @llvm.invariant.group.barrier.p0i8(i8*)
|
|
declare i8* @llvm.invariant.group.barrier.p0i8(i8*)
|
|
|
|
!0 = !{}
|
|
|