Georg-Johann Lay <a...@gjlay.de> writes: > Ping for https://gcc.gnu.org/pipermail/gcc-patches/2025-January/673336.html > > Am 11.01.25 um 14:09 schrieb Georg-Johann Lay: >> The patch below is for trunk. >> Andrew Pinski says he has a patch to fix it, bit that won't >> materialize >> before v16. >> AVR: PR118012 - Try to work around sick code from match.pd. >> This patch tries to work around PR118012 which may use a >> full fledged multiplication instead of a simple bit test. >> This is because match.pd's >> /* (zero_one == 0) ? y : z <op> y -> ((typeof(y))zero_one * z) <op> >> y */ >> /* (zero_one != 0) ? z <op> y : y -> ((typeof(y))zero_one * z) <op> y */ >> "optimizes" code with op in { plus, ior, xor } like >> if (a & 1) >> b = b <op> c; >> to something like: >> x1 = EXTRACT_BIT0 (a); >> x2 = c MULT x1; >> b = b <op> x2; >> or >> x1 = EXTRACT_BIT0 (a); >> x2 = ZERO_EXTEND (x1); >> x3 = NEG x2; >> x4 = a AND x3: >> b = b <op> x4; >> which is very expensive and may even result in a libgcc call for >> a 32-bit multiplication on devices that don't even have MUL. >> Notice that EXTRACT_BIT0 is already more expensive (slower, more >> code, more register pressure) than a bit-test + branch. >> The patch: >> o Adds some combiner patterns that try to map sick code back >> to a bit test + branch. >> o Adjusts costs to make MULT (x AND 1) cheap, in the hope that the >> middle-end will use that alternative (which we map to sane code). >> o On devices without MUL, 32-bit multiplication was performed by a >> library call, which bypasses the MULT (x AND 1) and similar patterns. >> Therefore, mulsi3 is also allowed for devices without MUL so that >> we get at MULT pattern that can be transformed. (Though this is >> not possible on AVR_TINY since it passes arguments on the stack). >> o Add a new command line option -mpr118012, so most of the patterns >> and cost computations can be switched off as they have >> avropt_pr118012 in their insn condition. >> o Added sign-extract.0 patterns unconditionally (no >> avropt_pr118012). >> Notice that this patch is just a work-around, it's not a fix of the >> root cause, which are the patterns in match.pd that don't care about >> the target and don't even care about costs. >> The work-around is incomplete, and 3 of the new tests are still >> failing. >> This is because there are situations where it does not work: >> * The MULT is realized as a library call. >> * The MULT is realized as an ASHIFT, and the ASHIFT again is >> transformed >> into something else. For example, with -O2 -mmcu=atmega128, >> ASHIFT(3) is transformed into ASHIFT(1) + ASHIFT(2). >> PR tree-optimization/118012 >> PR tree-optimization/118360 >> gcc/ >> * config/avr/avr.opt (-mpr118012): New undocumented option. >> * config/avr/avr-protos.h (avr_out_sextr) >> (avr_emit_skip_pixop, avr_emit_skip_clear): New protos. >> * config/avr/avr.cc (avr_adjust_insn_length) >> [case ADJUST_LEN_SEXTR]: Handle case. >> (avr_rtx_costs_1) [NEG]: Costs for NEG (ZERO_EXTEND (ZERO_EXTRACT)). >> [MULT && avropt_pr118012]: Costs for MULT (x AND 1). >> (avr_out_sextr, avr_emit_skip_pixop, avr_emit_skip_clear): New >> functions. >> * config/avr/avr.md [avropt_pr118012]: Add combine patterns with >> that condition that try to work around PR118012. >> (adjust_len) <sextr>: Add insn attr value. >> (pixop): New code iterator. >> (mulsi3) [avropt_pr118012 && !AVR_TINY]: Allow these in insn >> condition. >> gcc/testsuite/ >> * gcc.target/avr/mmcu/pr118012-1.h: New file. >> * gcc.target/avr/mmcu/pr118012-1-o2-m128.c: New test. >> * gcc.target/avr/mmcu/pr118012-1-os-m128.c: New test. >> * gcc.target/avr/mmcu/pr118012-1-o2-m103.c: New test. >> * gcc.target/avr/mmcu/pr118012-1-os-m103.c: New test. >> * gcc.target/avr/mmcu/pr118012-1-o2-t40.c: New test. >> * gcc.target/avr/mmcu/pr118012-1-os-t40.c: New test. >> * gcc.target/avr/mmcu/pr118360-1.h: New file. >> * gcc.target/avr/mmcu/pr118360-1-o2-m128.c: New test. >> * gcc.target/avr/mmcu/pr118360-1-os-m128.c: New test. >> * gcc.target/avr/mmcu/pr118360-1-o2-m103.c: New test. >> * gcc.target/avr/mmcu/pr118360-1-os-m103.c: New test. >> * gcc.target/avr/mmcu/pr118360-1-o2-t40.c: New test. >> * gcc.target/avr/mmcu/pr118360-1-os-t40.c: New test.
Approved. Please apply. Denis. PS: probably I miss the patch