On 05/12/11 10:42, Richard Earnshaw wrote:
> On 04/12/11 13:32, kazu_hir...@mentor.com wrote:
>> Hi,
>>
>> Attached is a patch to fix miscompilation in
>> arm.md:*minmax_arithsi.
>>
>> The following testcase, reduced from efgcvt_r.c:fcvt_r in glibc, gets
>> miscompiled:
>>
>> extern void abort (void);
>>
>> int __attribute__((noinline))
>> foo (int a, int b)
>> {
>>   int max = (b > 0) ? b : 0;
>>   return max - a;
>> }
>>
>> int
>> main (void)
>> {
>>   if (foo (3, -1) != -3)
>>     abort ();
>>   return 0;
>> }
>>
>> arm-none-eabi-gcc -O1 generates:
>>
>> foo:
>>      @ Function supports interworking.
>>      @ args = 0, pretend = 0, frame = 0
>>      @ frame_needed = 0, uses_anonymous_args = 0
>>      @ link register save eliminated.
>>      cmp     r1, #0
>>      rsbge   r0, r0, r1
>>      bx      lr
>>
>> This would be equivalent to:
>>
>>   return b >= 0 ? b - a : a;
>>
>> which is different from:
>>
>>   return b >= 0 ? b - a : -a;
>>
>> That is, in assembly code, we should have an "else" clause like so:
>>
>>      cmp     r1, #0
>>      rsbge   r0, r0, r1  <- then clause
>>      rsblt   r0, r0, #0  <- else clause
>>      bx      lr
>>
>> The problem comes from the fact that arm.md:*minmax_arithsi does not
>> add the "else" clause even though MINUS is not commutative.
>>
>> The patch fixes the problem by always requiring the "else" clause in
>> the MINUS case.
>>
>> Tested by running gcc testsuite on various ARM subarchitectures.  OK
>> to apply?
>>
>> Kazu Hirata
>>
>> gcc/
>> 2011-12-04  Kazu Hirata  <k...@codesourcery.com>
>>
>>      PR target/51408
>>      * config/arm/arm.md (*minmax_arithsi): Always require the else
>>      clause in the MINUS case.
>>
>> gcc/testsuite/
>> 2011-12-04  Kazu Hirata  <k...@codesourcery.com>
>>
>>      PR target/51408
>>      * gcc.dg/pr51408.c: New.
>>
> 
> OK.
> 
> R.

BTW, I would expect this to also exist in all the release branches.  Could you 
back-port it where
needed please.

TIA,

R.

Reply via email to