Hi! So, I tested this patch. The test builds Linux for all targets, and the number reported here is just binary size (usually a good indicator for combine effectiveness). C0 is the unmodified compiler, C1 is with your patch. A size of 0 means it did not build.
C0 C1 alpha 6403469 100.000% arc 0 0 arm 10196358 100.000% arm64 0 20228766 armhf 15042594 100.000% c6x 2496218 100.000% csky 0 0 h8300 1217198 100.000% i386 11966700 100.000% ia64 18814277 100.000% m68k 3856350 100.000% microblaze 5864258 100.000% mips 9142108 100.000% mips64 7344744 100.000% nds32 0 0 nios2 3909477 100.000% openrisc 4554446 100.000% parisc 7721195 100.000% parisc64 0 0 powerpc 10447477 100.000% powerpc64 22257111 100.000% powerpc64le 19292786 100.000% riscv32 1630934 100.000% riscv64 7628058 100.000% s390 15173928 100.000% sh 3410671 100.000% shnommu 1685616 100.000% sparc 4737096 100.000% sparc64 7167122 100.000% x86_64 19718928 100.000% xtensa 2639363 100.000% So, there is no difference for most targets (I checked some targets and there really is no difference). The only exception is aarch64 (which the kernel calls "arm64"): the unpatched compiler ICEs! (At least three times, even). during RTL pass: reload /home/segher/src/kernel/kernel/cgroup/cgroup.c: In function 'rebind_subsystems': /home/segher/src/kernel/kernel/cgroup/cgroup.c:1777:1: internal compiler error: in lra_set_insn_recog_data, at lra.c:1004 1777 | } | ^ 0x1096215f lra_set_insn_recog_data(rtx_insn*) /home/segher/src/gcc/gcc/lra.c:1004 0x109625d7 lra_get_insn_recog_data /home/segher/src/gcc/gcc/lra-int.h:488 0x109625d7 lra_update_insn_regno_info(rtx_insn*) /home/segher/src/gcc/gcc/lra.c:1625 0x10962d03 lra_update_insn_regno_info(rtx_insn*) /home/segher/src/gcc/gcc/lra.c:1623 0x10962d03 lra_push_insn_1 /home/segher/src/gcc/gcc/lra.c:1780 [etc] This means LRA found an unrecognised insn; and that insn is (insn 817 804 818 21 (set (reg:DI 324) (sign_extract:DI (ashift:DI (subreg:DI (reg:SI 232) 0) (const_int 3 [0x3])) (const_int 35 [0x23]) (const_int 0 [0]))) "/home/segher/src/kernel/kernel/cgroup/cgroup.c":1747:3 -1 (nil)) LRA created that as a reload for (insn 347 819 348 21 (parallel [ (set (mem/f:DI (reg:DI 324) [233 *__p_84+0 S8 A64]) (asm_operands/v:DI ("stlr %1, %0") ("=Q") 0 [ (reg:DI 325 [orig:106 prephitmp_18 ] [106]) ] [ (asm_input:DI ("r") /home/segher/src/kernel/kernel/cgroup/cgroup.c:1747) ] [] /home/segher/src/kernel/kernel/cgroup/cgroup.c:1747)) (clobber (mem:BLK (scratch) [0 A8])) ]) "/home/segher/src/kernel/kernel/cgroup/cgroup.c":1747:3 -1 (expr_list:REG_DEAD (reg:SI 232) (expr_list:REG_DEAD (reg:DI 106 [ prephitmp_18 ]) (nil)))) as 347: {[r324:DI]=asm_operands;clobber [scratch];} REG_DEAD r232:SI REG_DEAD r106:DI Inserting insn reload before: 817: r324:DI=sign_extract(r232:SI#0<<0x3,0x23,0) 818: r324:DI=r324:DI+r284:DI 819: r325:DI=r106:DI (and then it died). Can you fix this first? There probably is something target-specific wrong related to zero_extract. Segher