<< Back to previous view

[PCC-409] 'invalid' bitshift produces possibly incorrect code Created: 10/Sep/12  Updated: 15/Sep/12

Status: Resolved
Project: pcc
Component/s: Common code, i386 target
Affects Version/s: None
Fix Version/s: None

Type: Bug Priority: Major
Reporter: Iain Hibbert Assignee: Anders Magnusson
Resolution: Fixed Votes: 0
Environment: NetBSD/i386

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..

        .align 4
        .globl foo
        .type foo,@function
        pushl %ebp
        movl %esp,%ebp
        subl $4,%esp
        movl 8(%ebp),%eax
        movl %eax,-4(%ebp)
        jmp .L86
        movl -4(%ebp),%eax
        .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..

Comment by Iain Hibbert [ 10/Sep/12 09:54 PM ]
I should note, that in C99 6.5.7 "Bitwise shift operators" note 3, it does say

  "If the value of the right operand is negative or is greater than or equal to the width of
  the promoted left operand, the behavior is undefined."

which means that pcc is not unconforming here, just that the result is not necessarily what I would expect..
Comment by Anders Magnusson [ 10/Sep/12 10:18 PM ]
The code for clearing types is commented out in optim.c due to lack of side effects check. It should probably be fixed.
Comment by Anders Magnusson [ 15/Sep/12 04:05 PM ]
The mod for correct size is now removed, to give least surprises.
Generated at Sat Oct 21 12:23:24 CEST 2017 using JIRA Enterprise Edition, Version: 3.13.1-#333.