mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 04:02:41 +01:00
If we have an add, do it in the pointer realm, not the int realm. This is critical in the linux kernel for pointer analysis correctness
llvm-svn: 30496
This commit is contained in:
parent
17889b837e
commit
0240d56eb6
@ -1595,6 +1595,28 @@ FoundSExt:
|
|||||||
return R;
|
return R;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// add (cast *A to intptrtype) B -> cast (GEP (cast *A to sbyte*) B) -> intptrtype
|
||||||
|
{
|
||||||
|
CastInst* CI = dyn_cast<CastInst>(LHS);
|
||||||
|
Value* Other = RHS;
|
||||||
|
if (!CI) {
|
||||||
|
CI = dyn_cast<CastInst>(RHS);
|
||||||
|
Other = LHS;
|
||||||
|
}
|
||||||
|
if (CI) {
|
||||||
|
const Type *UIntPtrTy = TD->getIntPtrType();
|
||||||
|
const Type *SIntPtrTy = UIntPtrTy->getSignedVersion();
|
||||||
|
if((CI->getType() == UIntPtrTy || CI->getType() == SIntPtrTy)
|
||||||
|
&& isa<PointerType>(CI->getOperand(0)->getType())) {
|
||||||
|
Instruction* I2 = new CastInst(CI->getOperand(0), PointerType::get(Type::SByteTy), "ctg", &I);
|
||||||
|
WorkList.push_back(I2);
|
||||||
|
I2 = new GetElementPtrInst(I2, Other, "ctg", &I);
|
||||||
|
WorkList.push_back(I2);
|
||||||
|
return new CastInst(I2, CI->getType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return Changed ? &I : 0;
|
return Changed ? &I : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user