[llvm] r258847 - Allow X86::COND_NE_OR_P and X86::COND_NP_OR_E to be reversed.
Benjamin Kramer via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 27 04:41:07 PST 2016
This also breaks compiling code with
> fatal error: error in backend: Undefined temporary symbol
will revert and follow up with a test case.
On Wed, Jan 27, 2016 at 5:11 AM, James Knight via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> This change is broken in some fashion; it causes llvm to rewrite branches incorrectly producing an infinite loop.
>> On Jan 26, 2016, at 3:08 PM, Cong Hou via llvm-commits <llvm-commits at lists.llvm.org> wrote:
>> Author: conghou
>> Date: Tue Jan 26 14:08:01 2016
>> New Revision: 258847
>> URL: http://llvm.org/viewvc/llvm-project?rev=258847&view=rev
>> Allow X86::COND_NE_OR_P and X86::COND_NP_OR_E to be reversed.
>> Currently, AnalyzeBranch() fails non-equality comparison between floating points
>> on X86 (see https://llvm.org/bugs/show_bug.cgi?id=23875). This is because this
>> function can modify the branch by reversing the conditional jump and removing
>> unconditional jump if there is a proper fall-through. However, in the case of
>> non-equality comparison between floating points, this can turn the branch
>> "unanalyzable". Consider the following case:
>> AnalyzeBranch() will reverse "jp .BB1" to "jnp .BB2" and then "jmp .BB2" will be
>> However, AnalyzeBranch() cannot analyze this branch anymore as there are two
>> conditional jumps with different targets. This may disable some optimizations
>> like block-placement: in this case the fall-through behavior is enforced even if
>> the fall-through block is very cold, which is suboptimal.
>> Actually this optimization is also done in block-placement pass, which means we
>> can remove this optimization from AnalyzeBranch(). However, currently
>> X86::COND_NE_OR_P and X86::COND_NP_OR_E are not reversible: there is no defined
>> negation conditions for them.
>> In order to reverse them, this patch defines two new CondCode X86::COND_E_AND_NP
>> and X86::COND_P_AND_NE. It also defines how to synthesize instructions for them.
>> Here only the second conditional jump is reversed. This is valid as we only need
>> them to do this "unconditional jump removal" optimization.
>> Differential Revision: http://reviews.llvm.org/D11393
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
More information about the llvm-commits