mirror of
https://github.com/gcc-mirror/gcc.git
synced 2024-11-21 13:40:47 +00:00
50332a4fdd
I've tried to build stage3 with -Wleading-whitespace=blanks -Wtrailing-whitespace=blank -Wno-error=leading-whitespace=blanks -Wno-error=trailing-whitespace=blank added to STRICT_WARN and that expectably resulted in about 2744 unique trailing whitespace warnings and 124837 leading whitespace warnings when excluding *.md files (which obviously is in big part a generator issue). Others from that are generator related, I think those need to be solved later. The following patch just fixes up the easy case (trailing whitespace), which could be easily automated: for i in `find . -name \*.h -o -name \*.cc -o -name \*.c | xargs grep -l '[ ]$' | grep -v testsuite/`; do sed -i -e 's/[ ]*$//' $i; done I've excluded files which I knew are obviously generated or go FE. Is there anything else we'd want to avoid the changes? Due to patch size, I've split it between gcc/ part (this patch) and rest (include/, libiberty/, libgcc/, libcpp/, libstdc++-v3/). 2024-10-24 Jakub Jelinek <jakub@redhat.com> gcc/ * lra-assigns.cc: Remove trailing whitespace. * symtab.cc: Likewise. * stmt.cc: Likewise. * cgraphbuild.cc: Likewise. * cfgcleanup.cc: Likewise. * loop-init.cc: Likewise. * df-problems.cc: Likewise. * diagnostic-macro-unwinding.cc: Likewise. * langhooks.h: Likewise. * except.cc: Likewise. * tree-vect-loop.cc: Likewise. * coverage.cc: Likewise. * hash-table.cc: Likewise. * ggc-page.cc: Likewise. * gimple-ssa-strength-reduction.cc: Likewise. * tree-parloops.cc: Likewise. * internal-fn.cc: Likewise. * ipa-split.cc: Likewise. * calls.cc: Likewise. * reorg.cc: Likewise. * sbitmap.h: Likewise. * omp-offload.cc: Likewise. * cfgrtl.cc: Likewise. * reginfo.cc: Likewise. * gengtype.h: Likewise. * omp-general.h: Likewise. * ipa-comdats.cc: Likewise. * gimple-range-edge.h: Likewise. * tree-ssa-structalias.cc: Likewise. * target.def: Likewise. * basic-block.h: Likewise. * graphite-isl-ast-to-gimple.cc: Likewise. * auto-profile.cc: Likewise. * optabs.cc: Likewise. * gengtype-lex.l: Likewise. * optabs.def: Likewise. * ira-build.cc: Likewise. * ira.cc: Likewise. * function.h: Likewise. * tree-ssa-propagate.cc: Likewise. * gcov-io.cc: Likewise. * builtin-types.def: Likewise. * ddg.cc: Likewise. * lra-spills.cc: Likewise. * cfg.cc: Likewise. * bitmap.cc: Likewise. * gimple-range-gori.h: Likewise. * tree-ssa-loop-im.cc: Likewise. * cfghooks.h: Likewise. * genmatch.cc: Likewise. * explow.cc: Likewise. * lto-streamer-in.cc: Likewise. * graphite-scop-detection.cc: Likewise. * ipa-prop.cc: Likewise. * gcc.cc: Likewise. * vec.h: Likewise. * cfgexpand.cc: Likewise. * config/alpha/vms.h: Likewise. * config/alpha/alpha.cc: Likewise. * config/alpha/driver-alpha.cc: Likewise. * config/alpha/elf.h: Likewise. * config/iq2000/iq2000.h: Likewise. * config/iq2000/iq2000.cc: Likewise. * config/pa/pa-64.h: Likewise. * config/pa/som.h: Likewise. * config/pa/pa.cc: Likewise. * config/pa/pa.h: Likewise. * config/pa/pa32-regs.h: Likewise. * config/c6x/c6x.cc: Likewise. * config/openbsd-stdint.h: Likewise. * config/elfos.h: Likewise. * config/lm32/lm32.cc: Likewise. * config/lm32/lm32.h: Likewise. * config/lm32/lm32-protos.h: Likewise. * config/darwin-c.cc: Likewise. * config/rx/rx.cc: Likewise. * config/host-darwin.h: Likewise. * config/netbsd.h: Likewise. * config/ia64/ia64.cc: Likewise. * config/ia64/freebsd.h: Likewise. * config/avr/avr-c.cc: Likewise. * config/avr/avr.cc: Likewise. * config/avr/avr-arch.h: Likewise. * config/avr/avr.h: Likewise. * config/avr/stdfix.h: Likewise. * config/avr/gen-avr-mmcu-specs.cc: Likewise. * config/avr/avr-log.cc: Likewise. * config/avr/elf.h: Likewise. * config/avr/gen-avr-mmcu-texi.cc: Likewise. * config/avr/avr-devices.cc: Likewise. * config/nvptx/nvptx.cc: Likewise. * config/vx-common.h: Likewise. * config/sol2.cc: Likewise. * config/rl78/rl78.cc: Likewise. * config/cris/cris.cc: Likewise. * config/arm/symbian.h: Likewise. * config/arm/unknown-elf.h: Likewise. * config/arm/linux-eabi.h: Likewise. * config/arm/arm.cc: Likewise. * config/arm/arm-mve-builtins.h: Likewise. * config/arm/bpabi.h: Likewise. * config/arm/vxworks.h: Likewise. * config/arm/arm.h: Likewise. * config/arm/aout.h: Likewise. * config/arm/elf.h: Likewise. * config/host-linux.cc: Likewise. * config/sh/sh_treg_combine.cc: Likewise. * config/sh/vxworks.h: Likewise. * config/sh/elf.h: Likewise. * config/sh/netbsd-elf.h: Likewise. * config/sh/sh.cc: Likewise. * config/sh/embed-elf.h: Likewise. * config/sh/sh.h: Likewise. * config/darwin-driver.cc: Likewise. * config/m32c/m32c.cc: Likewise. * config/frv/frv.cc: Likewise. * config/openbsd.h: Likewise. * config/aarch64/aarch64-protos.h: Likewise. * config/aarch64/aarch64-builtins.cc: Likewise. * config/aarch64/aarch64-cost-tables.h: Likewise. * config/aarch64/aarch64.cc: Likewise. * config/bfin/bfin.cc: Likewise. * config/bfin/bfin.h: Likewise. * config/bfin/bfin-protos.h: Likewise. * config/i386/gmm_malloc.h: Likewise. * config/i386/djgpp.h: Likewise. * config/i386/sol2.h: Likewise. * config/i386/stringop.def: Likewise. * config/i386/i386-features.cc: Likewise. * config/i386/openbsdelf.h: Likewise. * config/i386/cpuid.h: Likewise. * config/i386/i386.h: Likewise. * config/i386/smmintrin.h: Likewise. * config/i386/avx10_2-512convertintrin.h: Likewise. * config/i386/i386-options.cc: Likewise. * config/i386/i386-opts.h: Likewise. * config/i386/i386-expand.cc: Likewise. * config/i386/avx512dqintrin.h: Likewise. * config/i386/wmmintrin.h: Likewise. * config/i386/gnu-user.h: Likewise. * config/i386/host-mingw32.cc: Likewise. * config/i386/avx10_2bf16intrin.h: Likewise. * config/i386/cygwin.h: Likewise. * config/i386/driver-i386.cc: Likewise. * config/i386/biarch64.h: Likewise. * config/i386/host-cygwin.cc: Likewise. * config/i386/cygming.h: Likewise. * config/i386/i386-builtins.cc: Likewise. * config/i386/avx10_2convertintrin.h: Likewise. * config/i386/i386.cc: Likewise. * config/i386/gas.h: Likewise. * config/i386/freebsd.h: Likewise. * config/mingw/winnt-cxx.cc: Likewise. * config/mingw/winnt.cc: Likewise. * config/h8300/h8300.cc: Likewise. * config/host-solaris.cc: Likewise. * config/m32r/m32r.h: Likewise. * config/m32r/m32r.cc: Likewise. * config/darwin.h: Likewise. * config/sparc/linux64.h: Likewise. * config/sparc/sparc-protos.h: Likewise. * config/sparc/sysv4.h: Likewise. * config/sparc/sparc.h: Likewise. * config/sparc/linux.h: Likewise. * config/sparc/freebsd.h: Likewise. * config/sparc/sparc.cc: Likewise. * config/gcn/gcn-run.cc: Likewise. * config/gcn/gcn.cc: Likewise. * config/gcn/gcn-tree.cc: Likewise. * config/kopensolaris-gnu.h: Likewise. * config/nios2/nios2.h: Likewise. * config/nios2/elf.h: Likewise. * config/nios2/nios2.cc: Likewise. * config/host-netbsd.cc: Likewise. * config/rtems.h: Likewise. * config/pdp11/pdp11.cc: Likewise. * config/pdp11/pdp11.h: Likewise. * config/mn10300/mn10300.cc: Likewise. * config/mn10300/linux.h: Likewise. * config/moxie/moxie.h: Likewise. * config/moxie/moxie.cc: Likewise. * config/rs6000/aix71.h: Likewise. * config/rs6000/vec_types.h: Likewise. * config/rs6000/xcoff.h: Likewise. * config/rs6000/rs6000.cc: Likewise. * config/rs6000/rs6000-internal.h: Likewise. * config/rs6000/rs6000-p8swap.cc: Likewise. * config/rs6000/rs6000-c.cc: Likewise. * config/rs6000/aix.h: Likewise. * config/rs6000/rs6000-logue.cc: Likewise. * config/rs6000/rs6000-string.cc: Likewise. * config/rs6000/rs6000-call.cc: Likewise. * config/rs6000/ppu_intrinsics.h: Likewise. * config/rs6000/altivec.h: Likewise. * config/rs6000/darwin.h: Likewise. * config/rs6000/host-darwin.cc: Likewise. * config/rs6000/freebsd64.h: Likewise. * config/rs6000/spu2vmx.h: Likewise. * config/rs6000/linux.h: Likewise. * config/rs6000/si2vmx.h: Likewise. * config/rs6000/driver-rs6000.cc: Likewise. * config/rs6000/freebsd.h: Likewise. * config/vxworksae.h: Likewise. * config/mips/frame-header-opt.cc: Likewise. * config/mips/mips.h: Likewise. * config/mips/mips.cc: Likewise. * config/mips/sde.h: Likewise. * config/darwin-protos.h: Likewise. * config/mcore/mcore-elf.h: Likewise. * config/mcore/mcore.h: Likewise. * config/mcore/mcore.cc: Likewise. * config/epiphany/epiphany.cc: Likewise. * config/fr30/fr30.h: Likewise. * config/fr30/fr30.cc: Likewise. * config/riscv/riscv-vector-builtins-shapes.cc: Likewise. * config/riscv/riscv-vector-builtins-bases.cc: Likewise. * config/visium/visium.h: Likewise. * config/mmix/mmix.cc: Likewise. * config/v850/v850.cc: Likewise. * config/v850/v850-c.cc: Likewise. * config/v850/v850.h: Likewise. * config/stormy16/stormy16.cc: Likewise. * config/stormy16/stormy16-protos.h: Likewise. * config/stormy16/stormy16.h: Likewise. * config/arc/arc.cc: Likewise. * config/vxworks.cc: Likewise. * config/microblaze/microblaze-c.cc: Likewise. * config/microblaze/microblaze-protos.h: Likewise. * config/microblaze/microblaze.h: Likewise. * config/microblaze/microblaze.cc: Likewise. * config/freebsd-spec.h: Likewise. * config/m68k/m68kelf.h: Likewise. * config/m68k/m68k.cc: Likewise. * config/m68k/netbsd-elf.h: Likewise. * config/m68k/linux.h: Likewise. * config/freebsd.h: Likewise. * config/host-openbsd.cc: Likewise. * regcprop.cc: Likewise. * dumpfile.cc: Likewise. * combine.cc: Likewise. * tree-ssa-forwprop.cc: Likewise. * ipa-profile.cc: Likewise. * hw-doloop.cc: Likewise. * opts.cc: Likewise. * gcc-ar.cc: Likewise. * tree-cfg.cc: Likewise. * incpath.cc: Likewise. * tree-ssa-sccvn.cc: Likewise. * function.cc: Likewise. * genattrtab.cc: Likewise. * rtl.def: Likewise. * genchecksum.cc: Likewise. * profile.cc: Likewise. * df-core.cc: Likewise. * tree-pretty-print.cc: Likewise. * tree.h: Likewise. * plugin.cc: Likewise. * tree-ssa-loop-ch.cc: Likewise. * emit-rtl.cc: Likewise. * haifa-sched.cc: Likewise. * gimple-range-edge.cc: Likewise. * range-op.cc: Likewise. * tree-ssa-ccp.cc: Likewise. * dwarf2cfi.cc: Likewise. * recog.cc: Likewise. * vtable-verify.cc: Likewise. * system.h: Likewise. * regrename.cc: Likewise. * tree-ssa-dom.cc: Likewise. * loop-unroll.cc: Likewise. * lra-constraints.cc: Likewise. * pretty-print.cc: Likewise. * ifcvt.cc: Likewise. * ipa.cc: Likewise. * alloc-pool.h: Likewise. * collect2.cc: Likewise. * pointer-query.cc: Likewise. * cfgloop.cc: Likewise. * toplev.cc: Likewise. * sese.cc: Likewise. * gengtype.cc: Likewise. * gimplify-me.cc: Likewise. * double-int.cc: Likewise. * bb-reorder.cc: Likewise. * dwarf2out.cc: Likewise. * tree-ssa-loop-ivcanon.cc: Likewise. * tree-ssa-reassoc.cc: Likewise. * cgraph.cc: Likewise. * sel-sched.cc: Likewise. * attribs.cc: Likewise. * expr.cc: Likewise. * tree-ssa-scopedtables.h: Likewise. * gimple-range-cache.cc: Likewise. * ipa-pure-const.cc: Likewise. * tree-inline.cc: Likewise. * genhooks.cc: Likewise. * gimple-range-phi.h: Likewise. * shrink-wrap.cc: Likewise. * tree.cc: Likewise. * gimple.cc: Likewise. * backend.h: Likewise. * opts-common.cc: Likewise. * cfg-flags.def: Likewise. * gcse-common.cc: Likewise. * tree-ssa-scopedtables.cc: Likewise. * ccmp.cc: Likewise. * builtins.def: Likewise. * builtin-attrs.def: Likewise. * postreload.cc: Likewise. * sched-deps.cc: Likewise. * ipa-inline-transform.cc: Likewise. * tree-vect-generic.cc: Likewise. * ipa-polymorphic-call.cc: Likewise. * builtins.cc: Likewise. * sel-sched-ir.cc: Likewise. * trans-mem.cc: Likewise. * ipa-visibility.cc: Likewise. * cgraph.h: Likewise. * tree-ssa-phiopt.cc: Likewise. * genopinit.cc: Likewise. * ipa-inline.cc: Likewise. * omp-low.cc: Likewise. * ipa-utils.cc: Likewise. * tree-ssa-math-opts.cc: Likewise. * tree-ssa-ifcombine.cc: Likewise. * gimple-range.cc: Likewise. * ipa-fnsummary.cc: Likewise. * ira-color.cc: Likewise. * value-prof.cc: Likewise. * varasm.cc: Likewise. * ipa-icf.cc: Likewise. * ira-emit.cc: Likewise. * lto-streamer.h: Likewise. * lto-wrapper.cc: Likewise. * regs.h: Likewise. * gengtype-parse.cc: Likewise. * alias.cc: Likewise. * lto-streamer.cc: Likewise. * real.h: Likewise. * wide-int.h: Likewise. * targhooks.cc: Likewise. * gimple-ssa-warn-access.cc: Likewise. * real.cc: Likewise. * ipa-reference.cc: Likewise. * bitmap.h: Likewise. * ginclude/float.h: Likewise. * ginclude/stddef.h: Likewise. * ginclude/stdarg.h: Likewise. * ginclude/stdatomic.h: Likewise. * optabs.h: Likewise. * sel-sched-ir.h: Likewise. * convert.cc: Likewise. * cgraphunit.cc: Likewise. * lra-remat.cc: Likewise. * tree-if-conv.cc: Likewise. * gcov-dump.cc: Likewise. * tree-predcom.cc: Likewise. * dominance.cc: Likewise. * gimple-range-cache.h: Likewise. * ipa-devirt.cc: Likewise. * rtl.h: Likewise. * ubsan.cc: Likewise. * tree-ssa.cc: Likewise. * ssa.h: Likewise. * cse.cc: Likewise. * jump.cc: Likewise. * hwint.h: Likewise. * caller-save.cc: Likewise. * coretypes.h: Likewise. * ipa-fnsummary.h: Likewise. * tree-ssa-strlen.cc: Likewise. * modulo-sched.cc: Likewise. * cgraphclones.cc: Likewise. * lto-cgraph.cc: Likewise. * hw-doloop.h: Likewise. * data-streamer.h: Likewise. * compare-elim.cc: Likewise. * profile-count.h: Likewise. * tree-vect-loop-manip.cc: Likewise. * ree.cc: Likewise. * reload.cc: Likewise. * tree-ssa-loop-split.cc: Likewise. * tree-into-ssa.cc: Likewise. * gcse.cc: Likewise. * cfgloopmanip.cc: Likewise. * df.h: Likewise. * fold-const.cc: Likewise. * wide-int.cc: Likewise. * gengtype-state.cc: Likewise. * sanitizer.def: Likewise. * tree-ssa-sink.cc: Likewise. * target-hooks-macros.h: Likewise. * tree-ssa-pre.cc: Likewise. * gimple-pretty-print.cc: Likewise. * ipa-utils.h: Likewise. * tree-outof-ssa.cc: Likewise. * tree-ssa-coalesce.cc: Likewise. * gimple-match.h: Likewise. * tree-ssa-loop-niter.cc: Likewise. * tree-loop-distribution.cc: Likewise. * tree-emutls.cc: Likewise. * tree-eh.cc: Likewise. * varpool.cc: Likewise. * ssa-iterators.h: Likewise. * asan.cc: Likewise. * reload1.cc: Likewise. * cfgloopanal.cc: Likewise. * tree-vectorizer.cc: Likewise. * simplify-rtx.cc: Likewise. * opts-global.cc: Likewise. * gimple-ssa-store-merging.cc: Likewise. * expmed.cc: Likewise. * tree-ssa-loop-prefetch.cc: Likewise. * tree-ssa-dse.h: Likewise. * tree-vect-stmts.cc: Likewise. * gimple-fold.cc: Likewise. * lra-coalesce.cc: Likewise. * data-streamer-out.cc: Likewise. * diagnostic.cc: Likewise. * tree-ssa-alias.cc: Likewise. * tree-vect-patterns.cc: Likewise. * common/common-target.def: Likewise. * common/config/rx/rx-common.cc: Likewise. * common/config/msp430/msp430-common.cc: Likewise. * common/config/avr/avr-common.cc: Likewise. * common/config/i386/i386-common.cc: Likewise. * common/config/pdp11/pdp11-common.cc: Likewise. * common/config/rs6000/rs6000-common.cc: Likewise. * common/config/mcore/mcore-common.cc: Likewise. * graphite.cc: Likewise. * gimple-low.cc: Likewise. * genmodes.cc: Likewise. * gimple-loop-jam.cc: Likewise. * lto-streamer-out.cc: Likewise. * predict.cc: Likewise. * omp-expand.cc: Likewise. * gimple-array-bounds.cc: Likewise. * predict.def: Likewise. * opts.h: Likewise. * tree-stdarg.cc: Likewise. * gimplify.cc: Likewise. * ira-lives.cc: Likewise. * loop-doloop.cc: Likewise. * lra.cc: Likewise. * gimple-iterator.h: Likewise. * tree-sra.cc: Likewise. gcc/fortran/ * trans-openmp.cc: Remove trailing whitespace. * trans-common.cc: Likewise. * match.h: Likewise. * scanner.cc: Likewise. * gfortranspec.cc: Likewise. * io.cc: Likewise. * iso-c-binding.def: Likewise. * iso-fortran-env.def: Likewise. * types.def: Likewise. * openmp.cc: Likewise. * f95-lang.cc: Likewise. gcc/analyzer/ * state-purge.cc: Remove trailing whitespace. * region-model.h: Likewise. * region-model.cc: Likewise. * program-point.cc: Likewise. * exploded-graph.h: Likewise. * program-state.cc: Likewise. * supergraph.cc: Likewise. gcc/c-family/ * c-ubsan.cc: Remove trailing whitespace. * stub-objc.cc: Likewise. * c-pragma.cc: Likewise. * c-ppoutput.cc: Likewise. * c-indentation.cc: Likewise. * c-ada-spec.cc: Likewise. * c-opts.cc: Likewise. * c-common.cc: Likewise. * c-format.cc: Likewise. * c-omp.cc: Likewise. * c-objc.h: Likewise. * c-cppbuiltin.cc: Likewise. * c-attribs.cc: Likewise. * c-target.def: Likewise. * c-common.h: Likewise. gcc/c/ * c-typeck.cc: Remove trailing whitespace. * gimple-parser.cc: Likewise. * c-parser.cc: Likewise. * c-decl.cc: Likewise. gcc/cp/ * vtable-class-hierarchy.cc: Remove trailing whitespace. * typeck2.cc: Likewise. * decl.cc: Likewise. * init.cc: Likewise. * semantics.cc: Likewise. * module.cc: Likewise. * rtti.cc: Likewise. * cxx-pretty-print.cc: Likewise. * cvt.cc: Likewise. * mangle.cc: Likewise. * name-lookup.h: Likewise. * coroutines.cc: Likewise. * error.cc: Likewise. * lambda.cc: Likewise. * tree.cc: Likewise. * g++spec.cc: Likewise. * decl2.cc: Likewise. * cp-tree.h: Likewise. * parser.cc: Likewise. * pt.cc: Likewise. * call.cc: Likewise. * lex.cc: Likewise. * cp-lang.cc: Likewise. * cp-tree.def: Likewise. * constexpr.cc: Likewise. * typeck.cc: Likewise. * name-lookup.cc: Likewise. * optimize.cc: Likewise. * search.cc: Likewise. * mapper-client.cc: Likewise. * ptree.cc: Likewise. * class.cc: Likewise. gcc/jit/ * docs/examples/tut04-toyvm/toyvm.cc: Remove trailing whitespace. gcc/lto/ * lto-object.cc: Remove trailing whitespace. * lto-symtab.cc: Likewise. * lto-partition.cc: Likewise. * lang-specs.h: Likewise. * lto-lang.cc: Likewise. gcc/objc/ * objc-encoding.cc: Remove trailing whitespace. * objc-map.h: Likewise. * objc-next-runtime-abi-01.cc: Likewise. * objc-act.cc: Likewise. * objc-map.cc: Likewise. gcc/objcp/ * objcp-decl.cc: Remove trailing whitespace. * objcp-lang.cc: Likewise. * objcp-decl.h: Likewise. gcc/rust/ * util/optional.h: Remove trailing whitespace. * util/expected.h: Likewise. * util/rust-unicode-data.h: Likewise. gcc/m2/ * mc-boot/GFpuIO.cc: Remove trailing whitespace. * mc-boot/GFIO.cc: Likewise. * mc-boot/GFormatStrings.cc: Likewise. * mc-boot/GCmdArgs.cc: Likewise. * mc-boot/GDebug.h: Likewise. * mc-boot/GM2Dependent.cc: Likewise. * mc-boot/GRTint.cc: Likewise. * mc-boot/GDebug.cc: Likewise. * mc-boot/GmcError.cc: Likewise. * mc-boot/Gmcp4.cc: Likewise. * mc-boot/GM2RTS.cc: Likewise. * mc-boot/GIO.cc: Likewise. * mc-boot/Gmcp5.cc: Likewise. * mc-boot/GDynamicStrings.cc: Likewise. * mc-boot/Gmcp1.cc: Likewise. * mc-boot/GFormatStrings.h: Likewise. * mc-boot/Gmcp2.cc: Likewise. * mc-boot/Gmcp3.cc: Likewise. * pge-boot/GFIO.cc: Likewise. * pge-boot/GDebug.h: Likewise. * pge-boot/GM2Dependent.cc: Likewise. * pge-boot/GDebug.cc: Likewise. * pge-boot/GM2RTS.cc: Likewise. * pge-boot/GSymbolKey.cc: Likewise. * pge-boot/GIO.cc: Likewise. * pge-boot/GIndexing.cc: Likewise. * pge-boot/GDynamicStrings.cc: Likewise. * pge-boot/GFormatStrings.h: Likewise. gcc/go/ * go-gcc.cc: Remove trailing whitespace. * gospec.cc: Likewise.
643 lines
18 KiB
C++
643 lines
18 KiB
C++
/* Define control flow data structures for the CFG.
|
||
Copyright (C) 1987-2024 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/>. */
|
||
|
||
#ifndef GCC_BASIC_BLOCK_H
|
||
#define GCC_BASIC_BLOCK_H
|
||
|
||
#include <profile-count.h>
|
||
|
||
/* Control flow edge information. */
|
||
class GTY((user)) edge_def {
|
||
public:
|
||
/* The two blocks at the ends of the edge. */
|
||
basic_block src;
|
||
basic_block dest;
|
||
|
||
/* Instructions queued on the edge. */
|
||
union edge_def_insns {
|
||
gimple_seq g;
|
||
rtx_insn *r;
|
||
} insns;
|
||
|
||
/* Auxiliary info specific to a pass. */
|
||
void *aux;
|
||
|
||
/* Location of any goto implicit in the edge. */
|
||
location_t goto_locus;
|
||
|
||
/* The index number corresponding to this edge in the edge vector
|
||
dest->preds. */
|
||
unsigned int dest_idx;
|
||
|
||
int flags; /* see cfg-flags.def */
|
||
profile_probability probability;
|
||
|
||
/* Return count of edge E. */
|
||
inline profile_count count () const;
|
||
};
|
||
|
||
/* Masks for edge.flags. */
|
||
#define DEF_EDGE_FLAG(NAME,IDX) EDGE_##NAME = 1 << IDX ,
|
||
enum cfg_edge_flags {
|
||
#include "cfg-flags.def"
|
||
LAST_CFG_EDGE_FLAG /* this is only used for EDGE_ALL_FLAGS */
|
||
};
|
||
#undef DEF_EDGE_FLAG
|
||
|
||
/* Bit mask for all edge flags. */
|
||
#define EDGE_ALL_FLAGS ((LAST_CFG_EDGE_FLAG - 1) * 2 - 1)
|
||
|
||
/* The following four flags all indicate something special about an edge.
|
||
Test the edge flags on EDGE_COMPLEX to detect all forms of "strange"
|
||
control flow transfers. */
|
||
#define EDGE_COMPLEX \
|
||
(EDGE_ABNORMAL | EDGE_ABNORMAL_CALL | EDGE_EH | EDGE_PRESERVE)
|
||
|
||
struct GTY(()) rtl_bb_info {
|
||
/* The first insn of the block is embedded into bb->il.x. */
|
||
/* The last insn of the block. */
|
||
rtx_insn *end_;
|
||
|
||
/* In CFGlayout mode points to insn notes/jumptables to be placed just before
|
||
and after the block. */
|
||
rtx_insn *header_;
|
||
rtx_insn *footer_;
|
||
};
|
||
|
||
struct GTY(()) gimple_bb_info {
|
||
/* Sequence of statements in this block. */
|
||
gimple_seq seq;
|
||
|
||
/* PHI nodes for this block. */
|
||
gimple_seq phi_nodes;
|
||
};
|
||
|
||
/* A basic block is a sequence of instructions with only one entry and
|
||
only one exit. If any one of the instructions are executed, they
|
||
will all be executed, and in sequence from first to last.
|
||
|
||
There may be COND_EXEC instructions in the basic block. The
|
||
COND_EXEC *instructions* will be executed -- but if the condition
|
||
is false the conditionally executed *expressions* will of course
|
||
not be executed. We don't consider the conditionally executed
|
||
expression (which might have side-effects) to be in a separate
|
||
basic block because the program counter will always be at the same
|
||
location after the COND_EXEC instruction, regardless of whether the
|
||
condition is true or not.
|
||
|
||
Basic blocks need not start with a label nor end with a jump insn.
|
||
For example, a previous basic block may just "conditionally fall"
|
||
into the succeeding basic block, and the last basic block need not
|
||
end with a jump insn. Block 0 is a descendant of the entry block.
|
||
|
||
A basic block beginning with two labels cannot have notes between
|
||
the labels.
|
||
|
||
Data for jump tables are stored in jump_insns that occur in no
|
||
basic block even though these insns can follow or precede insns in
|
||
basic blocks. */
|
||
|
||
/* Basic block information indexed by block number. */
|
||
struct GTY((chain_next ("%h.next_bb"), chain_prev ("%h.prev_bb"))) basic_block_def {
|
||
/* The edges into and out of the block. */
|
||
vec<edge, va_gc> *preds;
|
||
vec<edge, va_gc> *succs;
|
||
|
||
/* Auxiliary info specific to a pass. */
|
||
void *GTY ((skip (""))) aux;
|
||
|
||
/* Innermost loop containing the block. */
|
||
class loop *loop_father;
|
||
|
||
/* The dominance and postdominance information node. */
|
||
struct et_node * GTY ((skip (""))) dom[2];
|
||
|
||
/* Previous and next blocks in the chain. */
|
||
basic_block prev_bb;
|
||
basic_block next_bb;
|
||
|
||
union basic_block_il_dependent {
|
||
struct gimple_bb_info GTY ((tag ("0"))) gimple;
|
||
struct {
|
||
rtx_insn *head_;
|
||
struct rtl_bb_info * rtl;
|
||
} GTY ((tag ("1"))) x;
|
||
} GTY ((desc ("((%1.flags & BB_RTL) != 0)"))) il;
|
||
|
||
/* Various flags. See cfg-flags.def. */
|
||
int flags;
|
||
|
||
/* The index of this block. */
|
||
int index;
|
||
|
||
/* Expected number of executions: calculated in profile.cc. */
|
||
profile_count count;
|
||
};
|
||
|
||
/* This ensures that struct gimple_bb_info is smaller than
|
||
struct rtl_bb_info, so that inlining the former into basic_block_def
|
||
is the better choice. */
|
||
STATIC_ASSERT (sizeof (rtl_bb_info) >= sizeof (gimple_bb_info));
|
||
|
||
#define BB_FREQ_MAX 10000
|
||
|
||
/* Masks for basic_block.flags. */
|
||
#define DEF_BASIC_BLOCK_FLAG(NAME,IDX) BB_##NAME = 1 << IDX ,
|
||
enum cfg_bb_flags
|
||
{
|
||
#include "cfg-flags.def"
|
||
LAST_CFG_BB_FLAG /* this is only used for BB_ALL_FLAGS */
|
||
};
|
||
#undef DEF_BASIC_BLOCK_FLAG
|
||
|
||
/* Bit mask for all basic block flags. */
|
||
#define BB_ALL_FLAGS ((LAST_CFG_BB_FLAG - 1) * 2 - 1)
|
||
|
||
/* Bit mask for all basic block flags that must be preserved. These are
|
||
the bit masks that are *not* cleared by clear_bb_flags. */
|
||
#define BB_FLAGS_TO_PRESERVE \
|
||
(BB_DISABLE_SCHEDULE | BB_RTL | BB_NON_LOCAL_GOTO_TARGET \
|
||
| BB_HOT_PARTITION | BB_COLD_PARTITION)
|
||
|
||
/* Dummy bitmask for convenience in the hot/cold partitioning code. */
|
||
#define BB_UNPARTITIONED 0
|
||
|
||
/* Partitions, to be used when partitioning hot and cold basic blocks into
|
||
separate sections. */
|
||
#define BB_PARTITION(bb) ((bb)->flags & (BB_HOT_PARTITION|BB_COLD_PARTITION))
|
||
#define BB_SET_PARTITION(bb, part) do { \
|
||
basic_block bb_ = (bb); \
|
||
bb_->flags = ((bb_->flags & ~(BB_HOT_PARTITION|BB_COLD_PARTITION)) \
|
||
| (part)); \
|
||
} while (0)
|
||
|
||
#define BB_COPY_PARTITION(dstbb, srcbb) \
|
||
BB_SET_PARTITION (dstbb, BB_PARTITION (srcbb))
|
||
|
||
/* Defines for accessing the fields of the CFG structure for function FN. */
|
||
#define ENTRY_BLOCK_PTR_FOR_FN(FN) ((FN)->cfg->x_entry_block_ptr)
|
||
#define EXIT_BLOCK_PTR_FOR_FN(FN) ((FN)->cfg->x_exit_block_ptr)
|
||
#define basic_block_info_for_fn(FN) ((FN)->cfg->x_basic_block_info)
|
||
#define n_basic_blocks_for_fn(FN) ((FN)->cfg->x_n_basic_blocks)
|
||
#define n_edges_for_fn(FN) ((FN)->cfg->x_n_edges)
|
||
#define last_basic_block_for_fn(FN) ((FN)->cfg->x_last_basic_block)
|
||
#define label_to_block_map_for_fn(FN) ((FN)->cfg->x_label_to_block_map)
|
||
#define profile_status_for_fn(FN) ((FN)->cfg->x_profile_status)
|
||
|
||
#define BASIC_BLOCK_FOR_FN(FN,N) \
|
||
((*basic_block_info_for_fn (FN))[(N)])
|
||
#define SET_BASIC_BLOCK_FOR_FN(FN,N,BB) \
|
||
((*basic_block_info_for_fn (FN))[(N)] = (BB))
|
||
|
||
/* For iterating over basic blocks. */
|
||
#define FOR_BB_BETWEEN(BB, FROM, TO, DIR) \
|
||
for (BB = FROM; BB != TO; BB = BB->DIR)
|
||
|
||
#define FOR_EACH_BB_FN(BB, FN) \
|
||
FOR_BB_BETWEEN (BB, (FN)->cfg->x_entry_block_ptr->next_bb, (FN)->cfg->x_exit_block_ptr, next_bb)
|
||
|
||
#define FOR_EACH_BB_REVERSE_FN(BB, FN) \
|
||
FOR_BB_BETWEEN (BB, (FN)->cfg->x_exit_block_ptr->prev_bb, (FN)->cfg->x_entry_block_ptr, prev_bb)
|
||
|
||
/* For iterating over insns in basic block. */
|
||
#define FOR_BB_INSNS(BB, INSN) \
|
||
for ((INSN) = BB_HEAD (BB); \
|
||
(INSN) && (INSN) != NEXT_INSN (BB_END (BB)); \
|
||
(INSN) = NEXT_INSN (INSN))
|
||
|
||
/* For iterating over insns in basic block when we might remove the
|
||
current insn. */
|
||
#define FOR_BB_INSNS_SAFE(BB, INSN, CURR) \
|
||
for ((INSN) = BB_HEAD (BB), (CURR) = (INSN) ? NEXT_INSN ((INSN)) : NULL; \
|
||
(INSN) && (INSN) != NEXT_INSN (BB_END (BB)); \
|
||
(INSN) = (CURR), (CURR) = (INSN) ? NEXT_INSN ((INSN)) : NULL)
|
||
|
||
#define FOR_BB_INSNS_REVERSE(BB, INSN) \
|
||
for ((INSN) = BB_END (BB); \
|
||
(INSN) && (INSN) != PREV_INSN (BB_HEAD (BB)); \
|
||
(INSN) = PREV_INSN (INSN))
|
||
|
||
#define FOR_BB_INSNS_REVERSE_SAFE(BB, INSN, CURR) \
|
||
for ((INSN) = BB_END (BB),(CURR) = (INSN) ? PREV_INSN ((INSN)) : NULL; \
|
||
(INSN) && (INSN) != PREV_INSN (BB_HEAD (BB)); \
|
||
(INSN) = (CURR), (CURR) = (INSN) ? PREV_INSN ((INSN)) : NULL)
|
||
|
||
/* Cycles through _all_ basic blocks, even the fake ones (entry and
|
||
exit block). */
|
||
|
||
#define FOR_ALL_BB_FN(BB, FN) \
|
||
for (BB = ENTRY_BLOCK_PTR_FOR_FN (FN); BB; BB = BB->next_bb)
|
||
|
||
|
||
/* Stuff for recording basic block info. */
|
||
|
||
/* For now, these will be functions (so that they can include checked casts
|
||
to rtx_insn. Once the underlying fields are converted from rtx
|
||
to rtx_insn, these can be converted back to macros. */
|
||
|
||
#define BB_HEAD(B) (B)->il.x.head_
|
||
#define BB_END(B) (B)->il.x.rtl->end_
|
||
#define BB_HEADER(B) (B)->il.x.rtl->header_
|
||
#define BB_FOOTER(B) (B)->il.x.rtl->footer_
|
||
|
||
/* Special block numbers [markers] for entry and exit.
|
||
Neither of them is supposed to hold actual statements. */
|
||
#define ENTRY_BLOCK (0)
|
||
#define EXIT_BLOCK (1)
|
||
|
||
/* The two blocks that are always in the cfg. */
|
||
#define NUM_FIXED_BLOCKS (2)
|
||
|
||
/* This is the value which indicates no edge is present. */
|
||
#define EDGE_INDEX_NO_EDGE -1
|
||
|
||
/* EDGE_INDEX returns an integer index for an edge, or EDGE_INDEX_NO_EDGE
|
||
if there is no edge between the 2 basic blocks. */
|
||
#define EDGE_INDEX(el, pred, succ) (find_edge_index ((el), (pred), (succ)))
|
||
|
||
/* INDEX_EDGE_PRED_BB and INDEX_EDGE_SUCC_BB return a pointer to the basic
|
||
block which is either the pred or succ end of the indexed edge. */
|
||
#define INDEX_EDGE_PRED_BB(el, index) ((el)->index_to_edge[(index)]->src)
|
||
#define INDEX_EDGE_SUCC_BB(el, index) ((el)->index_to_edge[(index)]->dest)
|
||
|
||
/* INDEX_EDGE returns a pointer to the edge. */
|
||
#define INDEX_EDGE(el, index) ((el)->index_to_edge[(index)])
|
||
|
||
/* Number of edges in the compressed edge list. */
|
||
#define NUM_EDGES(el) ((el)->num_edges)
|
||
|
||
/* BB is assumed to contain conditional jump. Return the fallthru edge. */
|
||
#define FALLTHRU_EDGE(bb) (EDGE_SUCC ((bb), 0)->flags & EDGE_FALLTHRU \
|
||
? EDGE_SUCC ((bb), 0) : EDGE_SUCC ((bb), 1))
|
||
|
||
/* BB is assumed to contain conditional jump. Return the branch edge. */
|
||
#define BRANCH_EDGE(bb) (EDGE_SUCC ((bb), 0)->flags & EDGE_FALLTHRU \
|
||
? EDGE_SUCC ((bb), 1) : EDGE_SUCC ((bb), 0))
|
||
|
||
/* Return expected execution frequency of the edge E. */
|
||
#define EDGE_FREQUENCY(e) e->count ().to_frequency (cfun)
|
||
|
||
/* Compute a scale factor (or probability) suitable for scaling of
|
||
gcov_type values via apply_probability() and apply_scale(). */
|
||
#define GCOV_COMPUTE_SCALE(num,den) \
|
||
((den) ? RDIV ((num) * REG_BR_PROB_BASE, (den)) : REG_BR_PROB_BASE)
|
||
|
||
/* Return nonzero if edge is critical. */
|
||
#define EDGE_CRITICAL_P(e) (EDGE_COUNT ((e)->src->succs) >= 2 \
|
||
&& EDGE_COUNT ((e)->dest->preds) >= 2)
|
||
|
||
#define EDGE_COUNT(ev) vec_safe_length (ev)
|
||
#define EDGE_I(ev,i) (*ev)[(i)]
|
||
#define EDGE_PRED(bb,i) (*(bb)->preds)[(i)]
|
||
#define EDGE_SUCC(bb,i) (*(bb)->succs)[(i)]
|
||
|
||
/* Returns true if BB has precisely one successor. */
|
||
|
||
inline bool
|
||
single_succ_p (const_basic_block bb)
|
||
{
|
||
return EDGE_COUNT (bb->succs) == 1;
|
||
}
|
||
|
||
/* Returns true if BB has precisely one predecessor. */
|
||
|
||
inline bool
|
||
single_pred_p (const_basic_block bb)
|
||
{
|
||
return EDGE_COUNT (bb->preds) == 1;
|
||
}
|
||
|
||
/* Returns the single successor edge of basic block BB. Aborts if
|
||
BB does not have exactly one successor. */
|
||
|
||
inline edge
|
||
single_succ_edge (const_basic_block bb)
|
||
{
|
||
gcc_checking_assert (single_succ_p (bb));
|
||
return EDGE_SUCC (bb, 0);
|
||
}
|
||
|
||
/* Returns the single predecessor edge of basic block BB. Aborts
|
||
if BB does not have exactly one predecessor. */
|
||
|
||
inline edge
|
||
single_pred_edge (const_basic_block bb)
|
||
{
|
||
gcc_checking_assert (single_pred_p (bb));
|
||
return EDGE_PRED (bb, 0);
|
||
}
|
||
|
||
/* Returns the single successor block of basic block BB. Aborts
|
||
if BB does not have exactly one successor. */
|
||
|
||
inline basic_block
|
||
single_succ (const_basic_block bb)
|
||
{
|
||
return single_succ_edge (bb)->dest;
|
||
}
|
||
|
||
/* Returns the single predecessor block of basic block BB. Aborts
|
||
if BB does not have exactly one predecessor.*/
|
||
|
||
inline basic_block
|
||
single_pred (const_basic_block bb)
|
||
{
|
||
return single_pred_edge (bb)->src;
|
||
}
|
||
|
||
/* Iterator object for edges. */
|
||
|
||
struct edge_iterator {
|
||
unsigned index;
|
||
vec<edge, va_gc> **container;
|
||
};
|
||
|
||
inline vec<edge, va_gc> *
|
||
ei_container (edge_iterator i)
|
||
{
|
||
gcc_checking_assert (i.container);
|
||
return *i.container;
|
||
}
|
||
|
||
#define ei_start(iter) ei_start_1 (&(iter))
|
||
#define ei_last(iter) ei_last_1 (&(iter))
|
||
|
||
/* Return an iterator pointing to the start of an edge vector. */
|
||
inline edge_iterator
|
||
ei_start_1 (vec<edge, va_gc> **ev)
|
||
{
|
||
edge_iterator i;
|
||
|
||
i.index = 0;
|
||
i.container = ev;
|
||
|
||
return i;
|
||
}
|
||
|
||
/* Return an iterator pointing to the last element of an edge
|
||
vector. */
|
||
inline edge_iterator
|
||
ei_last_1 (vec<edge, va_gc> **ev)
|
||
{
|
||
edge_iterator i;
|
||
|
||
i.index = EDGE_COUNT (*ev) - 1;
|
||
i.container = ev;
|
||
|
||
return i;
|
||
}
|
||
|
||
/* Is the iterator `i' at the end of the sequence? */
|
||
inline bool
|
||
ei_end_p (edge_iterator i)
|
||
{
|
||
return (i.index == EDGE_COUNT (ei_container (i)));
|
||
}
|
||
|
||
/* Is the iterator `i' at one position before the end of the
|
||
sequence? */
|
||
inline bool
|
||
ei_one_before_end_p (edge_iterator i)
|
||
{
|
||
return (i.index + 1 == EDGE_COUNT (ei_container (i)));
|
||
}
|
||
|
||
/* Advance the iterator to the next element. */
|
||
inline void
|
||
ei_next (edge_iterator *i)
|
||
{
|
||
gcc_checking_assert (i->index < EDGE_COUNT (ei_container (*i)));
|
||
i->index++;
|
||
}
|
||
|
||
/* Move the iterator to the previous element. */
|
||
inline void
|
||
ei_prev (edge_iterator *i)
|
||
{
|
||
gcc_checking_assert (i->index > 0);
|
||
i->index--;
|
||
}
|
||
|
||
/* Return the edge pointed to by the iterator `i'. */
|
||
inline edge
|
||
ei_edge (edge_iterator i)
|
||
{
|
||
return EDGE_I (ei_container (i), i.index);
|
||
}
|
||
|
||
/* Return an edge pointed to by the iterator. Do it safely so that
|
||
NULL is returned when the iterator is pointing at the end of the
|
||
sequence. */
|
||
inline edge
|
||
ei_safe_edge (edge_iterator i)
|
||
{
|
||
return !ei_end_p (i) ? ei_edge (i) : NULL;
|
||
}
|
||
|
||
/* Return 1 if we should continue to iterate. Return 0 otherwise.
|
||
*Edge P is set to the next edge if we are to continue to iterate
|
||
and NULL otherwise. */
|
||
|
||
inline bool
|
||
ei_cond (edge_iterator ei, edge *p)
|
||
{
|
||
if (!ei_end_p (ei))
|
||
{
|
||
*p = ei_edge (ei);
|
||
return 1;
|
||
}
|
||
else
|
||
{
|
||
*p = NULL;
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
/* This macro serves as a convenient way to iterate each edge in a
|
||
vector of predecessor or successor edges. It must not be used when
|
||
an element might be removed during the traversal, otherwise
|
||
elements will be missed. Instead, use a for-loop like that shown
|
||
in the following pseudo-code:
|
||
|
||
FOR (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
|
||
{
|
||
IF (e != taken_edge)
|
||
remove_edge (e);
|
||
ELSE
|
||
ei_next (&ei);
|
||
}
|
||
*/
|
||
|
||
#define FOR_EACH_EDGE(EDGE,ITER,EDGE_VEC) \
|
||
for ((ITER) = ei_start ((EDGE_VEC)); \
|
||
ei_cond ((ITER), &(EDGE)); \
|
||
ei_next (&(ITER)))
|
||
|
||
#define CLEANUP_EXPENSIVE 1 /* Do relatively expensive optimizations
|
||
except for edge forwarding */
|
||
#define CLEANUP_CROSSJUMP 2 /* Do crossjumping. */
|
||
#define CLEANUP_POST_REGSTACK 4 /* We run after reg-stack and need
|
||
to care REG_DEAD notes. */
|
||
#define CLEANUP_THREADING 8 /* Do jump threading. */
|
||
#define CLEANUP_NO_INSN_DEL 16 /* Do not try to delete trivially dead
|
||
insns. */
|
||
#define CLEANUP_CFGLAYOUT 32 /* Do cleanup in cfglayout mode. */
|
||
#define CLEANUP_CFG_CHANGED 64 /* The caller changed the CFG. */
|
||
#define CLEANUP_NO_PARTITIONING 128 /* Do not try to fix partitions. */
|
||
#define CLEANUP_FORCE_FAST_DCE 0x100 /* Force run_fast_dce to be called
|
||
at least once. */
|
||
|
||
/* Return true if BB is in a transaction. */
|
||
|
||
inline bool
|
||
bb_in_transaction (basic_block bb)
|
||
{
|
||
return bb->flags & BB_IN_TRANSACTION;
|
||
}
|
||
|
||
/* Return true when one of the predecessor edges of BB is marked with EDGE_EH. */
|
||
inline bool
|
||
bb_has_eh_pred (basic_block bb)
|
||
{
|
||
edge e;
|
||
edge_iterator ei;
|
||
|
||
FOR_EACH_EDGE (e, ei, bb->preds)
|
||
{
|
||
if (e->flags & EDGE_EH)
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/* Return true when one of the predecessor edges of BB is marked with EDGE_ABNORMAL. */
|
||
inline bool
|
||
bb_has_abnormal_pred (basic_block bb)
|
||
{
|
||
edge e;
|
||
edge_iterator ei;
|
||
|
||
FOR_EACH_EDGE (e, ei, bb->preds)
|
||
{
|
||
if (e->flags & EDGE_ABNORMAL)
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/* Return the fallthru edge in EDGES if it exists, NULL otherwise. */
|
||
inline edge
|
||
find_fallthru_edge (vec<edge, va_gc> *edges)
|
||
{
|
||
edge e;
|
||
edge_iterator ei;
|
||
|
||
FOR_EACH_EDGE (e, ei, edges)
|
||
if (e->flags & EDGE_FALLTHRU)
|
||
break;
|
||
|
||
return e;
|
||
}
|
||
|
||
/* Check tha probability is sane. */
|
||
|
||
inline void
|
||
check_probability (int prob)
|
||
{
|
||
gcc_checking_assert (prob >= 0 && prob <= REG_BR_PROB_BASE);
|
||
}
|
||
|
||
/* Given PROB1 and PROB2, return PROB1*PROB2/REG_BR_PROB_BASE.
|
||
Used to combine BB probabilities. */
|
||
|
||
inline int
|
||
combine_probabilities (int prob1, int prob2)
|
||
{
|
||
check_probability (prob1);
|
||
check_probability (prob2);
|
||
return RDIV (prob1 * prob2, REG_BR_PROB_BASE);
|
||
}
|
||
|
||
/* Apply scale factor SCALE on frequency or count FREQ. Use this
|
||
interface when potentially scaling up, so that SCALE is not
|
||
constrained to be < REG_BR_PROB_BASE. */
|
||
|
||
inline gcov_type
|
||
apply_scale (gcov_type freq, gcov_type scale)
|
||
{
|
||
return RDIV (freq * scale, REG_BR_PROB_BASE);
|
||
}
|
||
|
||
/* Apply probability PROB on frequency or count FREQ. */
|
||
|
||
inline gcov_type
|
||
apply_probability (gcov_type freq, int prob)
|
||
{
|
||
check_probability (prob);
|
||
return apply_scale (freq, prob);
|
||
}
|
||
|
||
/* Return inverse probability for PROB. */
|
||
|
||
inline int
|
||
inverse_probability (int prob1)
|
||
{
|
||
check_probability (prob1);
|
||
return REG_BR_PROB_BASE - prob1;
|
||
}
|
||
|
||
/* Return true if BB has at least one abnormal outgoing edge. */
|
||
|
||
inline bool
|
||
has_abnormal_or_eh_outgoing_edge_p (basic_block bb)
|
||
{
|
||
edge e;
|
||
edge_iterator ei;
|
||
|
||
FOR_EACH_EDGE (e, ei, bb->succs)
|
||
if (e->flags & (EDGE_ABNORMAL | EDGE_EH))
|
||
return true;
|
||
|
||
return false;
|
||
}
|
||
|
||
/* Return true when one of the predecessor edges of BB is marked with
|
||
EDGE_ABNORMAL_CALL or EDGE_EH. */
|
||
|
||
inline bool
|
||
has_abnormal_call_or_eh_pred_edge_p (basic_block bb)
|
||
{
|
||
edge e;
|
||
edge_iterator ei;
|
||
|
||
FOR_EACH_EDGE (e, ei, bb->preds)
|
||
if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
|
||
return true;
|
||
|
||
return false;
|
||
}
|
||
|
||
/* Return count of edge E. */
|
||
inline profile_count edge_def::count () const
|
||
{
|
||
return src->count.apply_probability (probability);
|
||
}
|
||
|
||
#endif /* GCC_BASIC_BLOCK_H */
|