Apply fix for clang incorrectly optimizing part of dns/bind916
Merge commit e5a8af7a90c6 from llvm git (by Gulfem Savrun Yeniceri): [Passes] Fix relative lookup table converter pass This patch fixes the relative table converter pass for the lookup table accesses that are resulted in an instruction sequence, where gep is not immediately followed by a load, such as gep being hoisted outside the loop or another instruction is inserted in between them. The fix inserts the call to load.relative.instrinsic in the original place of load instead of gep. Issue is reported by FreeBSD via https://bugs.freebsd.org/259921. Differential Revision: https://reviews.llvm.org/D115571 PR: 259921 Reported by: O. Hartmann <freebsd@walstatt-de.de> MFC after: 3 days
This commit is contained in:
parent
66df505066
commit
5a925e4644
@ -144,6 +144,10 @@ static void convertToRelLookupTable(GlobalVariable &LookupTable) {
|
||||
Value *Offset =
|
||||
Builder.CreateShl(Index, ConstantInt::get(IntTy, 2), "reltable.shift");
|
||||
|
||||
// Insert the call to load.relative instrinsic before LOAD.
|
||||
// GEP might not be immediately followed by a LOAD, like it can be hoisted
|
||||
// outside the loop or another instruction might be inserted them in between.
|
||||
Builder.SetInsertPoint(Load);
|
||||
Function *LoadRelIntrinsic = llvm::Intrinsic::getDeclaration(
|
||||
&M, Intrinsic::load_relative, {Index->getType()});
|
||||
Value *Base = Builder.CreateBitCast(RelLookupTable, Builder.getInt8PtrTy());
|
||||
|
Loading…
Reference in New Issue
Block a user