HomePhabricator

[MergeICmps] Do not perform the transformation if GEP is used outside of block

Description

[MergeICmps] Do not perform the transformation if GEP is used outside of block

Summary:
This patch prevents MergeICmps to performn the transformation if the address operand GEP of the load instruction has a use outside of the load's parent block. Without this patch, compiler crashes with the given test case because the use of %first.i is still around when the basic block is erased from https://github.com/llvm-mirror/llvm/blob/master/lib/Transforms/Scalar/MergeICmps.cpp#L620. I think checking isUsedOutsideOfBlock with GEP is the original intention of the code, as the checking for LoadI is already performed in the same function.

This patch is incomplete though, as this makes the pass overly conservative and fails the test tuple-four-int8.ll. I believe what needs to be done is checking if GEP has a use outside of block that is not the part of "Comparisons" chain. Submit the patch as of now to prevent compiler crash.

Reviewers: courbet, trentxintong

Reviewed By: courbet

Subscribers: llvm-commits

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