On Thu, Jun 19, 2025 at 9:01 AM Hongtao Liu <crazy...@gmail.com> wrote:
>
> On Wed, Jun 18, 2025 at 6:38 PM 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.
> >
> > added "*mov<mode>_and" and extended "*mov<mode>_or" to transform
> > "mov $0,mem" to the shorter "and $0,mem" and "mov $-1,mem" to the shorter
> > "or $-1,mem" for -Oz.  But the new pattern:
> >
> > (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")])
> >
> > and the extended pattern:
> >
> > (define_insn "*mov<mode>_or"
> >   [(set (match_operand:SWI248 0 "nonimmediate_operand" "=rm")
> >     (match_operand:SWI248 1 "constm1_operand"))
> >    (clobber (reg:CC FLAGS_REG))]
> >   "reload_completed"
> >   "or{<imodesuffix>}\t{%1, %0|%0, %1}"
> >   [(set_attr "type" "alu1")
> >    (set_attr "mode" "<MODE>")
> >    (set_attr "length_immediate" "1")])
> >
> > aren't guarded for -Oz.  As a result, "and $0,mem" and "or $-1,mem" are
> > generated without -Oz.
> >
> > 1. Change *mov<mode>_and" to define_insn_and_split and split it to
> > "mov $0,mem" if not -Oz.
> > 2. Change "*mov<mode>_or" to define_insn_and_split and split it to
> > "mov $-1,mem" if not -Oz.
> > 3. Don't transform "mov $-1,reg" to "push $-1; pop reg" for -Oz since it
> > should be transformed to "or $-1,reg".
>
> Ok for me, but please hold for a few days in case Uros or Roger has
> any comments.

LGTM from my side.

Thanks,
Uros.

>
> >
> > gcc/
> >
> > PR target/120427
> > * config/i386/i386.md (*mov<mode>_and): Changed to
> > define_insn_and_split.  Split it to "mov $0,mem" if not -Oz.
> > (*mov<mode>_or): Changed to define_insn_and_split.  Split it
> > to "mov $-1,mem" if not -Oz.
> > (peephole2): Don't transform "mov $-1,reg" to "push $-1; pop reg"
> > for -Oz since it will be transformed to "or $-1,reg".
> >
> > gcc/testsuite/
> >
> > PR target/120427
> > * gcc.target/i386/cold-attribute-4.c: Compile with -Oz.
> > * gcc.target/i386/pr120427-1.c: New test.
> > * gcc.target/i386/pr120427-2.c: Likewise.
> > * gcc.target/i386/pr120427-3.c: Likewise.
> > * gcc.target/i386/pr120427-4.c: Likewise.
> >
> >
> > --
> > H.J.
>
>
>
> --
> BR,
> Hongtao

Reply via email to