On Wed, Jun 18, 2025 at 2:30 PM Hongtao Liu <crazy...@gmail.com> wrote: > > On Mon, May 26, 2025 at 2:30 PM H.J. Lu <hjl.to...@gmail.com> wrote: > > > > On Sun, May 25, 2025 at 7:02 PM H.J. Lu <hjl.to...@gmail.com> wrote: > > > > > > On Sun, May 25, 2025 at 8:12 AM H.J. Lu <hjl.to...@gmail.com> wrote: > > > > > > > > On Sun, May 25, 2025 at 7:47 AM H.J. Lu <hjl.to...@gmail.com> wrote: > > > > > > > > > > commit ef26c151c14a87177d46fd3d725e7f82e040e89f > > > > > Author: Roger Sayle <ro...@nextmovesoftware.com> > > > > > Date: Thu Dec 23 12:33:07 2021 +0000 > > > > > > > > > > x86: PR target/103773: Fix wrong-code with -Oz from pop to memory. > > > > > > > > > > transformed "mov $0,mem" to the shorter and "$0,mem" for -Oz. But > > > > > > > > > > (define_insn "*mov<mode>_and" > > > > > [(set (match_operand:SWI248 0 "memory_operand" "=m") > > > > > (match_operand:SWI248 1 "const0_operand")) > > > > > (clobber (reg:CC FLAGS_REG))] > > > > > "reload_completed" > > > > > "and{<imodesuffix>}\t{%1, %0|%0, %1}" > > > > > [(set_attr "type" "alu1") > > > > > (set_attr "mode" "<MODE>") > > > > > (set_attr "length_immediate" "1")]) > > > > > > > > > > isn't guarded for -Oz. As a result, "and $0,mem" is generated without > > > > > -Oz. Enable *mov<mode>_and only for -Oz. > > > > > > > > > > gcc/ > > > > > > > > > > PR target/120427 > > > > > * config/i386/i386.md (*mov<mode>_and): Enable only for -Oz. > > > > > > > > > > gcc/testsuite/ > > > > > > > > > > PR target/120427 > > > > > * gcc.target/i386/pr120427.c: New test. > > > > > > > > > > OK for master? > > > > > > > > > > > > > "mov $-1,mem" has the same issue. Here is the updated patch to also > > > > enable "or $-1,mem" only for -Oz. > > > > > > > > OK for master? > > > > > > It doesn't work since "*mov<mode>_or" was extended from load. Here is > > > the v2 patch: > > > > > > 1. Add "*mov<mode>_or_store" for "or $-1,mem". > > > 2. Rename "*mov<mode>_or" to "*mov<mode>_or_load", replacing > > > nonimmediate_operand with register_operand. > > > 3. Enable "*mov<mode>_and" and "*mov<mode>_or_store" only for -Oz. > > > > > > Tested on x86-64. > > > > Here is the v3 patch. Change "*mov<mode>_or" to define_insn_and_split > > and split it to "mov $-1,mem" if not -Oz. Don't transform "mov $-1,reg" to > > "push $-1; pop reg" for -Oz since it should be transformed to "or $-1,reg". > > > > Tested on x86-64. OK for master? > > >@@ -2442,18 +2442,24 @@ (define_insn "*mov<mode>_and" > > [(set (match_operand:SWI248 0 "memory_operand" "=m") > > (match_operand:SWI248 1 "const0_operand")) > > (clobber (reg:CC FLAGS_REG))] > >- "reload_completed" > >+ "reload_completed > >+ && optimize_insn_for_size_p () && optimize_size > 1" > > Can we also change *mov<mode>_and to define_insn_and_split similar as > you did for *mov<mode>_or?
Fixed. > >--- a/gcc/testsuite/gcc.target/i386/cold-attribute-4.c > >+++ b/gcc/testsuite/gcc.target/i386/cold-attribute-4.c > >@@ -1,5 +1,5 @@ > > /* { dg-do compile } */ > >-/* { dg-options "-O2" } */ > >+/* { dg-options "-Oz" } */ > > #include <string.h> > > > >int > >__attribute__ ((cold)) > >t(int c) > >{ > > return -1; > >} > > There's a COLD attribute for the function, so I assume the function > will be compiled with Oz internally and no need to change the option? This change is needed since __attribute__ ((cold)) doesn't imply -Oz. Will send the v4 patch later. Thanks. -- H.J.