================ @@ -2128,6 +2129,105 @@ static void patchAndReplaceAllUsesWith(Instruction *I, Value *Repl) { I->replaceAllUsesWith(Repl); } +// split load to single byte loads and check if the value can be deduced +// +// Example: +// define i32 @f(i8* %P) +// 1: %b2 = getelementptr inbounds i8, i8* %P, i64 1 +// 2: store i8 0, i8* %b2, align 1 +// 3: store i8 0, i8* %P, align 1 +// 4: %s1 = bitcast i8* %P to i16* +// 5: %L = load i16, i16* %s1, align 4 +// +// The last clobbering write for the load is (3) but it doesn't cover the whole +// read. So AnalyzeLoadAvailability would give up. +// This function emit temporary byte-sized loads that cover the original load, +// so that any last write covers the read. We run AnalyzeLoadAvailability on +// each byte to try to construct the load as a constant. +bool GVNPass::splitAndprocessLoad(LoadInst *L) { + if (L->isAtomic()) + return false; + + Type *LTy = L->getType(); + if (!LTy->isIntegerTy()) + return false; + + unsigned BW = LTy->getIntegerBitWidth(); + if (BW % 8) + return false; + + IntegerType *ByteTy = IntegerType::getInt8Ty(LTy->getContext()); + Type *BytePtrTy = PointerType::get(ByteTy, L->getPointerAddressSpace()); + BitCastInst *Base = new BitCastInst(L->getPointerOperand(), BytePtrTy, "", L); ---------------- nikic wrote:
Not necessary with opaque pointers. https://github.com/llvm/llvm-project/pull/72364 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits