forked from OSchip/llvm-project
[GVN] Fix a non-integral pointer bug w/vector types
GVN generally doesn't forward structs or array types, but it *will* forward vector types to non-vectors and vice versa. As demonstrated in tests, we need to inhibit the same set of transforms for vector of non-integral pointers as for non-integral pointers themselves. llvm-svn: 354401
This commit is contained in:
parent
ee04d4d840
commit
322eb7660e
|
@ -31,8 +31,8 @@ bool canCoerceMustAliasedValueToLoad(Value *StoredVal, Type *LoadTy,
|
|||
return false;
|
||||
|
||||
// Don't coerce non-integral pointers to integers or vice versa.
|
||||
if (DL.isNonIntegralPointerType(StoredVal->getType()) !=
|
||||
DL.isNonIntegralPointerType(LoadTy)) {
|
||||
if (DL.isNonIntegralPointerType(StoredVal->getType()->getScalarType()) !=
|
||||
DL.isNonIntegralPointerType(LoadTy->getScalarType())) {
|
||||
// As a special case, allow coercion of memset used to initialize
|
||||
// an array w/null. Despite non-integral pointers not generally having a
|
||||
// specific bit pattern, we do assume null is zero.
|
||||
|
|
|
@ -77,6 +77,22 @@ define i8 addrspace(4)* @neg_forward_memset(i8 addrspace(4)* addrspace(4)* %loc)
|
|||
ret i8 addrspace(4)* %ref
|
||||
}
|
||||
|
||||
define <1 x i8 addrspace(4)*> @neg_forward_memset_vload(<1 x i8 addrspace(4)*> addrspace(4)* %loc) {
|
||||
; CHECK-LABEL: @neg_forward_memset_vload(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[LOC_BC:%.*]] = bitcast <1 x i8 addrspace(4)*> addrspace(4)* [[LOC:%.*]] to i8 addrspace(4)*
|
||||
; CHECK-NEXT: call void @llvm.memset.p4i8.i64(i8 addrspace(4)* align 4 [[LOC_BC]], i8 7, i64 8, i1 false)
|
||||
; CHECK-NEXT: [[REF:%.*]] = load <1 x i8 addrspace(4)*>, <1 x i8 addrspace(4)*> addrspace(4)* [[LOC]]
|
||||
; CHECK-NEXT: ret <1 x i8 addrspace(4)*> [[REF]]
|
||||
;
|
||||
entry:
|
||||
%loc.bc = bitcast <1 x i8 addrspace(4)*> addrspace(4)* %loc to i8 addrspace(4)*
|
||||
call void @llvm.memset.p4i8.i64(i8 addrspace(4)* align 4 %loc.bc, i8 7, i64 8, i1 false)
|
||||
%ref = load <1 x i8 addrspace(4)*>, <1 x i8 addrspace(4)*> addrspace(4)* %loc
|
||||
ret <1 x i8 addrspace(4)*> %ref
|
||||
}
|
||||
|
||||
|
||||
; Can forward since we can do so w/o breaking types
|
||||
define i8 addrspace(4)* @forward_memset_zero(i8 addrspace(4)* addrspace(4)* %loc) {
|
||||
; CHECK-LABEL: @forward_memset_zero(
|
||||
|
@ -108,6 +124,21 @@ define i8 addrspace(4)* @neg_forward_store(i8 addrspace(4)* addrspace(4)* %loc)
|
|||
ret i8 addrspace(4)* %ref
|
||||
}
|
||||
|
||||
define <1 x i8 addrspace(4)*> @neg_forward_store_vload(<1 x i8 addrspace(4)*> addrspace(4)* %loc) {
|
||||
; CHECK-LABEL: @neg_forward_store_vload(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[LOC_BC:%.*]] = bitcast <1 x i8 addrspace(4)*> addrspace(4)* [[LOC:%.*]] to i64 addrspace(4)*
|
||||
; CHECK-NEXT: store i64 5, i64 addrspace(4)* [[LOC_BC]]
|
||||
; CHECK-NEXT: [[REF:%.*]] = load <1 x i8 addrspace(4)*>, <1 x i8 addrspace(4)*> addrspace(4)* [[LOC]]
|
||||
; CHECK-NEXT: ret <1 x i8 addrspace(4)*> [[REF]]
|
||||
;
|
||||
entry:
|
||||
%loc.bc = bitcast <1 x i8 addrspace(4)*> addrspace(4)* %loc to i64 addrspace(4)*
|
||||
store i64 5, i64 addrspace(4)* %loc.bc
|
||||
%ref = load <1 x i8 addrspace(4)*>, <1 x i8 addrspace(4)*> addrspace(4)* %loc
|
||||
ret <1 x i8 addrspace(4)*> %ref
|
||||
}
|
||||
|
||||
; TODO: missed optimization, we can forward the null.
|
||||
define i8 addrspace(4)* @forward_store_zero(i8 addrspace(4)* addrspace(4)* %loc) {
|
||||
; CHECK-LABEL: @forward_store_zero(
|
||||
|
|
Loading…
Reference in New Issue