Source:
int f1(short a, int b)
{
    return a * b;
}

int f2(unsigned short a, int b)
{
    return a * b;
}

> gcc -O3 -fomit-frame-pointer -S paramext.c

_f1:
LFB0:
        movl    %esi, %eax
        movswl  %di, %edi <-
        imull   %edi, %eax
        ret
...
_f2:
LFB1:
        movl    %esi, %eax
        movzwl  %di, %edi <-
        imull   %edi, %eax
        ret

AFAIK integer parameters should already be extended to int, so those
instructions are redundant. llvm doesn't generate them.


-- 
           Summary: x86-64 unnecessary parameter extension
           Product: gcc
           Version: 4.6.0
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: astrange at ithinksw dot com
  GCC host triplet: x86_64-*-*


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44532

Reply via email to