This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug target/41705] missed if conversion optimization
- From: "ramana at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 15 Oct 2009 07:57:45 -0000
- Subject: [Bug target/41705] missed if conversion optimization
- References: <bug-41705-17659@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #2 from ramana at gcc dot gnu dot org 2009-10-15 07:57 -------
(In reply to comment #0)
> Compile the attached source code with options -Os -march=armv5te -mthumb, gcc
> generates:
>
> push {lr}
> ldr r3, [r0]
> cmp r3, #0 // B
> bne .L3
> ldr r3, [r0, #4]
> b .L2
> .L3:
> mov r3, #0 // A
> .L2:
> ldr r2, [r0, #8]
> @ sp needed for prologue
> ldr r0, [r2]
> add r0, r3, r0
> pop {pc}
>
> Instruction A can be moved before instruction B, which should be handled by
> ifcvt.c:find_if_case_2. Notice the following code in find_if_header:
Surely you want A moved before the load rather than just before the comparison
? If you move the move after the load you've destroyed the value you've loaded
and the comparison is redundant.
>
> Target ARM has conditional execution capability, but thumb actually can't do
> conditional execution. Do we have any method to let the compiler know this?
Note that this is relevant only for Thumb1 and not for Thumb2. Thumb2 has
conditional code generation and GCC does make an effort to generate conditional
code for it.
Can we work around this by undef'ing HAVE_conditional_execution in the backend
headers and defining this to TARGET_THUMB1 ?
cheers
Ramana
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41705