Skip to content
Snippets Groups Projects
Commit 930a6876 authored by Nikita Popov's avatar Nikita Popov
Browse files

[Loads] Check type size in bits during store to load forwarding

Rather than checking the rounded type store size, check the type
size in bits. We don't want to forward a store of i1 to a load
of i8 for example, even though they have the same type store size.
The padding bits have unspecified contents.

This is a partial fix for the issue reported at
https://reviews.llvm.org/D115924#inline-1179482,
the problem also needs to be addressed more generally in the
constant folding code.
parent 29fe998e
No related branches found
No related tags found
No related merge requests found
......@@ -504,8 +504,8 @@ static Value *getAvailableLoadStore(Instruction *Inst, const Value *Ptr,
if (CastInst::isBitOrNoopPointerCastable(Val->getType(), AccessTy, DL))
return Val;
TypeSize StoreSize = DL.getTypeStoreSize(Val->getType());
TypeSize LoadSize = DL.getTypeStoreSize(AccessTy);
TypeSize StoreSize = DL.getTypeSizeInBits(Val->getType());
TypeSize LoadSize = DL.getTypeSizeInBits(AccessTy);
if (TypeSize::isKnownLE(LoadSize, StoreSize))
if (auto *C = dyn_cast<Constant>(Val))
return ConstantFoldLoadFromConst(C, AccessTy, DL);
......
......@@ -293,7 +293,9 @@ entry:
define i8 @load_i8_store_i1(i1* %a) {
; CHECK-LABEL: @load_i8_store_i1(
; CHECK-NEXT: store i1 true, i1* [[A:%.*]], align 1
; CHECK-NEXT: ret i8 -1
; CHECK-NEXT: [[A_I8:%.*]] = bitcast i1* [[A]] to i8*
; CHECK-NEXT: [[V:%.*]] = load i8, i8* [[A_I8]], align 1
; CHECK-NEXT: ret i8 [[V]]
;
store i1 true, i1* %a
%a.i8 = bitcast i1* %a to i8*
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment