Issue Details (XML | Word | Printable)

Key: PCC-409
Type: Bug Bug
Status: Resolved Resolved
Resolution: Fixed
Priority: Major Major
Assignee: Anders Magnusson
Reporter: Iain Hibbert
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
pcc

'invalid' bitshift produces possibly incorrect code

Created: 10/Sep/12 09:21 PM   Updated: 15/Sep/12 04:05 PM
Component/s: Common code, i386 target
Affects Version/s: None
Fix Version/s: None

Environment: NetBSD/i386


 Description  « Hide
The following code snippet (which construct I found in some GNU code)

unsigned int foo(unsigned int a)
{
      return a << 31 << 1;
}

when compiled with pcc, produces a warning

foo.c, line 3: warning: shift larger than type

which of course is true (though gcc does not warn about it, as I guess that
it was intentionally written that way). However, while considering what to do
about it, I noticed that the output code pcc produces is not strictly correct..

        .text
        .align 4
        .globl foo
        .type foo,@function
foo:
        pushl %ebp
        movl %esp,%ebp
        subl $4,%esp
.L85:
.L87:
        movl 8(%ebp),%eax
        movl %eax,-4(%ebp)
        jmp .L86
.L86:
        movl -4(%ebp),%eax
        leave
        ret
        .size foo,.-foo
        .ident "PCC: pcc 1.1.0.DEVEL 20120910 for netbsd-i386"

it seems that the function merely returns its input; the equivalent output from gcc
(and what I would expect) is to return 0 since all the bits have been shifted out

in fact, pcc is shifting "count % maxbits" rather than "count" here, which also produces
incorrect result for larger shifts..

 All   Comments   Change History      Sort Order: Ascending order - Click to sort in descending order
Anders Magnusson made changes - 10/Sep/12 10:17 PM
Field Original Value New Value
Assignee Anders Magnusson [ ragge ]
Anders Magnusson made changes - 15/Sep/12 04:05 PM
Status Open [ 1 ] Resolved [ 5 ]
Resolution Fixed [ 1 ]