Fix const folding of 64bit pointer constants

See testcase.
This commit is contained in:
Michael Matz 2016-10-04 01:20:33 +02:00
parent 0b0e64c2c9
commit 3bc9c325c5
2 changed files with 8 additions and 2 deletions

View File

@ -1659,10 +1659,10 @@ static void gen_opic(int op)
uint64_t l2 = c2 ? v2->c.i : 0; uint64_t l2 = c2 ? v2->c.i : 0;
int shm = (t1 == VT_LLONG) ? 63 : 31; int shm = (t1 == VT_LLONG) ? 63 : 31;
if (t1 != VT_LLONG) if (t1 != VT_LLONG && (PTR_SIZE != 8 || t1 != VT_PTR))
l1 = ((uint32_t)l1 | l1 = ((uint32_t)l1 |
(v1->type.t & VT_UNSIGNED ? 0 : -(l1 & 0x80000000))); (v1->type.t & VT_UNSIGNED ? 0 : -(l1 & 0x80000000)));
if (t2 != VT_LLONG) if (t2 != VT_LLONG && (PTR_SIZE != 8 || t2 != VT_PTR))
l2 = ((uint32_t)l2 | l2 = ((uint32_t)l2 |
(v2->type.t & VT_UNSIGNED ? 0 : -(l2 & 0x80000000))); (v2->type.t & VT_UNSIGNED ? 0 : -(l2 & 0x80000000)));

View File

@ -946,6 +946,12 @@ void expr_ptr_test()
j = -1; j = -1;
printf("%d\n", sp[j].i); printf("%d\n", sp[j].i);
} }
#ifdef __LP64__
i = 1;
p = (int*)0x100000000UL + i;
i = ((long)p) >> 32;
printf("largeptr: %p %d\n", p, i);
#endif
} }
void expr_cmp_test() void expr_cmp_test()