在 2024/1/13 下午9:05, Xi Ruoyao 写道:
在 2024-01-13星期六的 15:01 +0800,chenglulu写道:
在 2024/1/12 下午7:42, Xi Ruoyao 写道:
在 2024-01-12星期五的 09:46 +0800,chenglulu写道:
I found an issue bootstrapping GCC with -mcmodel=extreme in BOOT_CFLAGS:
we need a target hook to tell the generic code
UNSPEC_LA_PCREL_64_PART{1,2} are just a wrapper around symbols, or we'll
see millions lines of messages like
../../gcc/gcc/tree.h:4171:1: note: non-delegitimized UNSPEC
UNSPEC_LA_PCREL_64_PART1 (42) found in variable location
I build GCC with -mcmodel=extreme in BOOT_CFLAGS, but I haven't reproduced the
problem you mentioned.
$ ../configure --host=loongarch64-linux-gnu
--target=loongarch64-linux-gnu --build=loongarch64-linux-gnu \
--with-arch=loongarch64 --with-abi=lp64d --enable-tls
--enable-languages=c,c++,fortran,lto --enable-plugin \
--disable-multilib --disable-host-shared --enable-bootstrap
--enable-checking=release
$ make BOOT_FLAGS="-mcmodel=extreme"
What did I do wrong?:-(
BOOT_CFLAGS, not BOOT_FLAGS :).
This is so strange. My compilation here stopped due to syntax problems,
and I still haven't reproduced the information you mentioned about
UNSPEC_LA_PCREL_64_PART1.
I used:
../gcc/configure --with-system-zlib --disable-fixincludes \
--enable-default-ssp --enable-default-pie \
--disable-werror --disable-multilib \
--prefix=/home/xry111/gcc-dev
and then
make STAGE1_{C,CXX}FLAGS="-O2 -g" -j8 \
BOOT_{C,CXX}FLAGS="-O2 -g -mcmodel=extreme" &| tee gcc-build.log
I guess "-g" is needed to reproduce the issue as well as the messages
were produced in dwarf generation.
I have reproduced this problem, and it can be solved by adding a hook.
But unfortunately, when using '-mcmodel=extreme -mexplicit-relocs=always'
to test spec2006 403.gcc, an error will occur. Others have not been
tested yet.
I roughly debugged it, and the problem should be this:
The problem is that the address of the instruction ‘ldx.d $r12, $r25,
$r6’ is wrong.
Wrong assembly:
5826 pcalau12i $r13,%got_pc_hi20(recog_data)
5827 addi.d $r12,$r0,%got_pc_lo12(recog_data)
5828 lu32i.d $r12,%got64_pc_lo20(recog_data)
5829 lu52i.d $r12,$r12,%got64_pc_hi12(recog_data)
5830 ldx.d $r12,$r13,$r12
5831 ld.b $r8,$r12,997
5832 .loc 1 829 18 discriminator 1 view .LVU1527
5833 ble $r8,$r0,.L476
5834 ld.d $r6,$r3,16
5835 ld.d $r9,$r3,88
5836 .LBB189 = .
5837 .loc 1 839 24 view .LVU1528
5838 alsl.d $r7,$r19,$r19,2
5839 ldx.d $r12,$r25,$r6
5840 addi.d $r17,$r3,120
5841 .LBE189 = .
5842 .loc 1 829 18 discriminator 1 view .LVU1529
5843 or $r13,$r0,$r0
5844 addi.d $r4,$r12,992
Assembly that works fine using macros:
3040 la.global $r12,$r13,recog_data
3041 ld.b $r9,$r12,997
3042 ble $r9,$r0,.L475
3043 alsl.d $r5,$r16,$r16,2
3044 la.global $r15,$r17,recog_data
3045 addi.d $r4,$r12,992
3046 addi.d $r18,$r3,48
3047 or $r13,$r0,$r0
Comparing the assembly, we can see that lines 5844 and 3045 have the
same function,
but there is a problem with the base address register optimization at
line 5844.
regrename.c.283r.loop2_init:
(insn 6 497 2741 34 (set (reg:DI 180 [ ivtmp.713D.15724 ])
(const_int 0 [0])) "regrename.c":829:18 discrim 1 156
{*movdi_64bit}
(nil))
(insn 2741 6 2744 34 (parallel [
(set (reg:DI 1502)
(unspec:DI [
(symbol_ref:DI ("recog_data") [flags 0xc0]
<var_decl 0x7f8c5ffd66c0 recog_data>)
] UNSPEC_LA_PCREL_64_PART1))
(set (reg/f:DI 1479)
(unspec:DI [
(symbol_ref:DI ("recog_data") [flags 0xc0]
<var_decl 0x7f8c5ffd66c0 recog_data>)
] UNSPEC_LA_PCREL_64_PART2))
]) -1
(expr_list:REG_UNUSED (reg/f:DI 1479)
(nil)))
(insn 2744 2741 2745 34 (set (reg/f:DI 1503)
(mem:DI (plus:DI (reg/f:DI 1479)
(reg:DI 1502)) [0 S8 A8])) 156 {*movdi_64bit}
(expr_list:REG_EQUAL (symbol_ref:DI ("recog_data") [flags 0xc0]
<var_decl 0x7f8c5ffd66c0 recog_data>)
(nil)))
Virtual register 1479 will be used in insn 2744, but register 1479 was
assigned the REG_UNUSED attribute in the previous instruction.
The attached file is the wrong file.
The compilation command is as follows:
$ ./gcc/cc1 -fpreprocessed regrename.i -quiet -dp -dumpbase regrename.c
-dumpbase-ext .c -mno-relax -mabi=lp64d -march=loongarch64 -mfpu=64
-msimd=lasx -mcmodel=extreme -mtune=loongarch64 -g3 -O2
-Wno-int-conversion -Wno-implicit-int -Wno-implicit-function-declaration
-Wno-incompatible-pointer-types -version -o regrename.s
-mexplicit-relocs=always -fdump-rtl-all-all