This is the mail archive of the gcc-patches@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: Patch: Print SImode register names to force addr32 prefix


On Fri, Nov 9, 2012 at 9:23 AM, Uros Bizjak <ubizjak@gmail.com> wrote:
> On Fri, Nov 9, 2012 at 10:17 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
>
>> Since x32 runs in 64-bit mode, for address -0x40000300(%rax), hardware
>> sign-extends displacement from 32-bits to 64-bits and adds it to %rax.
>> But x32 wants 32-bit -0x40000300, not 64-bit -0x40000300.  This patch
>> uses 32-bit registers instead of 64-bit registers when displacement
>> < -16*1024*1024.  -16*1024*1024 is used instead of 0 so that we will
>> still generate -16(%rsp) instead of -16(%esp).
>>
>> Tested it on Linux/x32.  OK to install?
>
> This problem uncovers a bug in the middle-end, so I guess it would be
> better to fix it there.
>
> Uros.

The problem is it isn't safe to transform

(zero_extend:DI (plus:SI (FOO:SI) (const_int Y)))

to

(plus:DI (zero_extend:DI (FOO:SI)) (const_int Y))

when Y is negative and its absolute value is greater than FOO.  However,
we have to do this transformation since other parts of GCC depend on
it.  If we revert the fix for

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

we will get

FAIL: gcc.c-torture/compile/990523-1.c  -O3 -g  (internal compiler error)
FAIL: gcc.c-torture/compile/990523-1.c  -O3 -g  (test for excess errors)
FAIL: gcc.c-torture/compile/pr41634.c  -O3 -fomit-frame-pointer -funroll-all-loo
ps -finline-functions  (internal compiler error)
FAIL: gcc.c-torture/compile/pr41634.c  -O3 -fomit-frame-pointer -funroll-all-loo
ps -finline-functions  (test for excess errors)
FAIL: gcc.c-torture/compile/pr41634.c  -O3 -fomit-frame-pointer -funroll-loops
(internal compiler error)
FAIL: gcc.c-torture/compile/pr41634.c  -O3 -fomit-frame-pointer -funroll-loops
(test for excess errors)
FAIL: gcc.c-torture/compile/pr41634.c  -O3 -fomit-frame-pointer  (internal compi
ler error)
FAIL: gcc.c-torture/compile/pr41634.c  -O3 -fomit-frame-pointer  (test for exces
s errors)
FAIL: gcc.c-torture/compile/pr41634.c  -O3 -g  (internal compiler error)
FAIL: gcc.c-torture/compile/pr41634.c  -O3 -g  (test for excess errors)
FAIL: gcc.dg/Warray-bounds.c (internal compiler error)
FAIL: gcc.dg/Warray-bounds.c (test for excess errors)

since we generate pseudo registers to convert SImode to DImode
after reload.  Fixing it requires significant changes.

This is only a problem for 64-bit register address since the symbolic
address is 32-bit.  Using 32-bit base/index registers will work around
this issue.

-- 
H.J.


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