[InstCombine] Fold select based logic of fcmps with same operands when FMF is present.
authorCraig Topper <craig.topper@sifive.com>
Mon, 14 Mar 2022 21:30:42 +0000 (14:30 -0700)
committerCraig Topper <craig.topper@sifive.com>
Mon, 14 Mar 2022 21:45:07 +0000 (14:45 -0700)
commitce78e68261ff44861cd69d7f37b181fd5c774d3c
tree40dc33d35b24ba678683b37817f7ae349fd60fa2
parent236695e70c41e3d649b2b8a4a72f58e4218f0aa9
[InstCombine] Fold select based logic of fcmps with same operands when FMF is present.

If we have a logical and/or in select form and the true/false operand
is an fcmp with poison generating FMF, we won't be able to fold it
to an and/or instruction. This prevents us from optimizing the case
where it is a logical operation of two fcmps with identical operands.

This patch adds explicit checks for this case that doesn't rely on
converting to and/or to do the optimization. It reuses the existing
foldLogicOfFCmps, but adds a new flag to disable the other combine
that is inside that function.

FMF flags from the two FCmps are intersected using the logic added in
D121243. The FIXME has been updated to indicate that we can only use
a union for the non-select form.

This allows us to optimize cases like this from compare-fp-3.c in the
gcc torture suite with fast math.

void
test1 (float x, float y)
{
  if ((x==y) && (x!=y))
    link_error0();
}

Reviewed By: spatel

Differential Revision: https://reviews.llvm.org/D121323
llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
llvm/lib/Transforms/InstCombine/InstCombineInternal.h
llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
llvm/test/Transforms/InstCombine/and-fcmp.ll
llvm/test/Transforms/InstCombine/or-fcmp.ll