mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
Reapply [ConstantFold] Handle vectors in ConstantFoldLoadThroughBitcast()
There seems to be an impedance mismatch between what the type system considers an aggregate (structs and arrays) and what constants consider an aggregate (structs, arrays and vectors). Adjust the type check to consider vectors as well. The previous version of the patch dropped the type check entirely, but it turns out that getAggregateElement() does require the constant to be an aggregate in some edge cases: For Poison/Undef the getNumElements() API is called, without checking in advance that we're dealing with an aggregate. Possibly the implementation should avoid doing that, but for now I'm adding an assert so the next person doesn't fall into this trap.
This commit is contained in:
parent
b3cc8585de
commit
4766db4e38
@ -389,7 +389,7 @@ Constant *llvm::ConstantFoldLoadThroughBitcast(Constant *C, Type *DestTy,
|
||||
|
||||
// If this isn't an aggregate type, there is nothing we can do to drill down
|
||||
// and find a bitcastable constant.
|
||||
if (!SrcTy->isAggregateType())
|
||||
if (!SrcTy->isAggregateType() && !SrcTy->isVectorTy())
|
||||
return nullptr;
|
||||
|
||||
// We're simulating a load through a pointer that was bitcast to point to
|
||||
|
@ -419,6 +419,9 @@ Constant *Constant::getAllOnesValue(Type *Ty) {
|
||||
}
|
||||
|
||||
Constant *Constant::getAggregateElement(unsigned Elt) const {
|
||||
assert((getType()->isAggregateType() || getType()->isVectorTy()) &&
|
||||
"Must be an aggregate/vector constant");
|
||||
|
||||
if (const auto *CC = dyn_cast<ConstantAggregate>(this))
|
||||
return Elt < CC->getNumOperands() ? CC->getOperand(Elt) : nullptr;
|
||||
|
||||
|
@ -213,14 +213,12 @@ entry:
|
||||
ret i64 addrspace(4)* %ref
|
||||
}
|
||||
|
||||
; TODO: missed optimization
|
||||
define i8 addrspace(4)* @forward_memcopy(i8 addrspace(4)* addrspace(4)* %loc) {
|
||||
; CHECK-LABEL: @forward_memcopy(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[LOC_BC:%.*]] = bitcast i8 addrspace(4)* addrspace(4)* [[LOC:%.*]] to i8 addrspace(4)*
|
||||
; CHECK-NEXT: call void @llvm.memcpy.p4i8.p0i8.i64(i8 addrspace(4)* align 4 [[LOC_BC]], i8* bitcast (<4 x i64 addrspace(4)*>* @NonZeroConstant2 to i8*), i64 8, i1 false)
|
||||
; CHECK-NEXT: [[REF:%.*]] = load i8 addrspace(4)*, i8 addrspace(4)* addrspace(4)* [[LOC]], align 8
|
||||
; CHECK-NEXT: ret i8 addrspace(4)* [[REF]]
|
||||
; CHECK-NEXT: ret i8 addrspace(4)* bitcast (i64 addrspace(4)* getelementptr (i64, i64 addrspace(4)* null, i32 3) to i8 addrspace(4)*)
|
||||
;
|
||||
entry:
|
||||
%loc.bc = bitcast i8 addrspace(4)* addrspace(4)* %loc to i8 addrspace(4)*
|
||||
|
@ -213,14 +213,12 @@ entry:
|
||||
ret i64 addrspace(4)* %ref
|
||||
}
|
||||
|
||||
; TODO: missed optimization
|
||||
define i8 addrspace(4)* @forward_memcopy(i8 addrspace(4)* addrspace(4)* %loc) {
|
||||
; CHECK-LABEL: @forward_memcopy(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[LOC_BC:%.*]] = bitcast i8 addrspace(4)* addrspace(4)* [[LOC:%.*]] to i8 addrspace(4)*
|
||||
; CHECK-NEXT: call void @llvm.memcpy.p4i8.p0i8.i64(i8 addrspace(4)* align 4 [[LOC_BC]], i8* bitcast (<4 x i64 addrspace(4)*>* @NonZeroConstant2 to i8*), i64 8, i1 false)
|
||||
; CHECK-NEXT: [[REF:%.*]] = load i8 addrspace(4)*, i8 addrspace(4)* addrspace(4)* [[LOC]], align 8
|
||||
; CHECK-NEXT: ret i8 addrspace(4)* [[REF]]
|
||||
; CHECK-NEXT: ret i8 addrspace(4)* bitcast (i64 addrspace(4)* getelementptr (i64, i64 addrspace(4)* null, i32 3) to i8 addrspace(4)*)
|
||||
;
|
||||
entry:
|
||||
%loc.bc = bitcast i8 addrspace(4)* addrspace(4)* %loc to i8 addrspace(4)*
|
||||
|
Loading…
Reference in New Issue
Block a user