This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Redundant limit check for switch


Piotr Fusik <pfusik@op.pl> wrote:

> void Switch4(int x) {
>     switch (x & 7) {
>     case 0: printf("0\n"); break;
>     case 1: printf("1\n"); break;
>     case 2: printf("2\n"); break;
>     case 3: printf("3\n"); break;
>     case 4: printf("4\n"); break;
>     case 5: printf("5\n"); break;
>     case 6: printf("6\n"); break;
>     case 7: printf("7\n"); break;
>     }
> }
> .globl _Switch4
> .def _Switch4; .scl 2; .type 32; .endef
> _Switch4:
> pushl %ebp
> movl %esp, %ebp
> movl 8(%ebp), %eax
> andl $7, %eax
> cmpl $7, %eax
> ja L12
> jmp *L11(,%eax,4)

> cmpl+ja are redundant in both cases.
> Do you think it is possible for gcc to optimize them away?

I believe VRP could be taught about inferring ranges from bit_and_expr and
similar operations. Right?
-- 
Giovanni Bajo


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]