[SelectionDAG] Assume that a GlobalAlias may alias other global values
authorBjorn Pettersson <bjorn.a.pettersson@ericsson.com>
Mon, 20 Sep 2021 08:29:11 +0000 (10:29 +0200)
committerBjorn Pettersson <bjorn.a.pettersson@ericsson.com>
Tue, 5 Oct 2021 10:15:55 +0000 (12:15 +0200)
commit1896fb2cfffcf120eb28cefb67ac3d56035adc43
treece10622e2ec3b6f8c49ae60a15ca3af538bb864d
parentd009f6e51cae7e7a155d083c9170723554f2e776
[SelectionDAG] Assume that a GlobalAlias may alias other global values

This fixes a bug detected in DAGCombiner when using global alias
variables. Here is an example:
  @foo = global i16 0, align 1
  @aliasFoo = alias i16, i16 * @foo
  define i16 @bar() {
    ...
    store i16 7, i16 * @foo, align 1
    store i16 8, i16 * @aliasFoo, align 1
    ...
  }

BaseIndexOffset::computeAliasing would incorrectly derive NoAlias
for the two accesses in the example above, resulting in DAGCombiner
miscompiles.

This patch fixes the problem by a defensive approach letting
BaseIndexOffset::computeAliasing return false, i.e. that the aliasing
couldn't be determined, when comparing two global values and at least
one is a GlobalAlias. In the future we might improve this with a
deeper analysis to look at the aliasee for the GlobalAlias etc. But
that is a bit more complicated considering that we could have
'local_unnamed_addr' and situations with several 'alias' variables.

Fixes PR51878.

Differential Revision: https://reviews.llvm.org/D110064
llvm/lib/CodeGen/SelectionDAG/SelectionDAGAddressAnalysis.cpp
llvm/test/CodeGen/X86/pr51878_computeAliasing.ll [new file with mode: 0644]
llvm/unittests/CodeGen/SelectionDAGAddressAnalysisTest.cpp