[ValueTracking] determine sign of 0.0 from select when matching min/max FP
authorSanjay Patel <spatel@rotateright.com>
Sun, 4 Nov 2018 14:28:48 +0000 (14:28 +0000)
committerSanjay Patel <spatel@rotateright.com>
Sun, 4 Nov 2018 14:28:48 +0000 (14:28 +0000)
commite7c94ef1debe790ab90833cf72e21b584651db16
tree4dd1c912d2c692254888d07117d0c2730d214894
parentd96bdd2402d5f1477a92b679909d99c37172f868
[ValueTracking] determine sign of 0.0 from select when matching min/max FP

In PR39475:
https://bugs.llvm.org/show_bug.cgi?id=39475
..we may fail to recognize/simplify fabs() in some cases because we do not
canonicalize fcmp with a -0.0 operand.

Adding that canonicalization can cause regressions on min/max FP tests, so
that's this patch: for the purpose of determining whether something is min/max,
let the value returned by the select determine how we treat a 0.0 operand in the fcmp.

This patch doesn't actually change the -0.0 to +0.0. It just changes the analysis, so
we don't fail to recognize equivalent min/max patterns that only differ in the
signbit of 0.0.

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

llvm-svn: 346097
llvm/lib/Analysis/ValueTracking.cpp
llvm/test/Transforms/InstCombine/minmax-fp.ll
llvm/unittests/Analysis/ValueTrackingTest.cpp