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

--- Comment #1 from Adam Warner <adam at consulting dot net.nz> 2012-09-01 
03:00:39 UTC ---
Another example:
$ cat negative_constant_not_combined_into_a_single_instruction_example_2.c 
#include <stdint.h>

__thread uint8_t byte_array[100];

uint64_t lookup_with_positive_constant(int64_t offset1, int64_t offset2) {
  return *((uint64_t *) (byte_array + 8*offset1 + offset2 + 1));
}

uint64_t lookup_with_negative_constant(int64_t offset1, int64_t offset2) {
  return *((uint64_t *) (byte_array + 8*offset1 + offset2 - 1));
}

int main(void) {
  return 0;
}

$ gcc -O3 -std=gnu11 -pthread
negative_constant_not_combined_into_a_single_instruction_example_2.c && objdump
-d -m i386:x86-64:intel a.out |less

0000000000400540 <lookup_with_positive_constant>:
  400540:       64 48 8b 84 fe 9d ff    mov    rax,QWORD PTR
fs:[rsi+rdi*8-0x63]
  400547:       ff ff 
  400549:       c3                      ret    

0000000000400550 <lookup_with_negative_constant>:
  400550:       64 48 8b 14 25 00 00    mov    rdx,QWORD PTR fs:0x0
  400557:       00 00 
  400559:       48 8d 04 fe             lea    rax,[rsi+rdi*8]
  40055d:       48 81 c2 9c ff ff ff    add    rdx,0xffffffffffffff9c
  400564:       48 8b 44 02 ff          mov    rax,QWORD PTR [rdx+rax*1-0x1]
  400569:       c3                      ret    

The memory load expands into four instructions when subtracting 1 from the byte
offset instead of adding 1.

Reply via email to