Help with RTL/MD needed
Jeff Law
jeffreyalaw@gmail.com
Mon Jul 14 18:02:29 GMT 2025
On 7/14/25 10:57 AM, Jan Dubiec via Gcc wrote:
> Recently I have started playing with machine descriptions in the context
> of PR109324 (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109324). I
> have nodified MDs (see the attached patch) and got following ICE when I
> tried to build gcc:
>
> /d/Works/xcomp/gcc-build-stage1/./gcc/xgcc -B/d/Works/xcomp/gcc-build-
> stage1/./gcc/ -B/usr/local/h8300-elf/bin/ -B/usr/local/h8300-elf/lib/
> normal/ -isystem /usr/local/h8300-elf/include -isystem /usr/local/h8300-
> elf/sys-include --sysroot=/d/Works/xcomp/sysroot -g -O2 -mn -O2 -g -
> O2 -DIN_GCC -DCROSS_DIRECTORY_STRUCTURE -W -Wall -Wno-error=narrowing -
> Wwrite-strings -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes -
> Wold-style-definition -isystem ./include -DDF=SF -g -DIN_LIBGCC2 -
> fbuilding-libgcc -fno-stack-protector -Dinhibit_libc -DDF=SF -I. -I. -
> I../../.././gcc -I../../../../../gcc/libgcc -I../../../../../gcc/
> libgcc/. -I../../../../../gcc/libgcc/../gcc -I../../../../../gcc/
> libgcc/../include -o _powisf2.o -MT _powisf2.o -MD -MP -MF
> _powisf2.dep -DL_powisf2 -c ../../../../../gcc/libgcc/libgcc2.c -
> fvisibility=hidden -DHIDE_EXPORTS
> D:/Works/gcc/libgcc/libgcc2.c: In function '__powisf2':
> D:/Works/gcc/libgcc/libgcc2.c:2574:1: error: unrecognizable insn:
> 2574 | }
> | ^
> (insn 249 113 250 16 (set (reg:CCZ 12 cc)
> (eq (zero_extract:SI (reg:SI 6 r6 [orig:22 n+-2 ] [22])
> (const_int 1 [0x1])
> (const_int 0 [0]))
> (const_int 0 [0]))) "D:/Works/gcc/libgcc/libgcc2.c":2570:10 -1
> (nil))
> during RTL pass: split2
I don't think modes on the condition operators are handled consistently
in the H8 port. In general I think the mode of the EQ operator in this
context should match the mode of the destination object (CCZ).
>
> After a short investigation I have found the offending code:
>
> diff --git a/gcc/config/h8300/testcompare.md b/gcc/config/h8300/
> testcompare.md
> index 694c9e60d4e..3b43381e64a 100644
> --- a/gcc/config/h8300/testcompare.md
> +++ b/gcc/config/h8300/testcompare.md
> @@ -28,7 +28,7 @@
> ;;
> (define_insn ""
> [(set (reg:CCZ CC_REG)
> - (eq (zero_extract:HSI (match_operand:HSI 0 "register_operand" "r")
> + (eq:CCZ (zero_extract:HSI (match_operand:HSI 0 "register_operand" "r")
> (const_int 1)
> (match_operand 1 "const_int_operand" "n"))
> (const_int 0)))]
>
> Other changes seem to be fine, i.e. I am able to build gcc and the same
> set of test cases pases/fails as for unmodified compiler.
Your patch looks correct to me. Given I've seen the H8 be inconsistent
in this regard before I wouldn't be at all surprised if there are other
problems of a similar nature lurking.
>
> MD is a completely new topic to me so I am looking for some hints how to
> debug the issue. Is it possible that this particular MD is not fully
> complete?
Debugging failure to match is painful. I sometimes remove all the #line
markers in the generated insn-recog.cc files and follow the recognizer,
but that's only when I can't see what's going on with visual inspection
of the dumps & md file.
>
> As a side note I can say that unmodified gcc indeed emits "bit test"
> instruction for line 2570:
> ;# ../../../../../gcc/libgcc/libgcc2.c:2570: if (n % 2)
> .LM28:
> btst #0,r6l ;#, n
> beq .L8 ;#,
Good. Note that I've got a tester I can throw things into. I'll do a
regression test of mh, ms, msx with -mint32. I can add your patch to
that tester to see what happens.
Jeff
More information about the Gcc
mailing list