[llvm-commits] [PATCH]: PR 12760: Fix incorrect pattern matching of SMMLS instruction

Meador Inge meadori at gmail.com
Tue May 15 15:45:10 PDT 2012


Ping.

On Wed, May 9, 2012 at 9:14 AM, Meador Inge <meadori at gmail.com> wrote:
> Hi All,
>
> In PR 12760 Mans Rullgard reported an issue (and thoughtfully explained it)
> where we are incorrectly producing a 'SMMLS' instruction for the
> '(sub GPR:$Ra, (mulhs GPR:$Rn, GPR:$Rm))' pattern.  This will produce incorrect
> results if any of the lower 32-bits of the 64-bit multiplication result are set.
>
> As a concrete example consider the following function:
>
> define i32 @f(i32 %a, i32 %b, i32 %c) nounwind readnone ssp {
> entry:
>  %conv4 = zext i32 %a to i64
>  %conv1 = sext i32 %b to i64
>  %conv2 = sext i32 %c to i64
>  %mul = mul nsw i64 %conv2, %conv1
>  %shr5 = lshr i64 %mul, 32
>  %sub = sub nsw i64 %conv4, %shr5
>  %conv3 = trunc i64 %sub to i32
>  ret i32 %conv3
> }
>
> this currently gets compiled to (llc -march=arm -mcpu=cortex-a8 smml.ll):
>
> _f:
>        smmls   r0, r2, r1, r0
>        bx      lr
>
> Further consider the case 'f(1, 1, 1)'.  This incorrectly returns 0 when it
> should return 1.
>
> The attached patch fixes this be removing the pattern for 'SMMLS'.  The
> generated code is now correctly:
>
> _f:
>        smmul   r1, r2, r1
>        sub     r0, r0, r1
>        bx      lr
>
> OK?
>
> (P.S. If it is OK, can someone commit for me?  I don't have write access.)
>
> --
> # Meador



-- 
# Meador




More information about the llvm-commits mailing list