[SDAG] remove use restriction in isNegatibleForFree() when called from getNegatedExpr...
authorSanjay Patel <spatel@rotateright.com>
Wed, 11 Dec 2019 16:18:09 +0000 (11:18 -0500)
committerSanjay Patel <spatel@rotateright.com>
Wed, 11 Dec 2019 18:30:39 +0000 (13:30 -0500)
commitd1f0bdf2d2df9bdf11ee2ddfff3df50e53f2f042
treed8ff7e8e6e718370607f772a1a62f737375cf00d
parentd8c31d41989b0748e2e5b8d7fa9cf7e7023bcbff
[SDAG] remove use restriction in isNegatibleForFree() when called from getNegatedExpression()

This is an alternate fix for the bug discussed in D70595.
This also includes minimal tests for other in-tree targets
to show the problem more generally.

We check the number of uses as a predicate for whether some
value is free to negate, but that use count can change as we
rewrite the expression in getNegatedExpression(). So something
that was marked free to negate during the cost evaluation
phase becomes not free to negate during the rewrite phase (or
the inverse - something that was not free becomes free).
This can lead to a crash/assert because we expect that
everything in an expression that is negatible to be handled
in the corresponding code within getNegatedExpression().

This patch skips the use check during the rewrite phase.
So we determine that some expression isNegatibleForFree
(identically to without this patch), but during the rewrite,
don't rely on use counts to decide how to create the optimal
expression.

Differential Revision: https://reviews.llvm.org/D70975
llvm/include/llvm/CodeGen/TargetLowering.h
llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/lib/Target/X86/X86ISelLowering.h
llvm/test/CodeGen/AArch64/arm64-fmadd.ll
llvm/test/CodeGen/X86/fma-fneg-combine-2.ll