forked from OSchip/llvm-project
[GISel][KnownBits] Fix a bug where we could run out of stack space
One of the exit criteria of computeKnownBits is whether we reach the max recursive call depth. Before this patch we would check that the depth is exactly equal to max depth to exit. Depth may get bigger than max depth if it gets passed to a different GISelKnownBits object. This may happen when say a generic part uses a GISelKnownBits object with some max depth, but then we hit TL.computeKnownBitsForTargetInstr which creates a new GISelKnownBits object with a different and smaller depth. In that situation, when we hit the max depth check for the first time in the target specific GISelKnownBits object, depth may already be bigger than the current max depth. Hence we would continue to compute the known bits, until we ran through the full depth of the chain of computation or ran out of stack space. For instance, let say we have GISelKnownBits Info(/*MaxDepth*/ = 10); Info.getKnownBits(Foo) // 9 recursive calls to computeKnownBitsImpl. // Then we hit a target specific instruction. // The target specific GISelKnownBits does this: GISelKnownBits TargetSpecificInfo(/*MaxDepth*/ = 6) TargetSpecificInfo.computeKnownBitsImpl() // <-- next max depth checks would // always return false. This commit does not have any test case, none of the in-tree targets use computeKnownBitsForTargetInstr.
This commit is contained in:
parent
1db66e705f
commit
cfebd77742
|
@ -107,7 +107,15 @@ void GISelKnownBits::computeKnownBitsImpl(Register R, KnownBits &Known,
|
|||
if (DstTy.isVector())
|
||||
return; // TODO: Handle vectors.
|
||||
|
||||
if (Depth == getMaxDepth())
|
||||
// Depth may get bigger than max depth if it gets passed to a different
|
||||
// GISelKnownBits object.
|
||||
// This may happen when say a generic part uses a GISelKnownBits object
|
||||
// with some max depth, but then we hit TL.computeKnownBitsForTargetInstr
|
||||
// which creates a new GISelKnownBits object with a different and smaller
|
||||
// depth. If we just check for equality, we would never exit if the depth
|
||||
// that is passed down to the target specific GISelKnownBits object is
|
||||
// already bigger than its max depth.
|
||||
if (Depth >= getMaxDepth())
|
||||
return;
|
||||
|
||||
if (!DemandedElts)
|
||||
|
|
Loading…
Reference in New Issue