From 930a68765dff96927d706d258ef0c2ad9c7ec2ab Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 8 Apr 2022 17:26:29 +0200 Subject: [PATCH] [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. --- llvm/lib/Analysis/Loads.cpp | 4 ++-- llvm/test/Transforms/InstCombine/load-store-forward.ll | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Analysis/Loads.cpp b/llvm/lib/Analysis/Loads.cpp index fafd95e..bc1d82c 100644 --- a/llvm/lib/Analysis/Loads.cpp +++ b/llvm/lib/Analysis/Loads.cpp @@ -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(Val)) return ConstantFoldLoadFromConst(C, AccessTy, DL); diff --git a/llvm/test/Transforms/InstCombine/load-store-forward.ll b/llvm/test/Transforms/InstCombine/load-store-forward.ll index 618e67e..750eb51 100644 --- a/llvm/test/Transforms/InstCombine/load-store-forward.ll +++ b/llvm/test/Transforms/InstCombine/load-store-forward.ll @@ -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* -- 2.7.4