diff options
author | Martin Liska <mliska@suse.cz> | 2022-01-14 16:56:44 +0100 |
---|---|---|
committer | Martin Liska <mliska@suse.cz> | 2022-01-17 22:12:04 +0100 |
commit | 5c69acb32329d49e58c26fa41ae74229a52b9106 (patch) | |
tree | ddb05f9d73afb6f998457d2ac4b720e3b3b60483 /gcc/tree-ssa-dse.c | |
parent | 490e23032baaece71f2ec09fa1805064b150fbc2 (diff) | |
download | gcc-5c69acb32329d49e58c26fa41ae74229a52b9106.zip gcc-5c69acb32329d49e58c26fa41ae74229a52b9106.tar.gz gcc-5c69acb32329d49e58c26fa41ae74229a52b9106.tar.bz2 |
Rename .c files to .cc files.
gcc/ada/ChangeLog:
* adadecode.c: Moved to...
* adadecode.cc: ...here.
* affinity.c: Moved to...
* affinity.cc: ...here.
* argv-lynxos178-raven-cert.c: Moved to...
* argv-lynxos178-raven-cert.cc: ...here.
* argv.c: Moved to...
* argv.cc: ...here.
* aux-io.c: Moved to...
* aux-io.cc: ...here.
* cio.c: Moved to...
* cio.cc: ...here.
* cstreams.c: Moved to...
* cstreams.cc: ...here.
* env.c: Moved to...
* env.cc: ...here.
* exit.c: Moved to...
* exit.cc: ...here.
* expect.c: Moved to...
* expect.cc: ...here.
* final.c: Moved to...
* final.cc: ...here.
* gcc-interface/cuintp.c: Moved to...
* gcc-interface/cuintp.cc: ...here.
* gcc-interface/decl.c: Moved to...
* gcc-interface/decl.cc: ...here.
* gcc-interface/misc.c: Moved to...
* gcc-interface/misc.cc: ...here.
* gcc-interface/targtyps.c: Moved to...
* gcc-interface/targtyps.cc: ...here.
* gcc-interface/trans.c: Moved to...
* gcc-interface/trans.cc: ...here.
* gcc-interface/utils.c: Moved to...
* gcc-interface/utils.cc: ...here.
* gcc-interface/utils2.c: Moved to...
* gcc-interface/utils2.cc: ...here.
* init.c: Moved to...
* init.cc: ...here.
* initialize.c: Moved to...
* initialize.cc: ...here.
* libgnarl/thread.c: Moved to...
* libgnarl/thread.cc: ...here.
* link.c: Moved to...
* link.cc: ...here.
* locales.c: Moved to...
* locales.cc: ...here.
* mkdir.c: Moved to...
* mkdir.cc: ...here.
* raise.c: Moved to...
* raise.cc: ...here.
* rtfinal.c: Moved to...
* rtfinal.cc: ...here.
* rtinit.c: Moved to...
* rtinit.cc: ...here.
* seh_init.c: Moved to...
* seh_init.cc: ...here.
* sigtramp-armdroid.c: Moved to...
* sigtramp-armdroid.cc: ...here.
* sigtramp-ios.c: Moved to...
* sigtramp-ios.cc: ...here.
* sigtramp-qnx.c: Moved to...
* sigtramp-qnx.cc: ...here.
* sigtramp-vxworks.c: Moved to...
* sigtramp-vxworks.cc: ...here.
* socket.c: Moved to...
* socket.cc: ...here.
* tracebak.c: Moved to...
* tracebak.cc: ...here.
* version.c: Moved to...
* version.cc: ...here.
* vx_stack_info.c: Moved to...
* vx_stack_info.cc: ...here.
gcc/ChangeLog:
* adjust-alignment.c: Moved to...
* adjust-alignment.cc: ...here.
* alias.c: Moved to...
* alias.cc: ...here.
* alloc-pool.c: Moved to...
* alloc-pool.cc: ...here.
* asan.c: Moved to...
* asan.cc: ...here.
* attribs.c: Moved to...
* attribs.cc: ...here.
* auto-inc-dec.c: Moved to...
* auto-inc-dec.cc: ...here.
* auto-profile.c: Moved to...
* auto-profile.cc: ...here.
* bb-reorder.c: Moved to...
* bb-reorder.cc: ...here.
* bitmap.c: Moved to...
* bitmap.cc: ...here.
* btfout.c: Moved to...
* btfout.cc: ...here.
* builtins.c: Moved to...
* builtins.cc: ...here.
* caller-save.c: Moved to...
* caller-save.cc: ...here.
* calls.c: Moved to...
* calls.cc: ...here.
* ccmp.c: Moved to...
* ccmp.cc: ...here.
* cfg.c: Moved to...
* cfg.cc: ...here.
* cfganal.c: Moved to...
* cfganal.cc: ...here.
* cfgbuild.c: Moved to...
* cfgbuild.cc: ...here.
* cfgcleanup.c: Moved to...
* cfgcleanup.cc: ...here.
* cfgexpand.c: Moved to...
* cfgexpand.cc: ...here.
* cfghooks.c: Moved to...
* cfghooks.cc: ...here.
* cfgloop.c: Moved to...
* cfgloop.cc: ...here.
* cfgloopanal.c: Moved to...
* cfgloopanal.cc: ...here.
* cfgloopmanip.c: Moved to...
* cfgloopmanip.cc: ...here.
* cfgrtl.c: Moved to...
* cfgrtl.cc: ...here.
* cgraph.c: Moved to...
* cgraph.cc: ...here.
* cgraphbuild.c: Moved to...
* cgraphbuild.cc: ...here.
* cgraphclones.c: Moved to...
* cgraphclones.cc: ...here.
* cgraphunit.c: Moved to...
* cgraphunit.cc: ...here.
* collect-utils.c: Moved to...
* collect-utils.cc: ...here.
* collect2-aix.c: Moved to...
* collect2-aix.cc: ...here.
* collect2.c: Moved to...
* collect2.cc: ...here.
* combine-stack-adj.c: Moved to...
* combine-stack-adj.cc: ...here.
* combine.c: Moved to...
* combine.cc: ...here.
* common/common-targhooks.c: Moved to...
* common/common-targhooks.cc: ...here.
* common/config/aarch64/aarch64-common.c: Moved to...
* common/config/aarch64/aarch64-common.cc: ...here.
* common/config/alpha/alpha-common.c: Moved to...
* common/config/alpha/alpha-common.cc: ...here.
* common/config/arc/arc-common.c: Moved to...
* common/config/arc/arc-common.cc: ...here.
* common/config/arm/arm-common.c: Moved to...
* common/config/arm/arm-common.cc: ...here.
* common/config/avr/avr-common.c: Moved to...
* common/config/avr/avr-common.cc: ...here.
* common/config/bfin/bfin-common.c: Moved to...
* common/config/bfin/bfin-common.cc: ...here.
* common/config/bpf/bpf-common.c: Moved to...
* common/config/bpf/bpf-common.cc: ...here.
* common/config/c6x/c6x-common.c: Moved to...
* common/config/c6x/c6x-common.cc: ...here.
* common/config/cr16/cr16-common.c: Moved to...
* common/config/cr16/cr16-common.cc: ...here.
* common/config/cris/cris-common.c: Moved to...
* common/config/cris/cris-common.cc: ...here.
* common/config/csky/csky-common.c: Moved to...
* common/config/csky/csky-common.cc: ...here.
* common/config/default-common.c: Moved to...
* common/config/default-common.cc: ...here.
* common/config/epiphany/epiphany-common.c: Moved to...
* common/config/epiphany/epiphany-common.cc: ...here.
* common/config/fr30/fr30-common.c: Moved to...
* common/config/fr30/fr30-common.cc: ...here.
* common/config/frv/frv-common.c: Moved to...
* common/config/frv/frv-common.cc: ...here.
* common/config/gcn/gcn-common.c: Moved to...
* common/config/gcn/gcn-common.cc: ...here.
* common/config/h8300/h8300-common.c: Moved to...
* common/config/h8300/h8300-common.cc: ...here.
* common/config/i386/i386-common.c: Moved to...
* common/config/i386/i386-common.cc: ...here.
* common/config/ia64/ia64-common.c: Moved to...
* common/config/ia64/ia64-common.cc: ...here.
* common/config/iq2000/iq2000-common.c: Moved to...
* common/config/iq2000/iq2000-common.cc: ...here.
* common/config/lm32/lm32-common.c: Moved to...
* common/config/lm32/lm32-common.cc: ...here.
* common/config/m32r/m32r-common.c: Moved to...
* common/config/m32r/m32r-common.cc: ...here.
* common/config/m68k/m68k-common.c: Moved to...
* common/config/m68k/m68k-common.cc: ...here.
* common/config/mcore/mcore-common.c: Moved to...
* common/config/mcore/mcore-common.cc: ...here.
* common/config/microblaze/microblaze-common.c: Moved to...
* common/config/microblaze/microblaze-common.cc: ...here.
* common/config/mips/mips-common.c: Moved to...
* common/config/mips/mips-common.cc: ...here.
* common/config/mmix/mmix-common.c: Moved to...
* common/config/mmix/mmix-common.cc: ...here.
* common/config/mn10300/mn10300-common.c: Moved to...
* common/config/mn10300/mn10300-common.cc: ...here.
* common/config/msp430/msp430-common.c: Moved to...
* common/config/msp430/msp430-common.cc: ...here.
* common/config/nds32/nds32-common.c: Moved to...
* common/config/nds32/nds32-common.cc: ...here.
* common/config/nios2/nios2-common.c: Moved to...
* common/config/nios2/nios2-common.cc: ...here.
* common/config/nvptx/nvptx-common.c: Moved to...
* common/config/nvptx/nvptx-common.cc: ...here.
* common/config/or1k/or1k-common.c: Moved to...
* common/config/or1k/or1k-common.cc: ...here.
* common/config/pa/pa-common.c: Moved to...
* common/config/pa/pa-common.cc: ...here.
* common/config/pdp11/pdp11-common.c: Moved to...
* common/config/pdp11/pdp11-common.cc: ...here.
* common/config/pru/pru-common.c: Moved to...
* common/config/pru/pru-common.cc: ...here.
* common/config/riscv/riscv-common.c: Moved to...
* common/config/riscv/riscv-common.cc: ...here.
* common/config/rs6000/rs6000-common.c: Moved to...
* common/config/rs6000/rs6000-common.cc: ...here.
* common/config/rx/rx-common.c: Moved to...
* common/config/rx/rx-common.cc: ...here.
* common/config/s390/s390-common.c: Moved to...
* common/config/s390/s390-common.cc: ...here.
* common/config/sh/sh-common.c: Moved to...
* common/config/sh/sh-common.cc: ...here.
* common/config/sparc/sparc-common.c: Moved to...
* common/config/sparc/sparc-common.cc: ...here.
* common/config/tilegx/tilegx-common.c: Moved to...
* common/config/tilegx/tilegx-common.cc: ...here.
* common/config/tilepro/tilepro-common.c: Moved to...
* common/config/tilepro/tilepro-common.cc: ...here.
* common/config/v850/v850-common.c: Moved to...
* common/config/v850/v850-common.cc: ...here.
* common/config/vax/vax-common.c: Moved to...
* common/config/vax/vax-common.cc: ...here.
* common/config/visium/visium-common.c: Moved to...
* common/config/visium/visium-common.cc: ...here.
* common/config/xstormy16/xstormy16-common.c: Moved to...
* common/config/xstormy16/xstormy16-common.cc: ...here.
* common/config/xtensa/xtensa-common.c: Moved to...
* common/config/xtensa/xtensa-common.cc: ...here.
* compare-elim.c: Moved to...
* compare-elim.cc: ...here.
* config/aarch64/aarch64-bti-insert.c: Moved to...
* config/aarch64/aarch64-bti-insert.cc: ...here.
* config/aarch64/aarch64-builtins.c: Moved to...
* config/aarch64/aarch64-builtins.cc: ...here.
* config/aarch64/aarch64-c.c: Moved to...
* config/aarch64/aarch64-c.cc: ...here.
* config/aarch64/aarch64-d.c: Moved to...
* config/aarch64/aarch64-d.cc: ...here.
* config/aarch64/aarch64.c: Moved to...
* config/aarch64/aarch64.cc: ...here.
* config/aarch64/cortex-a57-fma-steering.c: Moved to...
* config/aarch64/cortex-a57-fma-steering.cc: ...here.
* config/aarch64/driver-aarch64.c: Moved to...
* config/aarch64/driver-aarch64.cc: ...here.
* config/aarch64/falkor-tag-collision-avoidance.c: Moved to...
* config/aarch64/falkor-tag-collision-avoidance.cc: ...here.
* config/aarch64/host-aarch64-darwin.c: Moved to...
* config/aarch64/host-aarch64-darwin.cc: ...here.
* config/alpha/alpha.c: Moved to...
* config/alpha/alpha.cc: ...here.
* config/alpha/driver-alpha.c: Moved to...
* config/alpha/driver-alpha.cc: ...here.
* config/arc/arc-c.c: Moved to...
* config/arc/arc-c.cc: ...here.
* config/arc/arc.c: Moved to...
* config/arc/arc.cc: ...here.
* config/arc/driver-arc.c: Moved to...
* config/arc/driver-arc.cc: ...here.
* config/arm/aarch-common.c: Moved to...
* config/arm/aarch-common.cc: ...here.
* config/arm/arm-builtins.c: Moved to...
* config/arm/arm-builtins.cc: ...here.
* config/arm/arm-c.c: Moved to...
* config/arm/arm-c.cc: ...here.
* config/arm/arm-d.c: Moved to...
* config/arm/arm-d.cc: ...here.
* config/arm/arm.c: Moved to...
* config/arm/arm.cc: ...here.
* config/arm/driver-arm.c: Moved to...
* config/arm/driver-arm.cc: ...here.
* config/avr/avr-c.c: Moved to...
* config/avr/avr-c.cc: ...here.
* config/avr/avr-devices.c: Moved to...
* config/avr/avr-devices.cc: ...here.
* config/avr/avr-log.c: Moved to...
* config/avr/avr-log.cc: ...here.
* config/avr/avr.c: Moved to...
* config/avr/avr.cc: ...here.
* config/avr/driver-avr.c: Moved to...
* config/avr/driver-avr.cc: ...here.
* config/avr/gen-avr-mmcu-specs.c: Moved to...
* config/avr/gen-avr-mmcu-specs.cc: ...here.
* config/avr/gen-avr-mmcu-texi.c: Moved to...
* config/avr/gen-avr-mmcu-texi.cc: ...here.
* config/bfin/bfin.c: Moved to...
* config/bfin/bfin.cc: ...here.
* config/bpf/bpf.c: Moved to...
* config/bpf/bpf.cc: ...here.
* config/bpf/coreout.c: Moved to...
* config/bpf/coreout.cc: ...here.
* config/c6x/c6x.c: Moved to...
* config/c6x/c6x.cc: ...here.
* config/cr16/cr16.c: Moved to...
* config/cr16/cr16.cc: ...here.
* config/cris/cris.c: Moved to...
* config/cris/cris.cc: ...here.
* config/csky/csky.c: Moved to...
* config/csky/csky.cc: ...here.
* config/darwin-c.c: Moved to...
* config/darwin-c.cc: ...here.
* config/darwin-d.c: Moved to...
* config/darwin-d.cc: ...here.
* config/darwin-driver.c: Moved to...
* config/darwin-driver.cc: ...here.
* config/darwin-f.c: Moved to...
* config/darwin-f.cc: ...here.
* config/darwin.c: Moved to...
* config/darwin.cc: ...here.
* config/default-c.c: Moved to...
* config/default-c.cc: ...here.
* config/default-d.c: Moved to...
* config/default-d.cc: ...here.
* config/dragonfly-d.c: Moved to...
* config/dragonfly-d.cc: ...here.
* config/epiphany/epiphany.c: Moved to...
* config/epiphany/epiphany.cc: ...here.
* config/epiphany/mode-switch-use.c: Moved to...
* config/epiphany/mode-switch-use.cc: ...here.
* config/epiphany/resolve-sw-modes.c: Moved to...
* config/epiphany/resolve-sw-modes.cc: ...here.
* config/fr30/fr30.c: Moved to...
* config/fr30/fr30.cc: ...here.
* config/freebsd-d.c: Moved to...
* config/freebsd-d.cc: ...here.
* config/frv/frv.c: Moved to...
* config/frv/frv.cc: ...here.
* config/ft32/ft32.c: Moved to...
* config/ft32/ft32.cc: ...here.
* config/gcn/driver-gcn.c: Moved to...
* config/gcn/driver-gcn.cc: ...here.
* config/gcn/gcn-run.c: Moved to...
* config/gcn/gcn-run.cc: ...here.
* config/gcn/gcn-tree.c: Moved to...
* config/gcn/gcn-tree.cc: ...here.
* config/gcn/gcn.c: Moved to...
* config/gcn/gcn.cc: ...here.
* config/gcn/mkoffload.c: Moved to...
* config/gcn/mkoffload.cc: ...here.
* config/glibc-c.c: Moved to...
* config/glibc-c.cc: ...here.
* config/glibc-d.c: Moved to...
* config/glibc-d.cc: ...here.
* config/h8300/h8300.c: Moved to...
* config/h8300/h8300.cc: ...here.
* config/host-darwin.c: Moved to...
* config/host-darwin.cc: ...here.
* config/host-hpux.c: Moved to...
* config/host-hpux.cc: ...here.
* config/host-linux.c: Moved to...
* config/host-linux.cc: ...here.
* config/host-netbsd.c: Moved to...
* config/host-netbsd.cc: ...here.
* config/host-openbsd.c: Moved to...
* config/host-openbsd.cc: ...here.
* config/host-solaris.c: Moved to...
* config/host-solaris.cc: ...here.
* config/i386/djgpp.c: Moved to...
* config/i386/djgpp.cc: ...here.
* config/i386/driver-i386.c: Moved to...
* config/i386/driver-i386.cc: ...here.
* config/i386/driver-mingw32.c: Moved to...
* config/i386/driver-mingw32.cc: ...here.
* config/i386/gnu-property.c: Moved to...
* config/i386/gnu-property.cc: ...here.
* config/i386/host-cygwin.c: Moved to...
* config/i386/host-cygwin.cc: ...here.
* config/i386/host-i386-darwin.c: Moved to...
* config/i386/host-i386-darwin.cc: ...here.
* config/i386/host-mingw32.c: Moved to...
* config/i386/host-mingw32.cc: ...here.
* config/i386/i386-builtins.c: Moved to...
* config/i386/i386-builtins.cc: ...here.
* config/i386/i386-c.c: Moved to...
* config/i386/i386-c.cc: ...here.
* config/i386/i386-d.c: Moved to...
* config/i386/i386-d.cc: ...here.
* config/i386/i386-expand.c: Moved to...
* config/i386/i386-expand.cc: ...here.
* config/i386/i386-features.c: Moved to...
* config/i386/i386-features.cc: ...here.
* config/i386/i386-options.c: Moved to...
* config/i386/i386-options.cc: ...here.
* config/i386/i386.c: Moved to...
* config/i386/i386.cc: ...here.
* config/i386/intelmic-mkoffload.c: Moved to...
* config/i386/intelmic-mkoffload.cc: ...here.
* config/i386/msformat-c.c: Moved to...
* config/i386/msformat-c.cc: ...here.
* config/i386/winnt-cxx.c: Moved to...
* config/i386/winnt-cxx.cc: ...here.
* config/i386/winnt-d.c: Moved to...
* config/i386/winnt-d.cc: ...here.
* config/i386/winnt-stubs.c: Moved to...
* config/i386/winnt-stubs.cc: ...here.
* config/i386/winnt.c: Moved to...
* config/i386/winnt.cc: ...here.
* config/i386/x86-tune-sched-atom.c: Moved to...
* config/i386/x86-tune-sched-atom.cc: ...here.
* config/i386/x86-tune-sched-bd.c: Moved to...
* config/i386/x86-tune-sched-bd.cc: ...here.
* config/i386/x86-tune-sched-core.c: Moved to...
* config/i386/x86-tune-sched-core.cc: ...here.
* config/i386/x86-tune-sched.c: Moved to...
* config/i386/x86-tune-sched.cc: ...here.
* config/ia64/ia64-c.c: Moved to...
* config/ia64/ia64-c.cc: ...here.
* config/ia64/ia64.c: Moved to...
* config/ia64/ia64.cc: ...here.
* config/iq2000/iq2000.c: Moved to...
* config/iq2000/iq2000.cc: ...here.
* config/linux.c: Moved to...
* config/linux.cc: ...here.
* config/lm32/lm32.c: Moved to...
* config/lm32/lm32.cc: ...here.
* config/m32c/m32c-pragma.c: Moved to...
* config/m32c/m32c-pragma.cc: ...here.
* config/m32c/m32c.c: Moved to...
* config/m32c/m32c.cc: ...here.
* config/m32r/m32r.c: Moved to...
* config/m32r/m32r.cc: ...here.
* config/m68k/m68k.c: Moved to...
* config/m68k/m68k.cc: ...here.
* config/mcore/mcore.c: Moved to...
* config/mcore/mcore.cc: ...here.
* config/microblaze/microblaze-c.c: Moved to...
* config/microblaze/microblaze-c.cc: ...here.
* config/microblaze/microblaze.c: Moved to...
* config/microblaze/microblaze.cc: ...here.
* config/mips/driver-native.c: Moved to...
* config/mips/driver-native.cc: ...here.
* config/mips/frame-header-opt.c: Moved to...
* config/mips/frame-header-opt.cc: ...here.
* config/mips/mips-d.c: Moved to...
* config/mips/mips-d.cc: ...here.
* config/mips/mips.c: Moved to...
* config/mips/mips.cc: ...here.
* config/mmix/mmix.c: Moved to...
* config/mmix/mmix.cc: ...here.
* config/mn10300/mn10300.c: Moved to...
* config/mn10300/mn10300.cc: ...here.
* config/moxie/moxie.c: Moved to...
* config/moxie/moxie.cc: ...here.
* config/msp430/driver-msp430.c: Moved to...
* config/msp430/driver-msp430.cc: ...here.
* config/msp430/msp430-c.c: Moved to...
* config/msp430/msp430-c.cc: ...here.
* config/msp430/msp430-devices.c: Moved to...
* config/msp430/msp430-devices.cc: ...here.
* config/msp430/msp430.c: Moved to...
* config/msp430/msp430.cc: ...here.
* config/nds32/nds32-cost.c: Moved to...
* config/nds32/nds32-cost.cc: ...here.
* config/nds32/nds32-fp-as-gp.c: Moved to...
* config/nds32/nds32-fp-as-gp.cc: ...here.
* config/nds32/nds32-intrinsic.c: Moved to...
* config/nds32/nds32-intrinsic.cc: ...here.
* config/nds32/nds32-isr.c: Moved to...
* config/nds32/nds32-isr.cc: ...here.
* config/nds32/nds32-md-auxiliary.c: Moved to...
* config/nds32/nds32-md-auxiliary.cc: ...here.
* config/nds32/nds32-memory-manipulation.c: Moved to...
* config/nds32/nds32-memory-manipulation.cc: ...here.
* config/nds32/nds32-pipelines-auxiliary.c: Moved to...
* config/nds32/nds32-pipelines-auxiliary.cc: ...here.
* config/nds32/nds32-predicates.c: Moved to...
* config/nds32/nds32-predicates.cc: ...here.
* config/nds32/nds32-relax-opt.c: Moved to...
* config/nds32/nds32-relax-opt.cc: ...here.
* config/nds32/nds32-utils.c: Moved to...
* config/nds32/nds32-utils.cc: ...here.
* config/nds32/nds32.c: Moved to...
* config/nds32/nds32.cc: ...here.
* config/netbsd-d.c: Moved to...
* config/netbsd-d.cc: ...here.
* config/netbsd.c: Moved to...
* config/netbsd.cc: ...here.
* config/nios2/nios2.c: Moved to...
* config/nios2/nios2.cc: ...here.
* config/nvptx/mkoffload.c: Moved to...
* config/nvptx/mkoffload.cc: ...here.
* config/nvptx/nvptx-c.c: Moved to...
* config/nvptx/nvptx-c.cc: ...here.
* config/nvptx/nvptx.c: Moved to...
* config/nvptx/nvptx.cc: ...here.
* config/openbsd-d.c: Moved to...
* config/openbsd-d.cc: ...here.
* config/or1k/or1k.c: Moved to...
* config/or1k/or1k.cc: ...here.
* config/pa/pa-d.c: Moved to...
* config/pa/pa-d.cc: ...here.
* config/pa/pa.c: Moved to...
* config/pa/pa.cc: ...here.
* config/pdp11/pdp11.c: Moved to...
* config/pdp11/pdp11.cc: ...here.
* config/pru/pru-passes.c: Moved to...
* config/pru/pru-passes.cc: ...here.
* config/pru/pru-pragma.c: Moved to...
* config/pru/pru-pragma.cc: ...here.
* config/pru/pru.c: Moved to...
* config/pru/pru.cc: ...here.
* config/riscv/riscv-builtins.c: Moved to...
* config/riscv/riscv-builtins.cc: ...here.
* config/riscv/riscv-c.c: Moved to...
* config/riscv/riscv-c.cc: ...here.
* config/riscv/riscv-d.c: Moved to...
* config/riscv/riscv-d.cc: ...here.
* config/riscv/riscv-shorten-memrefs.c: Moved to...
* config/riscv/riscv-shorten-memrefs.cc: ...here.
* config/riscv/riscv-sr.c: Moved to...
* config/riscv/riscv-sr.cc: ...here.
* config/riscv/riscv.c: Moved to...
* config/riscv/riscv.cc: ...here.
* config/rl78/rl78-c.c: Moved to...
* config/rl78/rl78-c.cc: ...here.
* config/rl78/rl78.c: Moved to...
* config/rl78/rl78.cc: ...here.
* config/rs6000/driver-rs6000.c: Moved to...
* config/rs6000/driver-rs6000.cc: ...here.
* config/rs6000/host-darwin.c: Moved to...
* config/rs6000/host-darwin.cc: ...here.
* config/rs6000/host-ppc64-darwin.c: Moved to...
* config/rs6000/host-ppc64-darwin.cc: ...here.
* config/rs6000/rbtree.c: Moved to...
* config/rs6000/rbtree.cc: ...here.
* config/rs6000/rs6000-c.c: Moved to...
* config/rs6000/rs6000-c.cc: ...here.
* config/rs6000/rs6000-call.c: Moved to...
* config/rs6000/rs6000-call.cc: ...here.
* config/rs6000/rs6000-d.c: Moved to...
* config/rs6000/rs6000-d.cc: ...here.
* config/rs6000/rs6000-gen-builtins.c: Moved to...
* config/rs6000/rs6000-gen-builtins.cc: ...here.
* config/rs6000/rs6000-linux.c: Moved to...
* config/rs6000/rs6000-linux.cc: ...here.
* config/rs6000/rs6000-logue.c: Moved to...
* config/rs6000/rs6000-logue.cc: ...here.
* config/rs6000/rs6000-p8swap.c: Moved to...
* config/rs6000/rs6000-p8swap.cc: ...here.
* config/rs6000/rs6000-pcrel-opt.c: Moved to...
* config/rs6000/rs6000-pcrel-opt.cc: ...here.
* config/rs6000/rs6000-string.c: Moved to...
* config/rs6000/rs6000-string.cc: ...here.
* config/rs6000/rs6000.c: Moved to...
* config/rs6000/rs6000.cc: ...here.
* config/rx/rx.c: Moved to...
* config/rx/rx.cc: ...here.
* config/s390/driver-native.c: Moved to...
* config/s390/driver-native.cc: ...here.
* config/s390/s390-c.c: Moved to...
* config/s390/s390-c.cc: ...here.
* config/s390/s390-d.c: Moved to...
* config/s390/s390-d.cc: ...here.
* config/s390/s390.c: Moved to...
* config/s390/s390.cc: ...here.
* config/sh/divtab-sh4-300.c: Moved to...
* config/sh/divtab-sh4-300.cc: ...here.
* config/sh/divtab-sh4.c: Moved to...
* config/sh/divtab-sh4.cc: ...here.
* config/sh/divtab.c: Moved to...
* config/sh/divtab.cc: ...here.
* config/sh/sh-c.c: Moved to...
* config/sh/sh-c.cc: ...here.
* config/sh/sh.c: Moved to...
* config/sh/sh.cc: ...here.
* config/sol2-c.c: Moved to...
* config/sol2-c.cc: ...here.
* config/sol2-cxx.c: Moved to...
* config/sol2-cxx.cc: ...here.
* config/sol2-d.c: Moved to...
* config/sol2-d.cc: ...here.
* config/sol2-stubs.c: Moved to...
* config/sol2-stubs.cc: ...here.
* config/sol2.c: Moved to...
* config/sol2.cc: ...here.
* config/sparc/driver-sparc.c: Moved to...
* config/sparc/driver-sparc.cc: ...here.
* config/sparc/sparc-c.c: Moved to...
* config/sparc/sparc-c.cc: ...here.
* config/sparc/sparc-d.c: Moved to...
* config/sparc/sparc-d.cc: ...here.
* config/sparc/sparc.c: Moved to...
* config/sparc/sparc.cc: ...here.
* config/stormy16/stormy16.c: Moved to...
* config/stormy16/stormy16.cc: ...here.
* config/tilegx/mul-tables.c: Moved to...
* config/tilegx/mul-tables.cc: ...here.
* config/tilegx/tilegx-c.c: Moved to...
* config/tilegx/tilegx-c.cc: ...here.
* config/tilegx/tilegx.c: Moved to...
* config/tilegx/tilegx.cc: ...here.
* config/tilepro/mul-tables.c: Moved to...
* config/tilepro/mul-tables.cc: ...here.
* config/tilepro/tilepro-c.c: Moved to...
* config/tilepro/tilepro-c.cc: ...here.
* config/tilepro/tilepro.c: Moved to...
* config/tilepro/tilepro.cc: ...here.
* config/v850/v850-c.c: Moved to...
* config/v850/v850-c.cc: ...here.
* config/v850/v850.c: Moved to...
* config/v850/v850.cc: ...here.
* config/vax/vax.c: Moved to...
* config/vax/vax.cc: ...here.
* config/visium/visium.c: Moved to...
* config/visium/visium.cc: ...here.
* config/vms/vms-c.c: Moved to...
* config/vms/vms-c.cc: ...here.
* config/vms/vms-f.c: Moved to...
* config/vms/vms-f.cc: ...here.
* config/vms/vms.c: Moved to...
* config/vms/vms.cc: ...here.
* config/vxworks-c.c: Moved to...
* config/vxworks-c.cc: ...here.
* config/vxworks.c: Moved to...
* config/vxworks.cc: ...here.
* config/winnt-c.c: Moved to...
* config/winnt-c.cc: ...here.
* config/xtensa/xtensa.c: Moved to...
* config/xtensa/xtensa.cc: ...here.
* context.c: Moved to...
* context.cc: ...here.
* convert.c: Moved to...
* convert.cc: ...here.
* coverage.c: Moved to...
* coverage.cc: ...here.
* cppbuiltin.c: Moved to...
* cppbuiltin.cc: ...here.
* cppdefault.c: Moved to...
* cppdefault.cc: ...here.
* cprop.c: Moved to...
* cprop.cc: ...here.
* cse.c: Moved to...
* cse.cc: ...here.
* cselib.c: Moved to...
* cselib.cc: ...here.
* ctfc.c: Moved to...
* ctfc.cc: ...here.
* ctfout.c: Moved to...
* ctfout.cc: ...here.
* data-streamer-in.c: Moved to...
* data-streamer-in.cc: ...here.
* data-streamer-out.c: Moved to...
* data-streamer-out.cc: ...here.
* data-streamer.c: Moved to...
* data-streamer.cc: ...here.
* dbgcnt.c: Moved to...
* dbgcnt.cc: ...here.
* dbxout.c: Moved to...
* dbxout.cc: ...here.
* dce.c: Moved to...
* dce.cc: ...here.
* ddg.c: Moved to...
* ddg.cc: ...here.
* debug.c: Moved to...
* debug.cc: ...here.
* df-core.c: Moved to...
* df-core.cc: ...here.
* df-problems.c: Moved to...
* df-problems.cc: ...here.
* df-scan.c: Moved to...
* df-scan.cc: ...here.
* dfp.c: Moved to...
* dfp.cc: ...here.
* diagnostic-color.c: Moved to...
* diagnostic-color.cc: ...here.
* diagnostic-show-locus.c: Moved to...
* diagnostic-show-locus.cc: ...here.
* diagnostic-spec.c: Moved to...
* diagnostic-spec.cc: ...here.
* diagnostic.c: Moved to...
* diagnostic.cc: ...here.
* dojump.c: Moved to...
* dojump.cc: ...here.
* dominance.c: Moved to...
* dominance.cc: ...here.
* domwalk.c: Moved to...
* domwalk.cc: ...here.
* double-int.c: Moved to...
* double-int.cc: ...here.
* dse.c: Moved to...
* dse.cc: ...here.
* dumpfile.c: Moved to...
* dumpfile.cc: ...here.
* dwarf2asm.c: Moved to...
* dwarf2asm.cc: ...here.
* dwarf2cfi.c: Moved to...
* dwarf2cfi.cc: ...here.
* dwarf2ctf.c: Moved to...
* dwarf2ctf.cc: ...here.
* dwarf2out.c: Moved to...
* dwarf2out.cc: ...here.
* early-remat.c: Moved to...
* early-remat.cc: ...here.
* edit-context.c: Moved to...
* edit-context.cc: ...here.
* emit-rtl.c: Moved to...
* emit-rtl.cc: ...here.
* errors.c: Moved to...
* errors.cc: ...here.
* et-forest.c: Moved to...
* et-forest.cc: ...here.
* except.c: Moved to...
* except.cc: ...here.
* explow.c: Moved to...
* explow.cc: ...here.
* expmed.c: Moved to...
* expmed.cc: ...here.
* expr.c: Moved to...
* expr.cc: ...here.
* fibonacci_heap.c: Moved to...
* fibonacci_heap.cc: ...here.
* file-find.c: Moved to...
* file-find.cc: ...here.
* file-prefix-map.c: Moved to...
* file-prefix-map.cc: ...here.
* final.c: Moved to...
* final.cc: ...here.
* fixed-value.c: Moved to...
* fixed-value.cc: ...here.
* fold-const-call.c: Moved to...
* fold-const-call.cc: ...here.
* fold-const.c: Moved to...
* fold-const.cc: ...here.
* fp-test.c: Moved to...
* fp-test.cc: ...here.
* function-tests.c: Moved to...
* function-tests.cc: ...here.
* function.c: Moved to...
* function.cc: ...here.
* fwprop.c: Moved to...
* fwprop.cc: ...here.
* gcc-ar.c: Moved to...
* gcc-ar.cc: ...here.
* gcc-main.c: Moved to...
* gcc-main.cc: ...here.
* gcc-rich-location.c: Moved to...
* gcc-rich-location.cc: ...here.
* gcc.c: Moved to...
* gcc.cc: ...here.
* gcov-dump.c: Moved to...
* gcov-dump.cc: ...here.
* gcov-io.c: Moved to...
* gcov-io.cc: ...here.
* gcov-tool.c: Moved to...
* gcov-tool.cc: ...here.
* gcov.c: Moved to...
* gcov.cc: ...here.
* gcse-common.c: Moved to...
* gcse-common.cc: ...here.
* gcse.c: Moved to...
* gcse.cc: ...here.
* genattr-common.c: Moved to...
* genattr-common.cc: ...here.
* genattr.c: Moved to...
* genattr.cc: ...here.
* genattrtab.c: Moved to...
* genattrtab.cc: ...here.
* genautomata.c: Moved to...
* genautomata.cc: ...here.
* gencfn-macros.c: Moved to...
* gencfn-macros.cc: ...here.
* gencheck.c: Moved to...
* gencheck.cc: ...here.
* genchecksum.c: Moved to...
* genchecksum.cc: ...here.
* gencodes.c: Moved to...
* gencodes.cc: ...here.
* genconditions.c: Moved to...
* genconditions.cc: ...here.
* genconfig.c: Moved to...
* genconfig.cc: ...here.
* genconstants.c: Moved to...
* genconstants.cc: ...here.
* genemit.c: Moved to...
* genemit.cc: ...here.
* genenums.c: Moved to...
* genenums.cc: ...here.
* generic-match-head.c: Moved to...
* generic-match-head.cc: ...here.
* genextract.c: Moved to...
* genextract.cc: ...here.
* genflags.c: Moved to...
* genflags.cc: ...here.
* gengenrtl.c: Moved to...
* gengenrtl.cc: ...here.
* gengtype-parse.c: Moved to...
* gengtype-parse.cc: ...here.
* gengtype-state.c: Moved to...
* gengtype-state.cc: ...here.
* gengtype.c: Moved to...
* gengtype.cc: ...here.
* genhooks.c: Moved to...
* genhooks.cc: ...here.
* genmatch.c: Moved to...
* genmatch.cc: ...here.
* genmddeps.c: Moved to...
* genmddeps.cc: ...here.
* genmddump.c: Moved to...
* genmddump.cc: ...here.
* genmodes.c: Moved to...
* genmodes.cc: ...here.
* genopinit.c: Moved to...
* genopinit.cc: ...here.
* genoutput.c: Moved to...
* genoutput.cc: ...here.
* genpeep.c: Moved to...
* genpeep.cc: ...here.
* genpreds.c: Moved to...
* genpreds.cc: ...here.
* genrecog.c: Moved to...
* genrecog.cc: ...here.
* gensupport.c: Moved to...
* gensupport.cc: ...here.
* gentarget-def.c: Moved to...
* gentarget-def.cc: ...here.
* genversion.c: Moved to...
* genversion.cc: ...here.
* ggc-common.c: Moved to...
* ggc-common.cc: ...here.
* ggc-none.c: Moved to...
* ggc-none.cc: ...here.
* ggc-page.c: Moved to...
* ggc-page.cc: ...here.
* ggc-tests.c: Moved to...
* ggc-tests.cc: ...here.
* gimple-builder.c: Moved to...
* gimple-builder.cc: ...here.
* gimple-expr.c: Moved to...
* gimple-expr.cc: ...here.
* gimple-fold.c: Moved to...
* gimple-fold.cc: ...here.
* gimple-iterator.c: Moved to...
* gimple-iterator.cc: ...here.
* gimple-laddress.c: Moved to...
* gimple-laddress.cc: ...here.
* gimple-loop-jam.c: Moved to...
* gimple-loop-jam.cc: ...here.
* gimple-low.c: Moved to...
* gimple-low.cc: ...here.
* gimple-match-head.c: Moved to...
* gimple-match-head.cc: ...here.
* gimple-pretty-print.c: Moved to...
* gimple-pretty-print.cc: ...here.
* gimple-ssa-backprop.c: Moved to...
* gimple-ssa-backprop.cc: ...here.
* gimple-ssa-evrp-analyze.c: Moved to...
* gimple-ssa-evrp-analyze.cc: ...here.
* gimple-ssa-evrp.c: Moved to...
* gimple-ssa-evrp.cc: ...here.
* gimple-ssa-isolate-paths.c: Moved to...
* gimple-ssa-isolate-paths.cc: ...here.
* gimple-ssa-nonnull-compare.c: Moved to...
* gimple-ssa-nonnull-compare.cc: ...here.
* gimple-ssa-split-paths.c: Moved to...
* gimple-ssa-split-paths.cc: ...here.
* gimple-ssa-sprintf.c: Moved to...
* gimple-ssa-sprintf.cc: ...here.
* gimple-ssa-store-merging.c: Moved to...
* gimple-ssa-store-merging.cc: ...here.
* gimple-ssa-strength-reduction.c: Moved to...
* gimple-ssa-strength-reduction.cc: ...here.
* gimple-ssa-warn-alloca.c: Moved to...
* gimple-ssa-warn-alloca.cc: ...here.
* gimple-ssa-warn-restrict.c: Moved to...
* gimple-ssa-warn-restrict.cc: ...here.
* gimple-streamer-in.c: Moved to...
* gimple-streamer-in.cc: ...here.
* gimple-streamer-out.c: Moved to...
* gimple-streamer-out.cc: ...here.
* gimple-walk.c: Moved to...
* gimple-walk.cc: ...here.
* gimple-warn-recursion.c: Moved to...
* gimple-warn-recursion.cc: ...here.
* gimple.c: Moved to...
* gimple.cc: ...here.
* gimplify-me.c: Moved to...
* gimplify-me.cc: ...here.
* gimplify.c: Moved to...
* gimplify.cc: ...here.
* godump.c: Moved to...
* godump.cc: ...here.
* graph.c: Moved to...
* graph.cc: ...here.
* graphds.c: Moved to...
* graphds.cc: ...here.
* graphite-dependences.c: Moved to...
* graphite-dependences.cc: ...here.
* graphite-isl-ast-to-gimple.c: Moved to...
* graphite-isl-ast-to-gimple.cc: ...here.
* graphite-optimize-isl.c: Moved to...
* graphite-optimize-isl.cc: ...here.
* graphite-poly.c: Moved to...
* graphite-poly.cc: ...here.
* graphite-scop-detection.c: Moved to...
* graphite-scop-detection.cc: ...here.
* graphite-sese-to-poly.c: Moved to...
* graphite-sese-to-poly.cc: ...here.
* graphite.c: Moved to...
* graphite.cc: ...here.
* haifa-sched.c: Moved to...
* haifa-sched.cc: ...here.
* hash-map-tests.c: Moved to...
* hash-map-tests.cc: ...here.
* hash-set-tests.c: Moved to...
* hash-set-tests.cc: ...here.
* hash-table.c: Moved to...
* hash-table.cc: ...here.
* hooks.c: Moved to...
* hooks.cc: ...here.
* host-default.c: Moved to...
* host-default.cc: ...here.
* hw-doloop.c: Moved to...
* hw-doloop.cc: ...here.
* hwint.c: Moved to...
* hwint.cc: ...here.
* ifcvt.c: Moved to...
* ifcvt.cc: ...here.
* inchash.c: Moved to...
* inchash.cc: ...here.
* incpath.c: Moved to...
* incpath.cc: ...here.
* init-regs.c: Moved to...
* init-regs.cc: ...here.
* input.c: Moved to...
* input.cc: ...here.
* internal-fn.c: Moved to...
* internal-fn.cc: ...here.
* intl.c: Moved to...
* intl.cc: ...here.
* ipa-comdats.c: Moved to...
* ipa-comdats.cc: ...here.
* ipa-cp.c: Moved to...
* ipa-cp.cc: ...here.
* ipa-devirt.c: Moved to...
* ipa-devirt.cc: ...here.
* ipa-fnsummary.c: Moved to...
* ipa-fnsummary.cc: ...here.
* ipa-icf-gimple.c: Moved to...
* ipa-icf-gimple.cc: ...here.
* ipa-icf.c: Moved to...
* ipa-icf.cc: ...here.
* ipa-inline-analysis.c: Moved to...
* ipa-inline-analysis.cc: ...here.
* ipa-inline-transform.c: Moved to...
* ipa-inline-transform.cc: ...here.
* ipa-inline.c: Moved to...
* ipa-inline.cc: ...here.
* ipa-modref-tree.c: Moved to...
* ipa-modref-tree.cc: ...here.
* ipa-modref.c: Moved to...
* ipa-modref.cc: ...here.
* ipa-param-manipulation.c: Moved to...
* ipa-param-manipulation.cc: ...here.
* ipa-polymorphic-call.c: Moved to...
* ipa-polymorphic-call.cc: ...here.
* ipa-predicate.c: Moved to...
* ipa-predicate.cc: ...here.
* ipa-profile.c: Moved to...
* ipa-profile.cc: ...here.
* ipa-prop.c: Moved to...
* ipa-prop.cc: ...here.
* ipa-pure-const.c: Moved to...
* ipa-pure-const.cc: ...here.
* ipa-ref.c: Moved to...
* ipa-ref.cc: ...here.
* ipa-reference.c: Moved to...
* ipa-reference.cc: ...here.
* ipa-split.c: Moved to...
* ipa-split.cc: ...here.
* ipa-sra.c: Moved to...
* ipa-sra.cc: ...here.
* ipa-utils.c: Moved to...
* ipa-utils.cc: ...here.
* ipa-visibility.c: Moved to...
* ipa-visibility.cc: ...here.
* ipa.c: Moved to...
* ipa.cc: ...here.
* ira-build.c: Moved to...
* ira-build.cc: ...here.
* ira-color.c: Moved to...
* ira-color.cc: ...here.
* ira-conflicts.c: Moved to...
* ira-conflicts.cc: ...here.
* ira-costs.c: Moved to...
* ira-costs.cc: ...here.
* ira-emit.c: Moved to...
* ira-emit.cc: ...here.
* ira-lives.c: Moved to...
* ira-lives.cc: ...here.
* ira.c: Moved to...
* ira.cc: ...here.
* jump.c: Moved to...
* jump.cc: ...here.
* langhooks.c: Moved to...
* langhooks.cc: ...here.
* lcm.c: Moved to...
* lcm.cc: ...here.
* lists.c: Moved to...
* lists.cc: ...here.
* loop-doloop.c: Moved to...
* loop-doloop.cc: ...here.
* loop-init.c: Moved to...
* loop-init.cc: ...here.
* loop-invariant.c: Moved to...
* loop-invariant.cc: ...here.
* loop-iv.c: Moved to...
* loop-iv.cc: ...here.
* loop-unroll.c: Moved to...
* loop-unroll.cc: ...here.
* lower-subreg.c: Moved to...
* lower-subreg.cc: ...here.
* lra-assigns.c: Moved to...
* lra-assigns.cc: ...here.
* lra-coalesce.c: Moved to...
* lra-coalesce.cc: ...here.
* lra-constraints.c: Moved to...
* lra-constraints.cc: ...here.
* lra-eliminations.c: Moved to...
* lra-eliminations.cc: ...here.
* lra-lives.c: Moved to...
* lra-lives.cc: ...here.
* lra-remat.c: Moved to...
* lra-remat.cc: ...here.
* lra-spills.c: Moved to...
* lra-spills.cc: ...here.
* lra.c: Moved to...
* lra.cc: ...here.
* lto-cgraph.c: Moved to...
* lto-cgraph.cc: ...here.
* lto-compress.c: Moved to...
* lto-compress.cc: ...here.
* lto-opts.c: Moved to...
* lto-opts.cc: ...here.
* lto-section-in.c: Moved to...
* lto-section-in.cc: ...here.
* lto-section-out.c: Moved to...
* lto-section-out.cc: ...here.
* lto-streamer-in.c: Moved to...
* lto-streamer-in.cc: ...here.
* lto-streamer-out.c: Moved to...
* lto-streamer-out.cc: ...here.
* lto-streamer.c: Moved to...
* lto-streamer.cc: ...here.
* lto-wrapper.c: Moved to...
* lto-wrapper.cc: ...here.
* main.c: Moved to...
* main.cc: ...here.
* mcf.c: Moved to...
* mcf.cc: ...here.
* mode-switching.c: Moved to...
* mode-switching.cc: ...here.
* modulo-sched.c: Moved to...
* modulo-sched.cc: ...here.
* multiple_target.c: Moved to...
* multiple_target.cc: ...here.
* omp-expand.c: Moved to...
* omp-expand.cc: ...here.
* omp-general.c: Moved to...
* omp-general.cc: ...here.
* omp-low.c: Moved to...
* omp-low.cc: ...here.
* omp-offload.c: Moved to...
* omp-offload.cc: ...here.
* omp-simd-clone.c: Moved to...
* omp-simd-clone.cc: ...here.
* opt-suggestions.c: Moved to...
* opt-suggestions.cc: ...here.
* optabs-libfuncs.c: Moved to...
* optabs-libfuncs.cc: ...here.
* optabs-query.c: Moved to...
* optabs-query.cc: ...here.
* optabs-tree.c: Moved to...
* optabs-tree.cc: ...here.
* optabs.c: Moved to...
* optabs.cc: ...here.
* opts-common.c: Moved to...
* opts-common.cc: ...here.
* opts-global.c: Moved to...
* opts-global.cc: ...here.
* opts.c: Moved to...
* opts.cc: ...here.
* passes.c: Moved to...
* passes.cc: ...here.
* plugin.c: Moved to...
* plugin.cc: ...here.
* postreload-gcse.c: Moved to...
* postreload-gcse.cc: ...here.
* postreload.c: Moved to...
* postreload.cc: ...here.
* predict.c: Moved to...
* predict.cc: ...here.
* prefix.c: Moved to...
* prefix.cc: ...here.
* pretty-print.c: Moved to...
* pretty-print.cc: ...here.
* print-rtl-function.c: Moved to...
* print-rtl-function.cc: ...here.
* print-rtl.c: Moved to...
* print-rtl.cc: ...here.
* print-tree.c: Moved to...
* print-tree.cc: ...here.
* profile-count.c: Moved to...
* profile-count.cc: ...here.
* profile.c: Moved to...
* profile.cc: ...here.
* read-md.c: Moved to...
* read-md.cc: ...here.
* read-rtl-function.c: Moved to...
* read-rtl-function.cc: ...here.
* read-rtl.c: Moved to...
* read-rtl.cc: ...here.
* real.c: Moved to...
* real.cc: ...here.
* realmpfr.c: Moved to...
* realmpfr.cc: ...here.
* recog.c: Moved to...
* recog.cc: ...here.
* ree.c: Moved to...
* ree.cc: ...here.
* reg-stack.c: Moved to...
* reg-stack.cc: ...here.
* regcprop.c: Moved to...
* regcprop.cc: ...here.
* reginfo.c: Moved to...
* reginfo.cc: ...here.
* regrename.c: Moved to...
* regrename.cc: ...here.
* regstat.c: Moved to...
* regstat.cc: ...here.
* reload.c: Moved to...
* reload.cc: ...here.
* reload1.c: Moved to...
* reload1.cc: ...here.
* reorg.c: Moved to...
* reorg.cc: ...here.
* resource.c: Moved to...
* resource.cc: ...here.
* rtl-error.c: Moved to...
* rtl-error.cc: ...here.
* rtl-tests.c: Moved to...
* rtl-tests.cc: ...here.
* rtl.c: Moved to...
* rtl.cc: ...here.
* rtlanal.c: Moved to...
* rtlanal.cc: ...here.
* rtlhash.c: Moved to...
* rtlhash.cc: ...here.
* rtlhooks.c: Moved to...
* rtlhooks.cc: ...here.
* rtx-vector-builder.c: Moved to...
* rtx-vector-builder.cc: ...here.
* run-rtl-passes.c: Moved to...
* run-rtl-passes.cc: ...here.
* sancov.c: Moved to...
* sancov.cc: ...here.
* sanopt.c: Moved to...
* sanopt.cc: ...here.
* sbitmap.c: Moved to...
* sbitmap.cc: ...here.
* sched-deps.c: Moved to...
* sched-deps.cc: ...here.
* sched-ebb.c: Moved to...
* sched-ebb.cc: ...here.
* sched-rgn.c: Moved to...
* sched-rgn.cc: ...here.
* sel-sched-dump.c: Moved to...
* sel-sched-dump.cc: ...here.
* sel-sched-ir.c: Moved to...
* sel-sched-ir.cc: ...here.
* sel-sched.c: Moved to...
* sel-sched.cc: ...here.
* selftest-diagnostic.c: Moved to...
* selftest-diagnostic.cc: ...here.
* selftest-rtl.c: Moved to...
* selftest-rtl.cc: ...here.
* selftest-run-tests.c: Moved to...
* selftest-run-tests.cc: ...here.
* selftest.c: Moved to...
* selftest.cc: ...here.
* sese.c: Moved to...
* sese.cc: ...here.
* shrink-wrap.c: Moved to...
* shrink-wrap.cc: ...here.
* simplify-rtx.c: Moved to...
* simplify-rtx.cc: ...here.
* sparseset.c: Moved to...
* sparseset.cc: ...here.
* spellcheck-tree.c: Moved to...
* spellcheck-tree.cc: ...here.
* spellcheck.c: Moved to...
* spellcheck.cc: ...here.
* sreal.c: Moved to...
* sreal.cc: ...here.
* stack-ptr-mod.c: Moved to...
* stack-ptr-mod.cc: ...here.
* statistics.c: Moved to...
* statistics.cc: ...here.
* stmt.c: Moved to...
* stmt.cc: ...here.
* stor-layout.c: Moved to...
* stor-layout.cc: ...here.
* store-motion.c: Moved to...
* store-motion.cc: ...here.
* streamer-hooks.c: Moved to...
* streamer-hooks.cc: ...here.
* stringpool.c: Moved to...
* stringpool.cc: ...here.
* substring-locations.c: Moved to...
* substring-locations.cc: ...here.
* symtab.c: Moved to...
* symtab.cc: ...here.
* target-globals.c: Moved to...
* target-globals.cc: ...here.
* targhooks.c: Moved to...
* targhooks.cc: ...here.
* timevar.c: Moved to...
* timevar.cc: ...here.
* toplev.c: Moved to...
* toplev.cc: ...here.
* tracer.c: Moved to...
* tracer.cc: ...here.
* trans-mem.c: Moved to...
* trans-mem.cc: ...here.
* tree-affine.c: Moved to...
* tree-affine.cc: ...here.
* tree-call-cdce.c: Moved to...
* tree-call-cdce.cc: ...here.
* tree-cfg.c: Moved to...
* tree-cfg.cc: ...here.
* tree-cfgcleanup.c: Moved to...
* tree-cfgcleanup.cc: ...here.
* tree-chrec.c: Moved to...
* tree-chrec.cc: ...here.
* tree-complex.c: Moved to...
* tree-complex.cc: ...here.
* tree-data-ref.c: Moved to...
* tree-data-ref.cc: ...here.
* tree-dfa.c: Moved to...
* tree-dfa.cc: ...here.
* tree-diagnostic.c: Moved to...
* tree-diagnostic.cc: ...here.
* tree-dump.c: Moved to...
* tree-dump.cc: ...here.
* tree-eh.c: Moved to...
* tree-eh.cc: ...here.
* tree-emutls.c: Moved to...
* tree-emutls.cc: ...here.
* tree-if-conv.c: Moved to...
* tree-if-conv.cc: ...here.
* tree-inline.c: Moved to...
* tree-inline.cc: ...here.
* tree-into-ssa.c: Moved to...
* tree-into-ssa.cc: ...here.
* tree-iterator.c: Moved to...
* tree-iterator.cc: ...here.
* tree-loop-distribution.c: Moved to...
* tree-loop-distribution.cc: ...here.
* tree-nested.c: Moved to...
* tree-nested.cc: ...here.
* tree-nrv.c: Moved to...
* tree-nrv.cc: ...here.
* tree-object-size.c: Moved to...
* tree-object-size.cc: ...here.
* tree-outof-ssa.c: Moved to...
* tree-outof-ssa.cc: ...here.
* tree-parloops.c: Moved to...
* tree-parloops.cc: ...here.
* tree-phinodes.c: Moved to...
* tree-phinodes.cc: ...here.
* tree-predcom.c: Moved to...
* tree-predcom.cc: ...here.
* tree-pretty-print.c: Moved to...
* tree-pretty-print.cc: ...here.
* tree-profile.c: Moved to...
* tree-profile.cc: ...here.
* tree-scalar-evolution.c: Moved to...
* tree-scalar-evolution.cc: ...here.
* tree-sra.c: Moved to...
* tree-sra.cc: ...here.
* tree-ssa-address.c: Moved to...
* tree-ssa-address.cc: ...here.
* tree-ssa-alias.c: Moved to...
* tree-ssa-alias.cc: ...here.
* tree-ssa-ccp.c: Moved to...
* tree-ssa-ccp.cc: ...here.
* tree-ssa-coalesce.c: Moved to...
* tree-ssa-coalesce.cc: ...here.
* tree-ssa-copy.c: Moved to...
* tree-ssa-copy.cc: ...here.
* tree-ssa-dce.c: Moved to...
* tree-ssa-dce.cc: ...here.
* tree-ssa-dom.c: Moved to...
* tree-ssa-dom.cc: ...here.
* tree-ssa-dse.c: Moved to...
* tree-ssa-dse.cc: ...here.
* tree-ssa-forwprop.c: Moved to...
* tree-ssa-forwprop.cc: ...here.
* tree-ssa-ifcombine.c: Moved to...
* tree-ssa-ifcombine.cc: ...here.
* tree-ssa-live.c: Moved to...
* tree-ssa-live.cc: ...here.
* tree-ssa-loop-ch.c: Moved to...
* tree-ssa-loop-ch.cc: ...here.
* tree-ssa-loop-im.c: Moved to...
* tree-ssa-loop-im.cc: ...here.
* tree-ssa-loop-ivcanon.c: Moved to...
* tree-ssa-loop-ivcanon.cc: ...here.
* tree-ssa-loop-ivopts.c: Moved to...
* tree-ssa-loop-ivopts.cc: ...here.
* tree-ssa-loop-manip.c: Moved to...
* tree-ssa-loop-manip.cc: ...here.
* tree-ssa-loop-niter.c: Moved to...
* tree-ssa-loop-niter.cc: ...here.
* tree-ssa-loop-prefetch.c: Moved to...
* tree-ssa-loop-prefetch.cc: ...here.
* tree-ssa-loop-split.c: Moved to...
* tree-ssa-loop-split.cc: ...here.
* tree-ssa-loop-unswitch.c: Moved to...
* tree-ssa-loop-unswitch.cc: ...here.
* tree-ssa-loop.c: Moved to...
* tree-ssa-loop.cc: ...here.
* tree-ssa-math-opts.c: Moved to...
* tree-ssa-math-opts.cc: ...here.
* tree-ssa-operands.c: Moved to...
* tree-ssa-operands.cc: ...here.
* tree-ssa-phiopt.c: Moved to...
* tree-ssa-phiopt.cc: ...here.
* tree-ssa-phiprop.c: Moved to...
* tree-ssa-phiprop.cc: ...here.
* tree-ssa-pre.c: Moved to...
* tree-ssa-pre.cc: ...here.
* tree-ssa-propagate.c: Moved to...
* tree-ssa-propagate.cc: ...here.
* tree-ssa-reassoc.c: Moved to...
* tree-ssa-reassoc.cc: ...here.
* tree-ssa-sccvn.c: Moved to...
* tree-ssa-sccvn.cc: ...here.
* tree-ssa-scopedtables.c: Moved to...
* tree-ssa-scopedtables.cc: ...here.
* tree-ssa-sink.c: Moved to...
* tree-ssa-sink.cc: ...here.
* tree-ssa-strlen.c: Moved to...
* tree-ssa-strlen.cc: ...here.
* tree-ssa-structalias.c: Moved to...
* tree-ssa-structalias.cc: ...here.
* tree-ssa-tail-merge.c: Moved to...
* tree-ssa-tail-merge.cc: ...here.
* tree-ssa-ter.c: Moved to...
* tree-ssa-ter.cc: ...here.
* tree-ssa-threadbackward.c: Moved to...
* tree-ssa-threadbackward.cc: ...here.
* tree-ssa-threadedge.c: Moved to...
* tree-ssa-threadedge.cc: ...here.
* tree-ssa-threadupdate.c: Moved to...
* tree-ssa-threadupdate.cc: ...here.
* tree-ssa-uncprop.c: Moved to...
* tree-ssa-uncprop.cc: ...here.
* tree-ssa-uninit.c: Moved to...
* tree-ssa-uninit.cc: ...here.
* tree-ssa.c: Moved to...
* tree-ssa.cc: ...here.
* tree-ssanames.c: Moved to...
* tree-ssanames.cc: ...here.
* tree-stdarg.c: Moved to...
* tree-stdarg.cc: ...here.
* tree-streamer-in.c: Moved to...
* tree-streamer-in.cc: ...here.
* tree-streamer-out.c: Moved to...
* tree-streamer-out.cc: ...here.
* tree-streamer.c: Moved to...
* tree-streamer.cc: ...here.
* tree-switch-conversion.c: Moved to...
* tree-switch-conversion.cc: ...here.
* tree-tailcall.c: Moved to...
* tree-tailcall.cc: ...here.
* tree-vect-data-refs.c: Moved to...
* tree-vect-data-refs.cc: ...here.
* tree-vect-generic.c: Moved to...
* tree-vect-generic.cc: ...here.
* tree-vect-loop-manip.c: Moved to...
* tree-vect-loop-manip.cc: ...here.
* tree-vect-loop.c: Moved to...
* tree-vect-loop.cc: ...here.
* tree-vect-patterns.c: Moved to...
* tree-vect-patterns.cc: ...here.
* tree-vect-slp-patterns.c: Moved to...
* tree-vect-slp-patterns.cc: ...here.
* tree-vect-slp.c: Moved to...
* tree-vect-slp.cc: ...here.
* tree-vect-stmts.c: Moved to...
* tree-vect-stmts.cc: ...here.
* tree-vector-builder.c: Moved to...
* tree-vector-builder.cc: ...here.
* tree-vectorizer.c: Moved to...
* tree-vectorizer.cc: ...here.
* tree-vrp.c: Moved to...
* tree-vrp.cc: ...here.
* tree.c: Moved to...
* tree.cc: ...here.
* tsan.c: Moved to...
* tsan.cc: ...here.
* typed-splay-tree.c: Moved to...
* typed-splay-tree.cc: ...here.
* ubsan.c: Moved to...
* ubsan.cc: ...here.
* valtrack.c: Moved to...
* valtrack.cc: ...here.
* value-prof.c: Moved to...
* value-prof.cc: ...here.
* var-tracking.c: Moved to...
* var-tracking.cc: ...here.
* varasm.c: Moved to...
* varasm.cc: ...here.
* varpool.c: Moved to...
* varpool.cc: ...here.
* vec-perm-indices.c: Moved to...
* vec-perm-indices.cc: ...here.
* vec.c: Moved to...
* vec.cc: ...here.
* vmsdbgout.c: Moved to...
* vmsdbgout.cc: ...here.
* vr-values.c: Moved to...
* vr-values.cc: ...here.
* vtable-verify.c: Moved to...
* vtable-verify.cc: ...here.
* web.c: Moved to...
* web.cc: ...here.
* xcoffout.c: Moved to...
* xcoffout.cc: ...here.
gcc/c-family/ChangeLog:
* c-ada-spec.c: Moved to...
* c-ada-spec.cc: ...here.
* c-attribs.c: Moved to...
* c-attribs.cc: ...here.
* c-common.c: Moved to...
* c-common.cc: ...here.
* c-cppbuiltin.c: Moved to...
* c-cppbuiltin.cc: ...here.
* c-dump.c: Moved to...
* c-dump.cc: ...here.
* c-format.c: Moved to...
* c-format.cc: ...here.
* c-gimplify.c: Moved to...
* c-gimplify.cc: ...here.
* c-indentation.c: Moved to...
* c-indentation.cc: ...here.
* c-lex.c: Moved to...
* c-lex.cc: ...here.
* c-omp.c: Moved to...
* c-omp.cc: ...here.
* c-opts.c: Moved to...
* c-opts.cc: ...here.
* c-pch.c: Moved to...
* c-pch.cc: ...here.
* c-ppoutput.c: Moved to...
* c-ppoutput.cc: ...here.
* c-pragma.c: Moved to...
* c-pragma.cc: ...here.
* c-pretty-print.c: Moved to...
* c-pretty-print.cc: ...here.
* c-semantics.c: Moved to...
* c-semantics.cc: ...here.
* c-ubsan.c: Moved to...
* c-ubsan.cc: ...here.
* c-warn.c: Moved to...
* c-warn.cc: ...here.
* cppspec.c: Moved to...
* cppspec.cc: ...here.
* stub-objc.c: Moved to...
* stub-objc.cc: ...here.
gcc/c/ChangeLog:
* c-aux-info.c: Moved to...
* c-aux-info.cc: ...here.
* c-convert.c: Moved to...
* c-convert.cc: ...here.
* c-decl.c: Moved to...
* c-decl.cc: ...here.
* c-errors.c: Moved to...
* c-errors.cc: ...here.
* c-fold.c: Moved to...
* c-fold.cc: ...here.
* c-lang.c: Moved to...
* c-lang.cc: ...here.
* c-objc-common.c: Moved to...
* c-objc-common.cc: ...here.
* c-parser.c: Moved to...
* c-parser.cc: ...here.
* c-typeck.c: Moved to...
* c-typeck.cc: ...here.
* gccspec.c: Moved to...
* gccspec.cc: ...here.
* gimple-parser.c: Moved to...
* gimple-parser.cc: ...here.
gcc/cp/ChangeLog:
* call.c: Moved to...
* call.cc: ...here.
* class.c: Moved to...
* class.cc: ...here.
* constexpr.c: Moved to...
* constexpr.cc: ...here.
* cp-gimplify.c: Moved to...
* cp-gimplify.cc: ...here.
* cp-lang.c: Moved to...
* cp-lang.cc: ...here.
* cp-objcp-common.c: Moved to...
* cp-objcp-common.cc: ...here.
* cp-ubsan.c: Moved to...
* cp-ubsan.cc: ...here.
* cvt.c: Moved to...
* cvt.cc: ...here.
* cxx-pretty-print.c: Moved to...
* cxx-pretty-print.cc: ...here.
* decl.c: Moved to...
* decl.cc: ...here.
* decl2.c: Moved to...
* decl2.cc: ...here.
* dump.c: Moved to...
* dump.cc: ...here.
* error.c: Moved to...
* error.cc: ...here.
* except.c: Moved to...
* except.cc: ...here.
* expr.c: Moved to...
* expr.cc: ...here.
* friend.c: Moved to...
* friend.cc: ...here.
* g++spec.c: Moved to...
* g++spec.cc: ...here.
* init.c: Moved to...
* init.cc: ...here.
* lambda.c: Moved to...
* lambda.cc: ...here.
* lex.c: Moved to...
* lex.cc: ...here.
* mangle.c: Moved to...
* mangle.cc: ...here.
* method.c: Moved to...
* method.cc: ...here.
* name-lookup.c: Moved to...
* name-lookup.cc: ...here.
* optimize.c: Moved to...
* optimize.cc: ...here.
* parser.c: Moved to...
* parser.cc: ...here.
* pt.c: Moved to...
* pt.cc: ...here.
* ptree.c: Moved to...
* ptree.cc: ...here.
* rtti.c: Moved to...
* rtti.cc: ...here.
* search.c: Moved to...
* search.cc: ...here.
* semantics.c: Moved to...
* semantics.cc: ...here.
* tree.c: Moved to...
* tree.cc: ...here.
* typeck.c: Moved to...
* typeck.cc: ...here.
* typeck2.c: Moved to...
* typeck2.cc: ...here.
* vtable-class-hierarchy.c: Moved to...
* vtable-class-hierarchy.cc: ...here.
gcc/fortran/ChangeLog:
* arith.c: Moved to...
* arith.cc: ...here.
* array.c: Moved to...
* array.cc: ...here.
* bbt.c: Moved to...
* bbt.cc: ...here.
* check.c: Moved to...
* check.cc: ...here.
* class.c: Moved to...
* class.cc: ...here.
* constructor.c: Moved to...
* constructor.cc: ...here.
* convert.c: Moved to...
* convert.cc: ...here.
* cpp.c: Moved to...
* cpp.cc: ...here.
* data.c: Moved to...
* data.cc: ...here.
* decl.c: Moved to...
* decl.cc: ...here.
* dependency.c: Moved to...
* dependency.cc: ...here.
* dump-parse-tree.c: Moved to...
* dump-parse-tree.cc: ...here.
* error.c: Moved to...
* error.cc: ...here.
* expr.c: Moved to...
* expr.cc: ...here.
* f95-lang.c: Moved to...
* f95-lang.cc: ...here.
* frontend-passes.c: Moved to...
* frontend-passes.cc: ...here.
* gfortranspec.c: Moved to...
* gfortranspec.cc: ...here.
* interface.c: Moved to...
* interface.cc: ...here.
* intrinsic.c: Moved to...
* intrinsic.cc: ...here.
* io.c: Moved to...
* io.cc: ...here.
* iresolve.c: Moved to...
* iresolve.cc: ...here.
* match.c: Moved to...
* match.cc: ...here.
* matchexp.c: Moved to...
* matchexp.cc: ...here.
* misc.c: Moved to...
* misc.cc: ...here.
* module.c: Moved to...
* module.cc: ...here.
* openmp.c: Moved to...
* openmp.cc: ...here.
* options.c: Moved to...
* options.cc: ...here.
* parse.c: Moved to...
* parse.cc: ...here.
* primary.c: Moved to...
* primary.cc: ...here.
* resolve.c: Moved to...
* resolve.cc: ...here.
* scanner.c: Moved to...
* scanner.cc: ...here.
* simplify.c: Moved to...
* simplify.cc: ...here.
* st.c: Moved to...
* st.cc: ...here.
* symbol.c: Moved to...
* symbol.cc: ...here.
* target-memory.c: Moved to...
* target-memory.cc: ...here.
* trans-array.c: Moved to...
* trans-array.cc: ...here.
* trans-common.c: Moved to...
* trans-common.cc: ...here.
* trans-const.c: Moved to...
* trans-const.cc: ...here.
* trans-decl.c: Moved to...
* trans-decl.cc: ...here.
* trans-expr.c: Moved to...
* trans-expr.cc: ...here.
* trans-intrinsic.c: Moved to...
* trans-intrinsic.cc: ...here.
* trans-io.c: Moved to...
* trans-io.cc: ...here.
* trans-openmp.c: Moved to...
* trans-openmp.cc: ...here.
* trans-stmt.c: Moved to...
* trans-stmt.cc: ...here.
* trans-types.c: Moved to...
* trans-types.cc: ...here.
* trans.c: Moved to...
* trans.cc: ...here.
gcc/go/ChangeLog:
* go-backend.c: Moved to...
* go-backend.cc: ...here.
* go-lang.c: Moved to...
* go-lang.cc: ...here.
* gospec.c: Moved to...
* gospec.cc: ...here.
gcc/jit/ChangeLog:
* dummy-frontend.c: Moved to...
* dummy-frontend.cc: ...here.
* jit-builtins.c: Moved to...
* jit-builtins.cc: ...here.
* jit-logging.c: Moved to...
* jit-logging.cc: ...here.
* jit-playback.c: Moved to...
* jit-playback.cc: ...here.
* jit-recording.c: Moved to...
* jit-recording.cc: ...here.
* jit-result.c: Moved to...
* jit-result.cc: ...here.
* jit-spec.c: Moved to...
* jit-spec.cc: ...here.
* jit-tempdir.c: Moved to...
* jit-tempdir.cc: ...here.
* jit-w32.c: Moved to...
* jit-w32.cc: ...here.
* libgccjit.c: Moved to...
* libgccjit.cc: ...here.
gcc/lto/ChangeLog:
* common.c: Moved to...
* common.cc: ...here.
* lto-common.c: Moved to...
* lto-common.cc: ...here.
* lto-dump.c: Moved to...
* lto-dump.cc: ...here.
* lto-lang.c: Moved to...
* lto-lang.cc: ...here.
* lto-object.c: Moved to...
* lto-object.cc: ...here.
* lto-partition.c: Moved to...
* lto-partition.cc: ...here.
* lto-symtab.c: Moved to...
* lto-symtab.cc: ...here.
* lto.c: Moved to...
* lto.cc: ...here.
gcc/objc/ChangeLog:
* objc-act.c: Moved to...
* objc-act.cc: ...here.
* objc-encoding.c: Moved to...
* objc-encoding.cc: ...here.
* objc-gnu-runtime-abi-01.c: Moved to...
* objc-gnu-runtime-abi-01.cc: ...here.
* objc-lang.c: Moved to...
* objc-lang.cc: ...here.
* objc-map.c: Moved to...
* objc-map.cc: ...here.
* objc-next-runtime-abi-01.c: Moved to...
* objc-next-runtime-abi-01.cc: ...here.
* objc-next-runtime-abi-02.c: Moved to...
* objc-next-runtime-abi-02.cc: ...here.
* objc-runtime-shared-support.c: Moved to...
* objc-runtime-shared-support.cc: ...here.
gcc/objcp/ChangeLog:
* objcp-decl.c: Moved to...
* objcp-decl.cc: ...here.
* objcp-lang.c: Moved to...
* objcp-lang.cc: ...here.
libcpp/ChangeLog:
* charset.c: Moved to...
* charset.cc: ...here.
* directives.c: Moved to...
* directives.cc: ...here.
* errors.c: Moved to...
* errors.cc: ...here.
* expr.c: Moved to...
* expr.cc: ...here.
* files.c: Moved to...
* files.cc: ...here.
* identifiers.c: Moved to...
* identifiers.cc: ...here.
* init.c: Moved to...
* init.cc: ...here.
* lex.c: Moved to...
* lex.cc: ...here.
* line-map.c: Moved to...
* line-map.cc: ...here.
* macro.c: Moved to...
* macro.cc: ...here.
* makeucnid.c: Moved to...
* makeucnid.cc: ...here.
* mkdeps.c: Moved to...
* mkdeps.cc: ...here.
* pch.c: Moved to...
* pch.cc: ...here.
* symtab.c: Moved to...
* symtab.cc: ...here.
* traditional.c: Moved to...
* traditional.cc: ...here.
Diffstat (limited to 'gcc/tree-ssa-dse.c')
-rw-r--r-- | gcc/tree-ssa-dse.c | 1515 |
1 files changed, 0 insertions, 1515 deletions
diff --git a/gcc/tree-ssa-dse.c b/gcc/tree-ssa-dse.c deleted file mode 100644 index ed73bee..0000000 --- a/gcc/tree-ssa-dse.c +++ /dev/null @@ -1,1515 +0,0 @@ -/* Dead and redundant store elimination - Copyright (C) 2004-2022 Free Software Foundation, Inc. - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 3, or (at your option) -any later version. - -GCC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING3. If not see -<http://www.gnu.org/licenses/>. */ - -#include "config.h" -#include "system.h" -#include "coretypes.h" -#include "backend.h" -#include "rtl.h" -#include "tree.h" -#include "gimple.h" -#include "tree-pass.h" -#include "ssa.h" -#include "gimple-pretty-print.h" -#include "fold-const.h" -#include "gimple-iterator.h" -#include "tree-cfg.h" -#include "tree-dfa.h" -#include "tree-cfgcleanup.h" -#include "alias.h" -#include "tree-ssa-loop.h" -#include "tree-ssa-dse.h" -#include "builtins.h" -#include "gimple-fold.h" -#include "gimplify.h" -#include "tree-eh.h" -#include "cfganal.h" -#include "cgraph.h" -#include "ipa-modref-tree.h" -#include "ipa-modref.h" - -/* This file implements dead store elimination. - - A dead store is a store into a memory location which will later be - overwritten by another store without any intervening loads. In this - case the earlier store can be deleted or trimmed if the store - was partially dead. - - A redundant store is a store into a memory location which stores - the exact same value as a prior store to the same memory location. - While this can often be handled by dead store elimination, removing - the redundant store is often better than removing or trimming the - dead store. - - In our SSA + virtual operand world we use immediate uses of virtual - operands to detect these cases. If a store's virtual definition - is used precisely once by a later store to the same location which - post dominates the first store, then the first store is dead. If - the data stored is the same, then the second store is redundant. - - The single use of the store's virtual definition ensures that - there are no intervening aliased loads and the requirement that - the second load post dominate the first ensures that if the earlier - store executes, then the later stores will execute before the function - exits. - - It may help to think of this as first moving the earlier store to - the point immediately before the later store. Again, the single - use of the virtual definition and the post-dominance relationship - ensure that such movement would be safe. Clearly if there are - back to back stores, then the second is makes the first dead. If - the second store stores the same value, then the second store is - redundant. - - Reviewing section 10.7.2 in Morgan's "Building an Optimizing Compiler" - may also help in understanding this code since it discusses the - relationship between dead store and redundant load elimination. In - fact, they are the same transformation applied to different views of - the CFG. */ - -static void delete_dead_or_redundant_call (gimple_stmt_iterator *, const char *); - -/* Bitmap of blocks that have had EH statements cleaned. We should - remove their dead edges eventually. */ -static bitmap need_eh_cleanup; -static bitmap need_ab_cleanup; - -/* STMT is a statement that may write into memory. Analyze it and - initialize WRITE to describe how STMT affects memory. - - Return TRUE if the statement was analyzed, FALSE otherwise. - - It is always safe to return FALSE. But typically better optimziation - can be achieved by analyzing more statements. */ - -static bool -initialize_ao_ref_for_dse (gimple *stmt, ao_ref *write) -{ - /* It's advantageous to handle certain mem* functions. */ - if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL)) - { - switch (DECL_FUNCTION_CODE (gimple_call_fndecl (stmt))) - { - case BUILT_IN_MEMCPY: - case BUILT_IN_MEMMOVE: - case BUILT_IN_MEMSET: - case BUILT_IN_MEMCPY_CHK: - case BUILT_IN_MEMMOVE_CHK: - case BUILT_IN_MEMSET_CHK: - case BUILT_IN_STRNCPY: - case BUILT_IN_STRNCPY_CHK: - { - tree size = gimple_call_arg (stmt, 2); - tree ptr = gimple_call_arg (stmt, 0); - ao_ref_init_from_ptr_and_size (write, ptr, size); - return true; - } - - /* A calloc call can never be dead, but it can make - subsequent stores redundant if they store 0 into - the same memory locations. */ - case BUILT_IN_CALLOC: - { - tree nelem = gimple_call_arg (stmt, 0); - tree selem = gimple_call_arg (stmt, 1); - tree lhs; - if (TREE_CODE (nelem) == INTEGER_CST - && TREE_CODE (selem) == INTEGER_CST - && (lhs = gimple_call_lhs (stmt)) != NULL_TREE) - { - tree size = fold_build2 (MULT_EXPR, TREE_TYPE (nelem), - nelem, selem); - ao_ref_init_from_ptr_and_size (write, lhs, size); - return true; - } - } - - default: - break; - } - } - else if (tree lhs = gimple_get_lhs (stmt)) - { - if (TREE_CODE (lhs) != SSA_NAME) - { - ao_ref_init (write, lhs); - return true; - } - } - return false; -} - -/* Given REF from the alias oracle, return TRUE if it is a valid - kill memory reference for dead store elimination, false otherwise. - - In particular, the reference must have a known base, known maximum - size, start at a byte offset and have a size that is one or more - bytes. */ - -static bool -valid_ao_ref_kill_for_dse (ao_ref *ref) -{ - return (ao_ref_base (ref) - && known_size_p (ref->max_size) - && maybe_ne (ref->size, 0) - && known_eq (ref->max_size, ref->size) - && known_ge (ref->offset, 0)); -} - -/* Given REF from the alias oracle, return TRUE if it is a valid - load or store memory reference for dead store elimination, false otherwise. - - Unlike for valid_ao_ref_kill_for_dse we can accept writes where max_size - is not same as size since we can handle conservatively the larger range. */ - -static bool -valid_ao_ref_for_dse (ao_ref *ref) -{ - return (ao_ref_base (ref) - && known_size_p (ref->max_size) - && known_ge (ref->offset, 0)); -} - -/* Initialize OFFSET and SIZE to a range known to contain REF - where the boundaries are divisible by BITS_PER_UNIT (bit still in bits). - Return false if this is impossible. */ - -static bool -get_byte_aligned_range_containing_ref (ao_ref *ref, poly_int64 *offset, - HOST_WIDE_INT *size) -{ - if (!known_size_p (ref->max_size)) - return false; - *offset = aligned_lower_bound (ref->offset, BITS_PER_UNIT); - poly_int64 end = aligned_upper_bound (ref->offset + ref->max_size, - BITS_PER_UNIT); - return (end - *offset).is_constant (size); -} - -/* Initialize OFFSET and SIZE to a range known to be contained REF - where the boundaries are divisible by BITS_PER_UNIT (but still in bits). - Return false if this is impossible. */ - -static bool -get_byte_aligned_range_contained_in_ref (ao_ref *ref, poly_int64 *offset, - HOST_WIDE_INT *size) -{ - if (!known_size_p (ref->size) - || !known_eq (ref->size, ref->max_size)) - return false; - *offset = aligned_upper_bound (ref->offset, BITS_PER_UNIT); - poly_int64 end = aligned_lower_bound (ref->offset + ref->max_size, - BITS_PER_UNIT); - /* For bit accesses we can get -1 here, but also 0 sized kill is not - useful. */ - if (!known_gt (end, *offset)) - return false; - return (end - *offset).is_constant (size); -} - -/* Compute byte range (returned iN REF_OFFSET and RET_SIZE) for access COPY - inside REF. If KILL is true, then COPY represent a kill and the byte range - needs to be fully contained in bit range given by COPY. If KILL is false - then the byte range returned must contain the range of COPY. */ - -static bool -get_byte_range (ao_ref *copy, ao_ref *ref, bool kill, - HOST_WIDE_INT *ret_offset, HOST_WIDE_INT *ret_size) -{ - HOST_WIDE_INT copy_size, ref_size; - poly_int64 copy_offset, ref_offset; - HOST_WIDE_INT diff; - - /* First translate from bits to bytes, rounding to bigger or smaller ranges - as needed. Kills needs to be always rounded to smaller ranges while - uses and stores to larger ranges. */ - if (kill) - { - if (!get_byte_aligned_range_contained_in_ref (copy, ©_offset, - ©_size)) - return false; - } - else - { - if (!get_byte_aligned_range_containing_ref (copy, ©_offset, - ©_size)) - return false; - } - - if (!get_byte_aligned_range_containing_ref (ref, &ref_offset, &ref_size) - || !ordered_p (copy_offset, ref_offset)) - return false; - - /* Switch sizes from bits to bytes so we do not need to care about - overflows. Offset calculation needs to stay in bits until we compute - the difference and can switch to HOST_WIDE_INT. */ - copy_size /= BITS_PER_UNIT; - ref_size /= BITS_PER_UNIT; - - /* If COPY starts before REF, then reset the beginning of - COPY to match REF and decrease the size of COPY by the - number of bytes removed from COPY. */ - if (maybe_lt (copy_offset, ref_offset)) - { - if (!(ref_offset - copy_offset).is_constant (&diff) - || copy_size < diff / BITS_PER_UNIT) - return false; - copy_size -= diff / BITS_PER_UNIT; - copy_offset = ref_offset; - } - - if (!(copy_offset - ref_offset).is_constant (&diff) - || ref_size <= diff / BITS_PER_UNIT) - return false; - - /* If COPY extends beyond REF, chop off its size appropriately. */ - HOST_WIDE_INT limit = ref_size - diff / BITS_PER_UNIT; - - if (copy_size > limit) - copy_size = limit; - *ret_size = copy_size; - if (!(copy_offset - ref_offset).is_constant (ret_offset)) - return false; - *ret_offset /= BITS_PER_UNIT; - return true; -} - -/* Update LIVE_BYTES tracking REF for write to WRITE: - Verify we have the same base memory address, the write - has a known size and overlaps with REF. */ -static void -clear_live_bytes_for_ref (sbitmap live_bytes, ao_ref *ref, ao_ref *write) -{ - HOST_WIDE_INT start, size; - - if (valid_ao_ref_kill_for_dse (write) - && operand_equal_p (write->base, ref->base, OEP_ADDRESS_OF) - && get_byte_range (write, ref, true, &start, &size)) - bitmap_clear_range (live_bytes, start, size); -} - -/* Clear any bytes written by STMT from the bitmap LIVE_BYTES. The base - address written by STMT must match the one found in REF, which must - have its base address previously initialized. - - This routine must be conservative. If we don't know the offset or - actual size written, assume nothing was written. */ - -static void -clear_bytes_written_by (sbitmap live_bytes, gimple *stmt, ao_ref *ref) -{ - ao_ref write; - - if (gcall *call = dyn_cast <gcall *> (stmt)) - { - bool interposed; - modref_summary *summary = get_modref_function_summary (call, &interposed); - - if (summary && !interposed) - for (auto kill : summary->kills) - if (kill.get_ao_ref (as_a <gcall *> (stmt), &write)) - clear_live_bytes_for_ref (live_bytes, ref, &write); - } - if (!initialize_ao_ref_for_dse (stmt, &write)) - return; - - clear_live_bytes_for_ref (live_bytes, ref, &write); -} - -/* REF is a memory write. Extract relevant information from it and - initialize the LIVE_BYTES bitmap. If successful, return TRUE. - Otherwise return FALSE. */ - -static bool -setup_live_bytes_from_ref (ao_ref *ref, sbitmap live_bytes) -{ - HOST_WIDE_INT const_size; - if (valid_ao_ref_for_dse (ref) - && ((aligned_upper_bound (ref->offset + ref->max_size, BITS_PER_UNIT) - - aligned_lower_bound (ref->offset, - BITS_PER_UNIT)).is_constant (&const_size)) - && (const_size / BITS_PER_UNIT <= param_dse_max_object_size) - && const_size > 1) - { - bitmap_clear (live_bytes); - bitmap_set_range (live_bytes, 0, const_size / BITS_PER_UNIT); - return true; - } - return false; -} - -/* Compute the number of elements that we can trim from the head and - tail of ORIG resulting in a bitmap that is a superset of LIVE. - - Store the number of elements trimmed from the head and tail in - TRIM_HEAD and TRIM_TAIL. - - STMT is the statement being trimmed and is used for debugging dump - output only. */ - -static void -compute_trims (ao_ref *ref, sbitmap live, int *trim_head, int *trim_tail, - gimple *stmt) -{ - /* We use sbitmaps biased such that ref->offset is bit zero and the bitmap - extends through ref->size. So we know that in the original bitmap - bits 0..ref->size were true. We don't actually need the bitmap, just - the REF to compute the trims. */ - - /* Now identify how much, if any of the tail we can chop off. */ - HOST_WIDE_INT const_size; - int last_live = bitmap_last_set_bit (live); - if (ref->size.is_constant (&const_size)) - { - int last_orig = (const_size / BITS_PER_UNIT) - 1; - /* We can leave inconvenient amounts on the tail as - residual handling in mem* and str* functions is usually - reasonably efficient. */ - *trim_tail = last_orig - last_live; - - /* But don't trim away out of bounds accesses, as this defeats - proper warnings. - - We could have a type with no TYPE_SIZE_UNIT or we could have a VLA - where TYPE_SIZE_UNIT is not a constant. */ - if (*trim_tail - && TYPE_SIZE_UNIT (TREE_TYPE (ref->base)) - && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (ref->base))) == INTEGER_CST - && compare_tree_int (TYPE_SIZE_UNIT (TREE_TYPE (ref->base)), - last_orig) <= 0) - *trim_tail = 0; - } - else - *trim_tail = 0; - - /* Identify how much, if any of the head we can chop off. */ - int first_orig = 0; - int first_live = bitmap_first_set_bit (live); - *trim_head = first_live - first_orig; - - /* If more than a word remains, then make sure to keep the - starting point at least word aligned. */ - if (last_live - first_live > UNITS_PER_WORD) - *trim_head &= ~(UNITS_PER_WORD - 1); - - if ((*trim_head || *trim_tail) - && dump_file && (dump_flags & TDF_DETAILS)) - { - fprintf (dump_file, " Trimming statement (head = %d, tail = %d): ", - *trim_head, *trim_tail); - print_gimple_stmt (dump_file, stmt, 0, dump_flags); - fprintf (dump_file, "\n"); - } -} - -/* STMT initializes an object from COMPLEX_CST where one or more of the - bytes written may be dead stores. REF is a representation of the - memory written. LIVE is the bitmap of stores that are actually live. - - Attempt to rewrite STMT so that only the real or imaginary part of - the object is actually stored. */ - -static void -maybe_trim_complex_store (ao_ref *ref, sbitmap live, gimple *stmt) -{ - int trim_head, trim_tail; - compute_trims (ref, live, &trim_head, &trim_tail, stmt); - - /* The amount of data trimmed from the head or tail must be at - least half the size of the object to ensure we're trimming - the entire real or imaginary half. By writing things this - way we avoid more O(n) bitmap operations. */ - if (known_ge (trim_tail * 2 * BITS_PER_UNIT, ref->size)) - { - /* TREE_REALPART is live */ - tree x = TREE_REALPART (gimple_assign_rhs1 (stmt)); - tree y = gimple_assign_lhs (stmt); - y = build1 (REALPART_EXPR, TREE_TYPE (x), y); - gimple_assign_set_lhs (stmt, y); - gimple_assign_set_rhs1 (stmt, x); - } - else if (known_ge (trim_head * 2 * BITS_PER_UNIT, ref->size)) - { - /* TREE_IMAGPART is live */ - tree x = TREE_IMAGPART (gimple_assign_rhs1 (stmt)); - tree y = gimple_assign_lhs (stmt); - y = build1 (IMAGPART_EXPR, TREE_TYPE (x), y); - gimple_assign_set_lhs (stmt, y); - gimple_assign_set_rhs1 (stmt, x); - } - - /* Other cases indicate parts of both the real and imag subobjects - are live. We do not try to optimize those cases. */ -} - -/* STMT initializes an object using a CONSTRUCTOR where one or more of the - bytes written are dead stores. ORIG is the bitmap of bytes stored by - STMT. LIVE is the bitmap of stores that are actually live. - - Attempt to rewrite STMT so that only the real or imaginary part of - the object is actually stored. - - The most common case for getting here is a CONSTRUCTOR with no elements - being used to zero initialize an object. We do not try to handle other - cases as those would force us to fully cover the object with the - CONSTRUCTOR node except for the components that are dead. */ - -static void -maybe_trim_constructor_store (ao_ref *ref, sbitmap live, gimple *stmt) -{ - tree ctor = gimple_assign_rhs1 (stmt); - - /* This is the only case we currently handle. It actually seems to - catch most cases of actual interest. */ - gcc_assert (CONSTRUCTOR_NELTS (ctor) == 0); - - int head_trim = 0; - int tail_trim = 0; - compute_trims (ref, live, &head_trim, &tail_trim, stmt); - - /* Now we want to replace the constructor initializer - with memset (object + head_trim, 0, size - head_trim - tail_trim). */ - if (head_trim || tail_trim) - { - /* We want &lhs for the MEM_REF expression. */ - tree lhs_addr = build_fold_addr_expr (gimple_assign_lhs (stmt)); - - if (! is_gimple_min_invariant (lhs_addr)) - return; - - /* The number of bytes for the new constructor. */ - poly_int64 ref_bytes = exact_div (ref->size, BITS_PER_UNIT); - poly_int64 count = ref_bytes - head_trim - tail_trim; - - /* And the new type for the CONSTRUCTOR. Essentially it's just - a char array large enough to cover the non-trimmed parts of - the original CONSTRUCTOR. Note we want explicit bounds here - so that we know how many bytes to clear when expanding the - CONSTRUCTOR. */ - tree type = build_array_type_nelts (char_type_node, count); - - /* Build a suitable alias type rather than using alias set zero - to avoid pessimizing. */ - tree alias_type = reference_alias_ptr_type (gimple_assign_lhs (stmt)); - - /* Build a MEM_REF representing the whole accessed area, starting - at the first byte not trimmed. */ - tree exp = fold_build2 (MEM_REF, type, lhs_addr, - build_int_cst (alias_type, head_trim)); - - /* Now update STMT with a new RHS and LHS. */ - gimple_assign_set_lhs (stmt, exp); - gimple_assign_set_rhs1 (stmt, build_constructor (type, NULL)); - } -} - -/* STMT is a memcpy, memmove or memset. Decrement the number of bytes - copied/set by DECREMENT. */ -static void -decrement_count (gimple *stmt, int decrement) -{ - tree *countp = gimple_call_arg_ptr (stmt, 2); - gcc_assert (TREE_CODE (*countp) == INTEGER_CST); - *countp = wide_int_to_tree (TREE_TYPE (*countp), (TREE_INT_CST_LOW (*countp) - - decrement)); -} - -static void -increment_start_addr (gimple *stmt, tree *where, int increment) -{ - if (tree lhs = gimple_call_lhs (stmt)) - if (where == gimple_call_arg_ptr (stmt, 0)) - { - gassign *newop = gimple_build_assign (lhs, unshare_expr (*where)); - gimple_stmt_iterator gsi = gsi_for_stmt (stmt); - gsi_insert_after (&gsi, newop, GSI_SAME_STMT); - gimple_call_set_lhs (stmt, NULL_TREE); - update_stmt (stmt); - } - - if (TREE_CODE (*where) == SSA_NAME) - { - tree tem = make_ssa_name (TREE_TYPE (*where)); - gassign *newop - = gimple_build_assign (tem, POINTER_PLUS_EXPR, *where, - build_int_cst (sizetype, increment)); - gimple_stmt_iterator gsi = gsi_for_stmt (stmt); - gsi_insert_before (&gsi, newop, GSI_SAME_STMT); - *where = tem; - update_stmt (stmt); - return; - } - - *where = build_fold_addr_expr (fold_build2 (MEM_REF, char_type_node, - *where, - build_int_cst (ptr_type_node, - increment))); -} - -/* STMT is builtin call that writes bytes in bitmap ORIG, some bytes are dead - (ORIG & ~NEW) and need not be stored. Try to rewrite STMT to reduce - the amount of data it actually writes. - - Right now we only support trimming from the head or the tail of the - memory region. In theory we could split the mem* call, but it's - likely of marginal value. */ - -static void -maybe_trim_memstar_call (ao_ref *ref, sbitmap live, gimple *stmt) -{ - int head_trim, tail_trim; - switch (DECL_FUNCTION_CODE (gimple_call_fndecl (stmt))) - { - case BUILT_IN_STRNCPY: - case BUILT_IN_STRNCPY_CHK: - compute_trims (ref, live, &head_trim, &tail_trim, stmt); - if (head_trim) - { - /* Head trimming of strncpy is only possible if we can - prove all bytes we would trim are non-zero (or we could - turn the strncpy into memset if there must be zero - among the head trimmed bytes). If we don't know anything - about those bytes, the presence or absence of '\0' bytes - in there will affect whether it acts for the non-trimmed - bytes as memset or memcpy/strncpy. */ - c_strlen_data lendata = { }; - int orig_head_trim = head_trim; - tree srcstr = gimple_call_arg (stmt, 1); - if (!get_range_strlen (srcstr, &lendata, /*eltsize=*/1) - || !tree_fits_uhwi_p (lendata.minlen)) - head_trim = 0; - else if (tree_to_uhwi (lendata.minlen) < (unsigned) head_trim) - { - head_trim = tree_to_uhwi (lendata.minlen); - if ((orig_head_trim & (UNITS_PER_WORD - 1)) == 0) - head_trim &= ~(UNITS_PER_WORD - 1); - } - if (orig_head_trim != head_trim - && dump_file - && (dump_flags & TDF_DETAILS)) - fprintf (dump_file, - " Adjusting strncpy trimming to (head = %d," - " tail = %d)\n", head_trim, tail_trim); - } - goto do_memcpy; - - case BUILT_IN_MEMCPY: - case BUILT_IN_MEMMOVE: - case BUILT_IN_MEMCPY_CHK: - case BUILT_IN_MEMMOVE_CHK: - compute_trims (ref, live, &head_trim, &tail_trim, stmt); - - do_memcpy: - /* Tail trimming is easy, we can just reduce the count. */ - if (tail_trim) - decrement_count (stmt, tail_trim); - - /* Head trimming requires adjusting all the arguments. */ - if (head_trim) - { - /* For __*_chk need to adjust also the last argument. */ - if (gimple_call_num_args (stmt) == 4) - { - tree size = gimple_call_arg (stmt, 3); - if (!tree_fits_uhwi_p (size)) - break; - if (!integer_all_onesp (size)) - { - unsigned HOST_WIDE_INT sz = tree_to_uhwi (size); - if (sz < (unsigned) head_trim) - break; - tree arg = wide_int_to_tree (TREE_TYPE (size), - sz - head_trim); - gimple_call_set_arg (stmt, 3, arg); - } - } - tree *dst = gimple_call_arg_ptr (stmt, 0); - increment_start_addr (stmt, dst, head_trim); - tree *src = gimple_call_arg_ptr (stmt, 1); - increment_start_addr (stmt, src, head_trim); - decrement_count (stmt, head_trim); - } - break; - - case BUILT_IN_MEMSET: - case BUILT_IN_MEMSET_CHK: - compute_trims (ref, live, &head_trim, &tail_trim, stmt); - - /* Tail trimming is easy, we can just reduce the count. */ - if (tail_trim) - decrement_count (stmt, tail_trim); - - /* Head trimming requires adjusting all the arguments. */ - if (head_trim) - { - /* For __*_chk need to adjust also the last argument. */ - if (gimple_call_num_args (stmt) == 4) - { - tree size = gimple_call_arg (stmt, 3); - if (!tree_fits_uhwi_p (size)) - break; - if (!integer_all_onesp (size)) - { - unsigned HOST_WIDE_INT sz = tree_to_uhwi (size); - if (sz < (unsigned) head_trim) - break; - tree arg = wide_int_to_tree (TREE_TYPE (size), - sz - head_trim); - gimple_call_set_arg (stmt, 3, arg); - } - } - tree *dst = gimple_call_arg_ptr (stmt, 0); - increment_start_addr (stmt, dst, head_trim); - decrement_count (stmt, head_trim); - } - break; - - default: - break; - } -} - -/* STMT is a memory write where one or more bytes written are dead - stores. ORIG is the bitmap of bytes stored by STMT. LIVE is the - bitmap of stores that are actually live. - - Attempt to rewrite STMT so that it writes fewer memory locations. Right - now we only support trimming at the start or end of the memory region. - It's not clear how much there is to be gained by trimming from the middle - of the region. */ - -static void -maybe_trim_partially_dead_store (ao_ref *ref, sbitmap live, gimple *stmt) -{ - if (is_gimple_assign (stmt) - && TREE_CODE (gimple_assign_lhs (stmt)) != TARGET_MEM_REF) - { - switch (gimple_assign_rhs_code (stmt)) - { - case CONSTRUCTOR: - maybe_trim_constructor_store (ref, live, stmt); - break; - case COMPLEX_CST: - maybe_trim_complex_store (ref, live, stmt); - break; - default: - break; - } - } -} - -/* Return TRUE if USE_REF reads bytes from LIVE where live is - derived from REF, a write reference. - - While this routine may modify USE_REF, it's passed by value, not - location. So callers do not see those modifications. */ - -static bool -live_bytes_read (ao_ref *use_ref, ao_ref *ref, sbitmap live) -{ - /* We have already verified that USE_REF and REF hit the same object. - Now verify that there's actually an overlap between USE_REF and REF. */ - HOST_WIDE_INT start, size; - if (get_byte_range (use_ref, ref, false, &start, &size)) - { - /* If USE_REF covers all of REF, then it will hit one or more - live bytes. This avoids useless iteration over the bitmap - below. */ - if (start == 0 && known_eq (size * 8, ref->size)) - return true; - - /* Now check if any of the remaining bits in use_ref are set in LIVE. */ - return bitmap_bit_in_range_p (live, start, (start + size - 1)); - } - return true; -} - -/* Callback for dse_classify_store calling for_each_index. Verify that - indices are invariant in the loop with backedge PHI in basic-block DATA. */ - -static bool -check_name (tree, tree *idx, void *data) -{ - basic_block phi_bb = (basic_block) data; - if (TREE_CODE (*idx) == SSA_NAME - && !SSA_NAME_IS_DEFAULT_DEF (*idx) - && dominated_by_p (CDI_DOMINATORS, gimple_bb (SSA_NAME_DEF_STMT (*idx)), - phi_bb)) - return false; - return true; -} - -/* STMT stores the value 0 into one or more memory locations - (via memset, empty constructor, calloc call, etc). - - See if there is a subsequent store of the value 0 to one - or more of the same memory location(s). If so, the subsequent - store is redundant and can be removed. - - The subsequent stores could be via memset, empty constructors, - simple MEM stores, etc. */ - -static void -dse_optimize_redundant_stores (gimple *stmt) -{ - int cnt = 0; - - /* TBAA state of STMT, if it is a call it is effectively alias-set zero. */ - alias_set_type earlier_set = 0; - alias_set_type earlier_base_set = 0; - if (is_gimple_assign (stmt)) - { - ao_ref lhs_ref; - ao_ref_init (&lhs_ref, gimple_assign_lhs (stmt)); - earlier_set = ao_ref_alias_set (&lhs_ref); - earlier_base_set = ao_ref_base_alias_set (&lhs_ref); - } - - /* We could do something fairly complex and look through PHIs - like DSE_CLASSIFY_STORE, but it doesn't seem to be worth - the effort. - - Look at all the immediate uses of the VDEF (which are obviously - dominated by STMT). See if one or more stores 0 into the same - memory locations a STMT, if so remove the immediate use statements. */ - tree defvar = gimple_vdef (stmt); - imm_use_iterator ui; - gimple *use_stmt; - FOR_EACH_IMM_USE_STMT (use_stmt, ui, defvar) - { - /* Limit stmt walking. */ - if (++cnt > param_dse_max_alias_queries_per_store) - break; - - /* If USE_STMT stores 0 into one or more of the same locations - as STMT and STMT would kill USE_STMT, then we can just remove - USE_STMT. */ - tree fndecl; - if ((is_gimple_assign (use_stmt) - && gimple_vdef (use_stmt) - && (gimple_assign_single_p (use_stmt) - && initializer_zerop (gimple_assign_rhs1 (use_stmt)))) - || (gimple_call_builtin_p (use_stmt, BUILT_IN_NORMAL) - && (fndecl = gimple_call_fndecl (use_stmt)) != NULL - && (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_MEMSET - || DECL_FUNCTION_CODE (fndecl) == BUILT_IN_MEMSET_CHK) - && integer_zerop (gimple_call_arg (use_stmt, 1)))) - { - ao_ref write; - - if (!initialize_ao_ref_for_dse (use_stmt, &write)) - break; - - if (valid_ao_ref_for_dse (&write) - && stmt_kills_ref_p (stmt, &write)) - { - gimple_stmt_iterator gsi = gsi_for_stmt (use_stmt); - if (is_gimple_assign (use_stmt)) - { - ao_ref lhs_ref; - ao_ref_init (&lhs_ref, gimple_assign_lhs (use_stmt)); - if ((earlier_set == ao_ref_alias_set (&lhs_ref) - || alias_set_subset_of (ao_ref_alias_set (&lhs_ref), - earlier_set)) - && (earlier_base_set == ao_ref_base_alias_set (&lhs_ref) - || alias_set_subset_of - (ao_ref_base_alias_set (&lhs_ref), - earlier_base_set))) - delete_dead_or_redundant_assignment (&gsi, "redundant", - need_eh_cleanup, - need_ab_cleanup); - } - else if (is_gimple_call (use_stmt)) - { - if ((earlier_set == 0 - || alias_set_subset_of (0, earlier_set)) - && (earlier_base_set == 0 - || alias_set_subset_of (0, earlier_base_set))) - delete_dead_or_redundant_call (&gsi, "redundant"); - } - else - gcc_unreachable (); - } - } - } -} - -/* A helper of dse_optimize_stmt. - Given a GIMPLE_ASSIGN in STMT that writes to REF, classify it - according to downstream uses and defs. Sets *BY_CLOBBER_P to true - if only clobber statements influenced the classification result. - Returns the classification. */ - -dse_store_status -dse_classify_store (ao_ref *ref, gimple *stmt, - bool byte_tracking_enabled, sbitmap live_bytes, - bool *by_clobber_p, tree stop_at_vuse) -{ - gimple *temp; - int cnt = 0; - auto_bitmap visited; - - if (by_clobber_p) - *by_clobber_p = true; - - /* Find the first dominated statement that clobbers (part of) the - memory stmt stores to with no intermediate statement that may use - part of the memory stmt stores. That is, find a store that may - prove stmt to be a dead store. */ - temp = stmt; - do - { - gimple *use_stmt; - imm_use_iterator ui; - bool fail = false; - tree defvar; - - if (gimple_code (temp) == GIMPLE_PHI) - { - /* If we visit this PHI by following a backedge then we have to - make sure ref->ref only refers to SSA names that are invariant - with respect to the loop represented by this PHI node. */ - if (dominated_by_p (CDI_DOMINATORS, gimple_bb (stmt), - gimple_bb (temp)) - && !for_each_index (ref->ref ? &ref->ref : &ref->base, - check_name, gimple_bb (temp))) - return DSE_STORE_LIVE; - defvar = PHI_RESULT (temp); - bitmap_set_bit (visited, SSA_NAME_VERSION (defvar)); - } - else - defvar = gimple_vdef (temp); - - /* If we're instructed to stop walking at region boundary, do so. */ - if (defvar == stop_at_vuse) - return DSE_STORE_LIVE; - - auto_vec<gimple *, 10> defs; - gimple *first_phi_def = NULL; - gimple *last_phi_def = NULL; - FOR_EACH_IMM_USE_STMT (use_stmt, ui, defvar) - { - /* Limit stmt walking. */ - if (++cnt > param_dse_max_alias_queries_per_store) - { - fail = true; - break; - } - - /* In simple cases we can look through PHI nodes, but we - have to be careful with loops and with memory references - containing operands that are also operands of PHI nodes. - See gcc.c-torture/execute/20051110-*.c. */ - if (gimple_code (use_stmt) == GIMPLE_PHI) - { - /* If we already visited this PHI ignore it for further - processing. */ - if (!bitmap_bit_p (visited, - SSA_NAME_VERSION (PHI_RESULT (use_stmt)))) - { - defs.safe_push (use_stmt); - if (!first_phi_def) - first_phi_def = use_stmt; - last_phi_def = use_stmt; - } - } - /* If the statement is a use the store is not dead. */ - else if (ref_maybe_used_by_stmt_p (use_stmt, ref)) - { - /* Handle common cases where we can easily build an ao_ref - structure for USE_STMT and in doing so we find that the - references hit non-live bytes and thus can be ignored. - - TODO: We can also use modref summary to handle calls. */ - if (byte_tracking_enabled - && is_gimple_assign (use_stmt)) - { - ao_ref use_ref; - ao_ref_init (&use_ref, gimple_assign_rhs1 (use_stmt)); - if (valid_ao_ref_for_dse (&use_ref) - && operand_equal_p (use_ref.base, ref->base, - OEP_ADDRESS_OF) - && !live_bytes_read (&use_ref, ref, live_bytes)) - { - /* If this is a store, remember it as we possibly - need to walk the defs uses. */ - if (gimple_vdef (use_stmt)) - defs.safe_push (use_stmt); - continue; - } - } - - fail = true; - break; - } - /* We have visited ourselves already so ignore STMT for the - purpose of chaining. */ - else if (use_stmt == stmt) - ; - /* If this is a store, remember it as we possibly need to walk the - defs uses. */ - else if (gimple_vdef (use_stmt)) - defs.safe_push (use_stmt); - } - - if (fail) - { - /* STMT might be partially dead and we may be able to reduce - how many memory locations it stores into. */ - if (byte_tracking_enabled && !gimple_clobber_p (stmt)) - return DSE_STORE_MAYBE_PARTIAL_DEAD; - return DSE_STORE_LIVE; - } - - /* If we didn't find any definition this means the store is dead - if it isn't a store to global reachable memory. In this case - just pretend the stmt makes itself dead. Otherwise fail. */ - if (defs.is_empty ()) - { - if (ref_may_alias_global_p (ref)) - return DSE_STORE_LIVE; - - if (by_clobber_p) - *by_clobber_p = false; - return DSE_STORE_DEAD; - } - - /* Process defs and remove those we need not process further. */ - for (unsigned i = 0; i < defs.length ();) - { - gimple *def = defs[i]; - gimple *use_stmt; - use_operand_p use_p; - tree vdef = (gimple_code (def) == GIMPLE_PHI - ? gimple_phi_result (def) : gimple_vdef (def)); - /* If the path to check starts with a kill we do not need to - process it further. - ??? With byte tracking we need only kill the bytes currently - live. */ - if (stmt_kills_ref_p (def, ref)) - { - if (by_clobber_p && !gimple_clobber_p (def)) - *by_clobber_p = false; - defs.unordered_remove (i); - } - /* If the path ends here we do not need to process it further. - This for example happens with calls to noreturn functions. */ - else if (has_zero_uses (vdef)) - { - /* But if the store is to global memory it is definitely - not dead. */ - if (ref_may_alias_global_p (ref)) - return DSE_STORE_LIVE; - defs.unordered_remove (i); - } - /* In addition to kills we can remove defs whose only use - is another def in defs. That can only ever be PHIs of which - we track two for simplicity reasons, the first and last in - {first,last}_phi_def (we fail for multiple PHIs anyways). - We can also ignore defs that feed only into - already visited PHIs. */ - else if (single_imm_use (vdef, &use_p, &use_stmt) - && (use_stmt == first_phi_def - || use_stmt == last_phi_def - || (gimple_code (use_stmt) == GIMPLE_PHI - && bitmap_bit_p (visited, - SSA_NAME_VERSION - (PHI_RESULT (use_stmt)))))) - defs.unordered_remove (i); - else - ++i; - } - - /* If all defs kill the ref we are done. */ - if (defs.is_empty ()) - return DSE_STORE_DEAD; - /* If more than one def survives fail. */ - if (defs.length () > 1) - { - /* STMT might be partially dead and we may be able to reduce - how many memory locations it stores into. */ - if (byte_tracking_enabled && !gimple_clobber_p (stmt)) - return DSE_STORE_MAYBE_PARTIAL_DEAD; - return DSE_STORE_LIVE; - } - temp = defs[0]; - - /* Track partial kills. */ - if (byte_tracking_enabled) - { - clear_bytes_written_by (live_bytes, temp, ref); - if (bitmap_empty_p (live_bytes)) - { - if (by_clobber_p && !gimple_clobber_p (temp)) - *by_clobber_p = false; - return DSE_STORE_DEAD; - } - } - } - /* Continue walking until there are no more live bytes. */ - while (1); -} - - -/* Delete a dead call at GSI, which is mem* call of some kind. */ -static void -delete_dead_or_redundant_call (gimple_stmt_iterator *gsi, const char *type) -{ - gimple *stmt = gsi_stmt (*gsi); - if (dump_file && (dump_flags & TDF_DETAILS)) - { - fprintf (dump_file, " Deleted %s call: ", type); - print_gimple_stmt (dump_file, stmt, 0, dump_flags); - fprintf (dump_file, "\n"); - } - - basic_block bb = gimple_bb (stmt); - tree lhs = gimple_call_lhs (stmt); - if (lhs) - { - tree ptr = gimple_call_arg (stmt, 0); - gimple *new_stmt = gimple_build_assign (lhs, ptr); - unlink_stmt_vdef (stmt); - if (gsi_replace (gsi, new_stmt, true)) - bitmap_set_bit (need_eh_cleanup, bb->index); - } - else - { - /* Then we need to fix the operand of the consuming stmt. */ - unlink_stmt_vdef (stmt); - - /* Remove the dead store. */ - if (gsi_remove (gsi, true)) - bitmap_set_bit (need_eh_cleanup, bb->index); - release_defs (stmt); - } -} - -/* Delete a dead store at GSI, which is a gimple assignment. */ - -void -delete_dead_or_redundant_assignment (gimple_stmt_iterator *gsi, - const char *type, - bitmap need_eh_cleanup, - bitmap need_ab_cleanup) -{ - gimple *stmt = gsi_stmt (*gsi); - if (dump_file && (dump_flags & TDF_DETAILS)) - { - fprintf (dump_file, " Deleted %s store: ", type); - print_gimple_stmt (dump_file, stmt, 0, dump_flags); - fprintf (dump_file, "\n"); - } - - /* Then we need to fix the operand of the consuming stmt. */ - unlink_stmt_vdef (stmt); - - /* Remove the dead store. */ - basic_block bb = gimple_bb (stmt); - if (need_ab_cleanup && stmt_can_make_abnormal_goto (stmt)) - bitmap_set_bit (need_ab_cleanup, bb->index); - if (gsi_remove (gsi, true) && need_eh_cleanup) - bitmap_set_bit (need_eh_cleanup, bb->index); - - /* And release any SSA_NAMEs set in this statement back to the - SSA_NAME manager. */ - release_defs (stmt); -} - -/* Try to prove, using modref summary, that all memory written to by a call is - dead and remove it. Assume that if return value is written to memory - it is already proved to be dead. */ - -static bool -dse_optimize_call (gimple_stmt_iterator *gsi, sbitmap live_bytes) -{ - gcall *stmt = dyn_cast <gcall *> (gsi_stmt (*gsi)); - - if (!stmt) - return false; - - tree callee = gimple_call_fndecl (stmt); - - if (!callee) - return false; - - /* Pure/const functions are optimized by normal DCE - or handled as store above. */ - int flags = gimple_call_flags (stmt); - if ((flags & (ECF_PURE|ECF_CONST|ECF_NOVOPS)) - && !(flags & (ECF_LOOPING_CONST_OR_PURE))) - return false; - - cgraph_node *node = cgraph_node::get (callee); - if (!node) - return false; - - if (stmt_could_throw_p (cfun, stmt) - && !cfun->can_delete_dead_exceptions) - return false; - - /* If return value is used the call is not dead. */ - tree lhs = gimple_call_lhs (stmt); - if (lhs && TREE_CODE (lhs) == SSA_NAME) - { - imm_use_iterator ui; - gimple *use_stmt; - FOR_EACH_IMM_USE_STMT (use_stmt, ui, lhs) - if (!is_gimple_debug (use_stmt)) - return false; - } - - /* Verify that there are no side-effects except for return value - and memory writes tracked by modref. */ - modref_summary *summary = get_modref_function_summary (node); - if (!summary || !summary->try_dse) - return false; - - bool by_clobber_p = false; - - /* Walk all memory writes and verify that they are dead. */ - for (auto base_node : summary->stores->bases) - for (auto ref_node : base_node->refs) - for (auto access_node : ref_node->accesses) - { - tree arg = access_node.get_call_arg (stmt); - - if (!arg) - return false; - - if (integer_zerop (arg) && flag_delete_null_pointer_checks) - continue; - - ao_ref ref; - - if (!access_node.get_ao_ref (stmt, &ref)) - return false; - ref.ref_alias_set = ref_node->ref; - ref.base_alias_set = base_node->base; - - bool byte_tracking_enabled - = setup_live_bytes_from_ref (&ref, live_bytes); - enum dse_store_status store_status; - - store_status = dse_classify_store (&ref, stmt, - byte_tracking_enabled, - live_bytes, &by_clobber_p); - if (store_status != DSE_STORE_DEAD) - return false; - } - delete_dead_or_redundant_assignment (gsi, "dead", need_eh_cleanup, - need_ab_cleanup); - return true; -} - -/* Attempt to eliminate dead stores in the statement referenced by BSI. - - A dead store is a store into a memory location which will later be - overwritten by another store without any intervening loads. In this - case the earlier store can be deleted. - - In our SSA + virtual operand world we use immediate uses of virtual - operands to detect dead stores. If a store's virtual definition - is used precisely once by a later store to the same location which - post dominates the first store, then the first store is dead. */ - -static void -dse_optimize_stmt (function *fun, gimple_stmt_iterator *gsi, sbitmap live_bytes) -{ - gimple *stmt = gsi_stmt (*gsi); - - /* Don't return early on *this_2(D) ={v} {CLOBBER}. */ - if (gimple_has_volatile_ops (stmt) - && (!gimple_clobber_p (stmt) - || TREE_CODE (gimple_assign_lhs (stmt)) != MEM_REF)) - return; - - ao_ref ref; - /* If this is not a store we can still remove dead call using - modref summary. */ - if (!initialize_ao_ref_for_dse (stmt, &ref)) - { - dse_optimize_call (gsi, live_bytes); - return; - } - - /* We know we have virtual definitions. We can handle assignments and - some builtin calls. */ - if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL)) - { - tree fndecl = gimple_call_fndecl (stmt); - switch (DECL_FUNCTION_CODE (fndecl)) - { - case BUILT_IN_MEMCPY: - case BUILT_IN_MEMMOVE: - case BUILT_IN_STRNCPY: - case BUILT_IN_MEMSET: - case BUILT_IN_MEMCPY_CHK: - case BUILT_IN_MEMMOVE_CHK: - case BUILT_IN_STRNCPY_CHK: - case BUILT_IN_MEMSET_CHK: - { - /* Occasionally calls with an explicit length of zero - show up in the IL. It's pointless to do analysis - on them, they're trivially dead. */ - tree size = gimple_call_arg (stmt, 2); - if (integer_zerop (size)) - { - delete_dead_or_redundant_call (gsi, "dead"); - return; - } - - /* If this is a memset call that initializes an object - to zero, it may be redundant with an earlier memset - or empty CONSTRUCTOR of a larger object. */ - if ((DECL_FUNCTION_CODE (fndecl) == BUILT_IN_MEMSET - || DECL_FUNCTION_CODE (fndecl) == BUILT_IN_MEMSET_CHK) - && integer_zerop (gimple_call_arg (stmt, 1))) - dse_optimize_redundant_stores (stmt); - - enum dse_store_status store_status; - bool byte_tracking_enabled - = setup_live_bytes_from_ref (&ref, live_bytes); - store_status = dse_classify_store (&ref, stmt, - byte_tracking_enabled, - live_bytes); - if (store_status == DSE_STORE_LIVE) - return; - - if (store_status == DSE_STORE_MAYBE_PARTIAL_DEAD) - { - maybe_trim_memstar_call (&ref, live_bytes, stmt); - return; - } - - if (store_status == DSE_STORE_DEAD) - delete_dead_or_redundant_call (gsi, "dead"); - return; - } - - case BUILT_IN_CALLOC: - /* We already know the arguments are integer constants. */ - dse_optimize_redundant_stores (stmt); - return; - - default: - return; - } - } - - bool by_clobber_p = false; - - /* Check if this statement stores zero to a memory location, - and if there is a subsequent store of zero to the same - memory location. If so, remove the subsequent store. */ - if (gimple_assign_single_p (stmt) - && initializer_zerop (gimple_assign_rhs1 (stmt))) - dse_optimize_redundant_stores (stmt); - - /* Self-assignments are zombies. */ - if (is_gimple_assign (stmt) - && operand_equal_p (gimple_assign_rhs1 (stmt), - gimple_assign_lhs (stmt), 0)) - ; - else - { - bool byte_tracking_enabled - = setup_live_bytes_from_ref (&ref, live_bytes); - enum dse_store_status store_status; - store_status = dse_classify_store (&ref, stmt, - byte_tracking_enabled, - live_bytes, &by_clobber_p); - if (store_status == DSE_STORE_LIVE) - return; - - if (store_status == DSE_STORE_MAYBE_PARTIAL_DEAD) - { - maybe_trim_partially_dead_store (&ref, live_bytes, stmt); - return; - } - } - - /* Now we know that use_stmt kills the LHS of stmt. */ - - /* But only remove *this_2(D) ={v} {CLOBBER} if killed by - another clobber stmt. */ - if (gimple_clobber_p (stmt) - && !by_clobber_p) - return; - - if (is_gimple_call (stmt) - && (gimple_has_side_effects (stmt) - || (stmt_could_throw_p (fun, stmt) - && !fun->can_delete_dead_exceptions))) - { - /* See if we can remove complete call. */ - if (dse_optimize_call (gsi, live_bytes)) - return; - /* Make sure we do not remove a return slot we cannot reconstruct - later. */ - if (gimple_call_return_slot_opt_p (as_a <gcall *>(stmt)) - && (TREE_ADDRESSABLE (TREE_TYPE (gimple_call_fntype (stmt))) - || !poly_int_tree_p - (TYPE_SIZE (TREE_TYPE (gimple_call_fntype (stmt)))))) - return; - if (dump_file && (dump_flags & TDF_DETAILS)) - { - fprintf (dump_file, " Deleted dead store in call LHS: "); - print_gimple_stmt (dump_file, stmt, 0, dump_flags); - fprintf (dump_file, "\n"); - } - gimple_call_set_lhs (stmt, NULL_TREE); - update_stmt (stmt); - } - else - delete_dead_or_redundant_assignment (gsi, "dead", need_eh_cleanup, - need_ab_cleanup); -} - -namespace { - -const pass_data pass_data_dse = -{ - GIMPLE_PASS, /* type */ - "dse", /* name */ - OPTGROUP_NONE, /* optinfo_flags */ - TV_TREE_DSE, /* tv_id */ - ( PROP_cfg | PROP_ssa ), /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - 0, /* todo_flags_finish */ -}; - -class pass_dse : public gimple_opt_pass -{ -public: - pass_dse (gcc::context *ctxt) - : gimple_opt_pass (pass_data_dse, ctxt) - {} - - /* opt_pass methods: */ - opt_pass * clone () { return new pass_dse (m_ctxt); } - virtual bool gate (function *) { return flag_tree_dse != 0; } - virtual unsigned int execute (function *); - -}; // class pass_dse - -unsigned int -pass_dse::execute (function *fun) -{ - unsigned todo = 0; - need_eh_cleanup = BITMAP_ALLOC (NULL); - need_ab_cleanup = BITMAP_ALLOC (NULL); - auto_sbitmap live_bytes (param_dse_max_object_size); - - renumber_gimple_stmt_uids (fun); - - calculate_dominance_info (CDI_DOMINATORS); - - /* Dead store elimination is fundamentally a reverse program order walk. */ - int *rpo = XNEWVEC (int, n_basic_blocks_for_fn (fun) - NUM_FIXED_BLOCKS); - int n = pre_and_rev_post_order_compute_fn (fun, NULL, rpo, false); - for (int i = n; i != 0; --i) - { - basic_block bb = BASIC_BLOCK_FOR_FN (fun, rpo[i-1]); - gimple_stmt_iterator gsi; - - for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi);) - { - gimple *stmt = gsi_stmt (gsi); - - if (gimple_vdef (stmt)) - dse_optimize_stmt (fun, &gsi, live_bytes); - else if (def_operand_p - def_p = single_ssa_def_operand (stmt, SSA_OP_DEF)) - { - /* When we remove dead stores make sure to also delete trivially - dead SSA defs. */ - if (has_zero_uses (DEF_FROM_PTR (def_p)) - && !gimple_has_side_effects (stmt) - && !is_ctrl_altering_stmt (stmt) - && (!stmt_could_throw_p (fun, stmt) - || fun->can_delete_dead_exceptions)) - { - if (dump_file && (dump_flags & TDF_DETAILS)) - { - fprintf (dump_file, " Deleted trivially dead stmt: "); - print_gimple_stmt (dump_file, stmt, 0, dump_flags); - fprintf (dump_file, "\n"); - } - if (gsi_remove (&gsi, true) && need_eh_cleanup) - bitmap_set_bit (need_eh_cleanup, bb->index); - release_defs (stmt); - } - } - if (gsi_end_p (gsi)) - gsi = gsi_last_bb (bb); - else - gsi_prev (&gsi); - } - bool removed_phi = false; - for (gphi_iterator si = gsi_start_phis (bb); !gsi_end_p (si);) - { - gphi *phi = si.phi (); - if (has_zero_uses (gimple_phi_result (phi))) - { - if (dump_file && (dump_flags & TDF_DETAILS)) - { - fprintf (dump_file, " Deleted trivially dead PHI: "); - print_gimple_stmt (dump_file, phi, 0, dump_flags); - fprintf (dump_file, "\n"); - } - remove_phi_node (&si, true); - removed_phi = true; - } - else - gsi_next (&si); - } - if (removed_phi && gimple_seq_empty_p (phi_nodes (bb))) - todo |= TODO_cleanup_cfg; - } - free (rpo); - - /* Removal of stores may make some EH edges dead. Purge such edges from - the CFG as needed. */ - if (!bitmap_empty_p (need_eh_cleanup)) - { - gimple_purge_all_dead_eh_edges (need_eh_cleanup); - todo |= TODO_cleanup_cfg; - } - if (!bitmap_empty_p (need_ab_cleanup)) - { - gimple_purge_all_dead_abnormal_call_edges (need_ab_cleanup); - todo |= TODO_cleanup_cfg; - } - - BITMAP_FREE (need_eh_cleanup); - BITMAP_FREE (need_ab_cleanup); - - return todo; -} - -} // anon namespace - -gimple_opt_pass * -make_pass_dse (gcc::context *ctxt) -{ - return new pass_dse (ctxt); -} |