aboutsummaryrefslogtreecommitdiff
path: root/libcpp
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2025-10-24 09:00:59 +0800
committerH.J. Lu <hjl.tools@gmail.com>2025-12-07 12:03:15 +0800
commita6c50ec2c6ebcbda2b032eee0552a6a486355e12 (patch)
treeacc2e0b80f923a9b72f2f98082f8fe669ca6f95a /libcpp
parent83739ee76da65ddf56a1be3eda253e2ad0fa5ab8 (diff)
downloadgcc-a6c50ec2c6ebcbda2b032eee0552a6a486355e12.zip
gcc-a6c50ec2c6ebcbda2b032eee0552a6a486355e12.tar.gz
gcc-a6c50ec2c6ebcbda2b032eee0552a6a486355e12.tar.bz2
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 <hjl.tools@gmail.com>
Diffstat (limited to 'libcpp')
0 files changed, 0 insertions, 0 deletions