Fix a use-after-RAUW bug in large GEP splitting
authorKrzysztof Pszeniczny <krzysztof.pszeniczny@gmail.com>
Fri, 19 Oct 2018 19:02:16 +0000 (19:02 +0000)
committerKrzysztof Pszeniczny <krzysztof.pszeniczny@gmail.com>
Fri, 19 Oct 2018 19:02:16 +0000 (19:02 +0000)
commit2bfe759a8d7f4e544ac0f079d447f33c0b4dcf9c
tree67b55e22e6a7f0754d8f43626ed25679dddf4488
parentb3d203ff7f308cc5675f095654d0cda905bf95bf
Fix a use-after-RAUW bug in large GEP splitting

Summary:
Large GEP splitting, introduced in rL332015, uses a `DenseMap<AssertingVH<Value>, ...>`. This causes an assertion to fail (in debug builds) or undefined behaviour to occur (in release builds) when a value is RAUWed.

This manifested itself in the 7zip benchmark from the llvm test suite built on ARM with `-fstrict-vtable-pointers` enabled while RAUWing invariant group launders and splits in CodeGenPrepare.

This patch merges the large offsets of the argument and the result of an invariant.group strip/launder intrinsic before RAUWing.

Reviewers: Prazek, javed.absar, haicheng, efriedma

Reviewed By: Prazek, efriedma

Subscribers: kristof.beyls, hiraditya, llvm-commits

Differential Revision: https://reviews.llvm.org/D51936

llvm-svn: 344802
llvm/lib/CodeGen/CodeGenPrepare.cpp
llvm/test/Transforms/CodeGenPrepare/AArch64/large-offset-gep.ll