mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 19:52:54 +01:00
[Analysis] In EmitGEPOffset, use Constant::getUniqueInteger to handle struct indices in vector GEPs.
We previously called getSplatValue if the index had a vector type, but getSplatValue returns null for non-splats. This would cause a nullptr dereference if it wasn't a splat. Using getUniqueInteger gives us an assert if its a vector type, but the value isn't a splat. This is what is used in SelectionDAGBuilder's code that expands GEPs as well. llvm-svn: 370001
This commit is contained in:
parent
84f1e56d12
commit
6453e9ebe2
@ -51,10 +51,7 @@ Value *EmitGEPOffset(IRBuilderTy *Builder, const DataLayout &DL, User *GEP,
|
||||
|
||||
// Handle a struct index, which adds its field offset to the pointer.
|
||||
if (StructType *STy = GTI.getStructTypeOrNull()) {
|
||||
if (OpC->getType()->isVectorTy())
|
||||
OpC = OpC->getSplatValue();
|
||||
|
||||
uint64_t OpValue = cast<ConstantInt>(OpC)->getZExtValue();
|
||||
uint64_t OpValue = OpC->getUniqueInteger().getZExtValue();
|
||||
Size = DL.getStructLayout(STy)->getElementOffset(OpValue);
|
||||
|
||||
if (Size)
|
||||
|
Loading…
Reference in New Issue
Block a user