Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions llvm/lib/Analysis/ConstantFolding.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -432,6 +432,10 @@ bool ReadDataFromGlobal(Constant *C, uint64_t ByteOffset, unsigned char *CurPtr,
assert(ByteOffset <= DL.getTypeAllocSize(C->getType()) &&
"Out of range access");

// Trying to read type padding.
if (ByteOffset >= DL.getTypeStoreSize(C->getType()))
return false;

// If this element is zero or undefined, we can just return since *CurPtr is
// zero initialized.
if (isa<ConstantAggregateZero>(C) || isa<UndefValue>(C))
Expand Down
38 changes: 38 additions & 0 deletions llvm/test/Transforms/InstSimplify/ConstProp/loads.ll
Original file line number Diff line number Diff line change
Expand Up @@ -441,3 +441,41 @@ define i128 @load-128bit(){
%1 = load i128, ptr @global128, align 4
ret i128 %1
}


@i40_struct = constant { i40, i8 } { i40 0, i8 1 }
@i40_array = constant [2 x i40] [i40 0, i40 1]

define i8 @load_i40_struct_padding() {
; CHECK-LABEL: @load_i40_struct_padding(
; CHECK-NEXT: [[V:%.*]] = load i8, ptr getelementptr (i8, ptr @i40_struct, i64 6), align 1
; CHECK-NEXT: ret i8 [[V]]
;
%v = load i8, ptr getelementptr (i8, ptr @i40_struct, i64 6)
ret i8 %v
}

define i16 @load_i40_struct_partial_padding() {
; CHECK-LABEL: @load_i40_struct_partial_padding(
; CHECK-NEXT: ret i16 0
;
%v = load i16, ptr getelementptr (i8, ptr @i40_struct, i64 4)
ret i16 %v
}

define i8 @load_i40_array_padding() {
; CHECK-LABEL: @load_i40_array_padding(
; CHECK-NEXT: [[V:%.*]] = load i8, ptr getelementptr (i8, ptr @i40_array, i64 6), align 1
; CHECK-NEXT: ret i8 [[V]]
;
%v = load i8, ptr getelementptr (i8, ptr @i40_array, i64 6)
ret i8 %v
}

define i16 @load_i40_array_partial_padding() {
; CHECK-LABEL: @load_i40_array_partial_padding(
; CHECK-NEXT: ret i16 0
;
%v = load i16, ptr getelementptr (i8, ptr @i40_array, i64 4)
ret i16 %v
}
Loading