[InstCombine] invert canonicalization for cast of signbit test
authorSanjay Patel <spatel@rotateright.com>
Mon, 16 May 2022 16:29:47 +0000 (12:29 -0400)
committerSanjay Patel <spatel@rotateright.com>
Mon, 16 May 2022 16:55:52 +0000 (12:55 -0400)
commit3794cc0e996481e10307b67c8436aa44e0d65d22
treec0dce126df8143ce75d58e298f9e032828d41e4a
parent836305b24ca7a0dea0f80873bfa79d417d4d798d
[InstCombine] invert canonicalization for cast of signbit test

The existing transform was wrong in 3 ways:
1. It created an extra instruction when the source and dest types don't match.
2. It did not account for an extra use of the icmp, so could create 2 extra insts.
3. It favored bit hacks over icmp (icmp generally has better analysis).

This fixes #54692 (modeled by the PhaseOrdering tests).

This is a minimal step to fix the bug, but we should likely invert
the sibling transform for the "is negative" pattern too.

The backend should be able to invert this back to a shift if that
leads to better codegen.
llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp
llvm/test/Transforms/InstCombine/and-xor-merge.ll
llvm/test/Transforms/InstCombine/compare-signs.ll
llvm/test/Transforms/InstCombine/icmp.ll
llvm/test/Transforms/InstCombine/xor.ll
llvm/test/Transforms/InstCombine/zext.ll
llvm/test/Transforms/PhaseOrdering/cmp-logic.ll