Skip to content

Commit edf7004

Browse files
committed
[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). Rather than adjusting the type check, simply drop it entirely, as getAggregateElement() is well-defined for non-aggregates: It simply returns null in that case.
1 parent be58465 commit edf7004

File tree

3 files changed

+2
-11
lines changed

3 files changed

+2
-11
lines changed

llvm/lib/Analysis/ConstantFolding.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -387,11 +387,6 @@ Constant *llvm::ConstantFoldLoadThroughBitcast(Constant *C, Type *DestTy,
387387
return ConstantExpr::getCast(Cast, C, DestTy);
388388
}
389389

390-
// If this isn't an aggregate type, there is nothing we can do to drill down
391-
// and find a bitcastable constant.
392-
if (!SrcTy->isAggregateType())
393-
return nullptr;
394-
395390
// We're simulating a load through a pointer that was bitcast to point to
396391
// a different type, so we can try to walk down through the initial
397392
// elements of an aggregate to see if some part of the aggregate is

llvm/test/Transforms/GVN/non-integral-pointers-inseltpoison.ll

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -213,14 +213,12 @@ entry:
213213
ret i64 addrspace(4)* %ref
214214
}
215215

216-
; TODO: missed optimization
217216
define i8 addrspace(4)* @forward_memcopy(i8 addrspace(4)* addrspace(4)* %loc) {
218217
; CHECK-LABEL: @forward_memcopy(
219218
; CHECK-NEXT: entry:
220219
; CHECK-NEXT: [[LOC_BC:%.*]] = bitcast i8 addrspace(4)* addrspace(4)* [[LOC:%.*]] to i8 addrspace(4)*
221220
; 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)
222-
; CHECK-NEXT: [[REF:%.*]] = load i8 addrspace(4)*, i8 addrspace(4)* addrspace(4)* [[LOC]], align 8
223-
; CHECK-NEXT: ret i8 addrspace(4)* [[REF]]
221+
; CHECK-NEXT: ret i8 addrspace(4)* bitcast (i64 addrspace(4)* getelementptr (i64, i64 addrspace(4)* null, i32 3) to i8 addrspace(4)*)
224222
;
225223
entry:
226224
%loc.bc = bitcast i8 addrspace(4)* addrspace(4)* %loc to i8 addrspace(4)*

llvm/test/Transforms/GVN/non-integral-pointers.ll

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -213,14 +213,12 @@ entry:
213213
ret i64 addrspace(4)* %ref
214214
}
215215

216-
; TODO: missed optimization
217216
define i8 addrspace(4)* @forward_memcopy(i8 addrspace(4)* addrspace(4)* %loc) {
218217
; CHECK-LABEL: @forward_memcopy(
219218
; CHECK-NEXT: entry:
220219
; CHECK-NEXT: [[LOC_BC:%.*]] = bitcast i8 addrspace(4)* addrspace(4)* [[LOC:%.*]] to i8 addrspace(4)*
221220
; 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)
222-
; CHECK-NEXT: [[REF:%.*]] = load i8 addrspace(4)*, i8 addrspace(4)* addrspace(4)* [[LOC]], align 8
223-
; CHECK-NEXT: ret i8 addrspace(4)* [[REF]]
221+
; CHECK-NEXT: ret i8 addrspace(4)* bitcast (i64 addrspace(4)* getelementptr (i64, i64 addrspace(4)* null, i32 3) to i8 addrspace(4)*)
224222
;
225223
entry:
226224
%loc.bc = bitcast i8 addrspace(4)* addrspace(4)* %loc to i8 addrspace(4)*

0 commit comments

Comments
 (0)