https://gcc.gnu.org/bugzilla/show_bug.cgi?id=122343

--- Comment #7 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by H.J. Lu <[email protected]>:

https://gcc.gnu.org/g:a6c50ec2c6ebcbda2b032eee0552a6a486355e12

commit r16-5947-ga6c50ec2c6ebcbda2b032eee0552a6a486355e12
Author: H.J. Lu <[email protected]>
Date:   Fri Oct 24 09:00:59 2025 +0800

    Add -ffuse-ops-with-volatile-access

    Volatile memory can be used as source operand for any operations.  Add
    -ffuse-ops-with-volatile-access to fuse operations with volatile memory
    reference and update simplify_binary_operation_1 to keep PLUS for 2
    volatile memory references.  On x86, this optimizes

    extern volatile int bar;

    int
    foo (int z)
    {
      z *= 123;
      return bar + z;
    }

    into

    foo:
            imull   $123, %edi, %eax
            addl    bar(%rip), %eax
            ret

    and compile

    extern volatile unsigned char u8;

    void
    test (void)
    {
      u8 = u8 + u8;
      u8 = u8 - u8;
    }

    into

    test:
            movzbl  u8(%rip), %eax
            addb    %al, u8(%rip)
            movzbl  u8(%rip), %eax
            subb    u8(%rip), %al
            movb    %al, u8(%rip)
            ret

    Tested with Linux kernel 6.17.9 on Intel Core i7-1195G7.

    gcc/

            PR target/122343
            * common.opt: Add -ffuse-ops-with-volatile-access.
            * common.opt.urls: Regenerated.
            * recog.cc (general_operand): Allow volatile memory reference if
            -ffuse-ops-with-volatile-access is enabled.
            * simplify-rtx.cc (simplify_binary_operation_1): Keep PLUS for 2
            volatile memory references.
            * doc/invoke.texi: Document -ffuse-ops-with-volatile-access.

    gcc/testsuite/

            PR target/122343
            * gcc.target/i386/20040112-1.c: Add -fomit-frame-pointer and use
            check-function-bodies to check for loop.
            * gcc.target/i386/avx-ne-convert-1.c: Compile with
            -fno-fuse-ops-with-volatile-access.
            * gcc.target/i386/avx10_2-bf16-1.c: Likewise.
            * gcc.target/i386/avx10_2-convert-1.c: Likewise.
            * gcc.target/i386/avx10_2-satcvt-1.c: Likewise.
            * gcc.target/i386/avx512bf16-vcvtneps2bf16-1.c: Likewise.
            * gcc.target/i386/avx512bf16vl-vcvtneps2bf16-1a.c: Likewise.
            * gcc.target/i386/avx512bf16vl-vcvtneps2bf16-1b.c: Likewise.
            * gcc.target/i386/avx512bitalg-vpshufbitqmb.c: Likewise.
            * gcc.target/i386/avx512bw-vpcmpb-1.c: Likewise.
            * gcc.target/i386/avx512bw-vpcmpub-1.c: Likewise.
            * gcc.target/i386/avx512bw-vpcmpuw-1.c: Likewise.
            * gcc.target/i386/avx512bw-vpcmpw-1.c: Likewise.
            * gcc.target/i386/avx512dq-vcvtps2qq-1.c: Likewise.
            * gcc.target/i386/avx512dq-vcvtps2uqq-1.c: Likewise.
            * gcc.target/i386/avx512dq-vcvtqq2pd-1.c: Likewise.
            * gcc.target/i386/avx512dq-vcvtqq2ps-1.c: Likewise.
            * gcc.target/i386/avx512dq-vcvttps2qq-1.c: Likewise.
            * gcc.target/i386/avx512dq-vcvttps2uqq-1.c: Likewise.
            * gcc.target/i386/avx512dq-vcvtuqq2pd-1.c: Likewise.
            * gcc.target/i386/avx512dq-vcvtuqq2ps-1.c: Likewise.
            * gcc.target/i386/avx512dq-vextractf32x8-1.c: Likewise.
            * gcc.target/i386/avx512dq-vextractf64x2-1.c: Likewise.
            * gcc.target/i386/avx512dq-vextracti64x2-1.c: Likewise.
            * gcc.target/i386/avx512dq-vfpclasspd-1.c: Likewise.
            * gcc.target/i386/avx512dq-vfpclassps-1.c: Likewise.
            * gcc.target/i386/avx512dq-vfpclasssd-1.c: Likewise.
            * gcc.target/i386/avx512dq-vfpclassss-1.c: Likewise.
            * gcc.target/i386/avx512dq-vpmullq-1.c: Likewise.
            * gcc.target/i386/avx512dq-vpmullq-3.c: Likewise.
            * gcc.target/i386/avx512f-pr100267-1.c: Likewise.
            * gcc.target/i386/avx512f-vcmppd-1.c: Likewise.
            * gcc.target/i386/avx512f-vcmpps-1.c: Likewise.
            * gcc.target/i386/avx512f-vcvtps2pd-1.c: Likewise.
            * gcc.target/i386/avx512f-vcvtsd2si-1.c: Likewise.
            * gcc.target/i386/avx512f-vcvtsd2si64-1.c: Likewise.
            * gcc.target/i386/avx512f-vcvtsd2usi-1.c: Likewise.
            * gcc.target/i386/avx512f-vcvtsd2usi64-1.c: Likewise.
            * gcc.target/i386/avx512f-vcvtsi2ss-1.c: Likewise.
            * gcc.target/i386/avx512f-vcvtss2si-1.c: Likewise.
            * gcc.target/i386/avx512f-vcvtss2si64-1.c: Likewise.
            * gcc.target/i386/avx512f-vcvtss2usi-1.c: Likewise.
            * gcc.target/i386/avx512f-vcvtss2usi64-1.c: Likewise.
            * gcc.target/i386/avx512f-vcvttsd2si-1.c: Likewise.
            * gcc.target/i386/avx512f-vcvttsd2si64-1.c: Likewise.
            * gcc.target/i386/avx512f-vcvttsd2usi-1.c: Likewise.
            * gcc.target/i386/avx512f-vcvttsd2usi64-1.c: Likewise.
            * gcc.target/i386/avx512f-vcvttss2si-1.c: Likewise.
            * gcc.target/i386/avx512f-vcvttss2si64-1.c: Likewise.
            * gcc.target/i386/avx512f-vcvttss2usi-1.c: Likewise.
            * gcc.target/i386/avx512f-vcvttss2usi64-1.c: Likewise.
            * gcc.target/i386/avx512f-vextractf32x4-1.c: Likewise.
            * gcc.target/i386/avx512f-vextractf64x4-1.c: Likewise.
            * gcc.target/i386/avx512f-vextracti64x4-1.c: Likewise.
            * gcc.target/i386/avx512f-vmovapd-1.c: Likewise.
            * gcc.target/i386/avx512f-vmovaps-1.c: Likewise.
            * gcc.target/i386/avx512f-vmovdqa64-1.c: Likewise.
            * gcc.target/i386/avx512f-vpandnq-1.c: Likewise.
            * gcc.target/i386/avx512f-vpbroadcastd-1.c: Likewise.
            * gcc.target/i386/avx512f-vpbroadcastq-1.c: Likewise.
            * gcc.target/i386/avx512f-vpcmpd-1.c: Likewise.
            * gcc.target/i386/avx512f-vpcmpeqq-1.c: Likewise.
            * gcc.target/i386/avx512f-vpcmpequq-1.c: Likewise.
            * gcc.target/i386/avx512f-vpcmpged-1.c: Likewise.
            * gcc.target/i386/avx512f-vpcmpgeq-1.c: Likewise.
            * gcc.target/i386/avx512f-vpcmpgeud-1.c: Likewise.
            * gcc.target/i386/avx512f-vpcmpgeuq-1.c: Likewise.
            * gcc.target/i386/avx512f-vpcmpled-1.c: Likewise.
            * gcc.target/i386/avx512f-vpcmpleq-1.c: Likewise.
            * gcc.target/i386/avx512f-vpcmpleud-1.c: Likewise.
            * gcc.target/i386/avx512f-vpcmpleuq-1.c: Likewise.
            * gcc.target/i386/avx512f-vpcmpltd-1.c: Likewise.
            * gcc.target/i386/avx512f-vpcmpltq-1.c: Likewise.
            * gcc.target/i386/avx512f-vpcmpltud-1.c: Likewise.
            * gcc.target/i386/avx512f-vpcmpltuq-1.c: Likewise.
            * gcc.target/i386/avx512f-vpcmpneqd-1.c: Likewise.
            * gcc.target/i386/avx512f-vpcmpneqq-1.c: Likewise.
            * gcc.target/i386/avx512f-vpcmpnequd-1.c: Likewise.
            * gcc.target/i386/avx512f-vpcmpnequq-1.c: Likewise.
            * gcc.target/i386/avx512f-vpcmpq-1.c: Likewise.
            * gcc.target/i386/avx512f-vpcmpud-1.c: Likewise.
            * gcc.target/i386/avx512f-vpcmpuq-1.c: Likewise.
            * gcc.target/i386/avx512f-vrndscalepd-1.c: Likewise.
            * gcc.target/i386/avx512f-vrndscaleps-1.c: Likewise.
            * gcc.target/i386/avx512fp16-complex-fma.c: Likewise.
            * gcc.target/i386/avx512fp16-vaddph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vcvtpd2ph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vcvtph2dq-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vcvtph2pd-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vcvtph2psx-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vcvtph2qq-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vcvtph2udq-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vcvtph2uqq-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vcvtph2uw-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vcvtph2w-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vcvtps2ph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vcvtqq2ph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vcvttph2dq-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vcvttph2qq-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vcvttph2udq-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vcvttph2uqq-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vcvttph2uw-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vcvttph2w-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vcvtuqq2ph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vfcmaddcph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vfcmulcph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vfmaddcph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vfmulcph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vfpclassph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vfpclasssh-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vmulph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vrcpph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vrsqrtph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16-vsqrtph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vaddph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vcvtpd2ph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vcvtph2dq-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vcvtph2psx-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vcvtph2qq-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vcvtph2udq-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vcvtph2uqq-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vcvtph2uw-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vcvtph2w-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vcvtps2ph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vcvtqq2ph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vcvttph2dq-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vcvttph2udq-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vcvttph2uw-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vcvttph2w-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vcvtuqq2ph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vfcmaddcph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vfcmulcph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vfmaddcph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vfmulcph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vfpclassph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vmulph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vrcpph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vrsqrtph-1a.c: Likewise.
            * gcc.target/i386/avx512fp16vl-vsqrtph-1a.c: Likewise.
            * gcc.target/i386/avx512vl-pr100267-1.c: Likewise.
            * gcc.target/i386/avx512vl-vcmppd-1.c: Likewise.
            * gcc.target/i386/avx512vl-vcmpps-1.c: Likewise.
            * gcc.target/i386/avx512vl-vcvtpd2ps-1.c: Likewise.
            * gcc.target/i386/avx512vl-vcvtpd2udq-1.c: Likewise.
            * gcc.target/i386/avx512vl-vcvttpd2udq-1.c: Likewise.
            * gcc.target/i386/avx512vl-vcvttps2udq-1.c: Likewise.
            * gcc.target/i386/avx512vl-vextractf32x4-1.c: Likewise.
            * gcc.target/i386/avx512vl-vmovapd-1.c: Likewise.
            * gcc.target/i386/avx512vl-vmovaps-1.c: Likewise.
            * gcc.target/i386/avx512vl-vmovdqa64-1.c: Likewise.
            * gcc.target/i386/avx512vl-vpcmpd-1.c: Likewise.
            * gcc.target/i386/avx512vl-vpcmpeqq-1.c: Likewise.
            * gcc.target/i386/avx512vl-vpcmpequq-1.c: Likewise.
            * gcc.target/i386/avx512vl-vpcmpq-1.c: Likewise.
            * gcc.target/i386/avx512vl-vpcmpud-1.c: Likewise.
            * gcc.target/i386/avx512vl-vpcmpuq-1.c: Likewise.
            * gcc.target/i386/pr122343-1a.c: New test.
            * gcc.target/i386/pr122343-1b.c: Likewise.
            * gcc.target/i386/pr122343-2a.c: Likewise.
            * gcc.target/i386/pr122343-2b.c: Likewise.
            * gcc.target/i386/pr122343-3.c: Likewise.
            * gcc.target/i386/pr122343-4a.c: Likewise.
            * gcc.target/i386/pr122343-4b.c: Likewise.
            * gcc.target/i386/pr122343-5a.c: Likewise.
            * gcc.target/i386/pr122343-5b.c: Likewise.
            * gcc.target/i386/pr122343-6a.c: Likewise.
            * gcc.target/i386/pr122343-6b.c: Likewise.
            * gcc.target/i386/pr122343-7.c: Likewise.

    Signed-off-by: H.J. Lu <[email protected]>

Reply via email to