[COMMITTED] Remove some deprecated irange methods.

2022-07-03 Thread Aldy Hernandez via Gcc-patches
Tested on x86-64 Linux.

gcc/ChangeLog:

* ipa-cp.cc (ipcp_vr_lattice::meet_with_1): Use operator!=.
* ipa-prop.cc (struct ipa_vr_ggc_hash_traits): Same.
* tree-ssa-loop-unswitch.cc (struct unswitch_predicate): Use set
with two arguments.
(find_unswitching_predicates_for_bb): Same.
* tree-vrp.cc (range_fold_unary_symbolics_p): Same.
* value-range-equiv.cc (value_range_equiv::equal_p): Use operator==.
* value-range.cc (irange::equal_p): Rename to...
(irange::operator==): ...this.
* value-range.h (irange::set): Remove.
(irange::operator==): Remove.
(irange::set_zero): Use set with two arguments.
* vr-values.cc (vr_values::extract_range_from_binary_expr): Same.
(vr_values::extract_range_from_unary_expr): Same.
(check_for_binary_op_overflow): Same.
(bounds_of_var_in_loop): Same.
---
 gcc/ipa-cp.cc |  2 +-
 gcc/ipa-prop.cc   |  2 +-
 gcc/tree-ssa-loop-unswitch.cc |  4 ++--
 gcc/tree-vrp.cc   |  3 ++-
 gcc/value-range-equiv.cc  |  2 +-
 gcc/value-range.cc|  2 +-
 gcc/value-range.h | 16 +---
 gcc/vr-values.cc  | 20 ++--
 8 files changed, 19 insertions(+), 32 deletions(-)

diff --git a/gcc/ipa-cp.cc b/gcc/ipa-cp.cc
index 18d2559e5a3..543a9334e2c 100644
--- a/gcc/ipa-cp.cc
+++ b/gcc/ipa-cp.cc
@@ -1020,7 +1020,7 @@ ipcp_vr_lattice::meet_with_1 (const value_range *other_vr)
 
   value_range save (m_vr);
   m_vr.union_ (*other_vr);
-  return !m_vr.equal_p (save);
+  return m_vr != save;
 }
 
 /* Return true if value range information in the lattice is yet unknown.  */
diff --git a/gcc/ipa-prop.cc b/gcc/ipa-prop.cc
index 77915632fa8..fb8f97397dc 100644
--- a/gcc/ipa-prop.cc
+++ b/gcc/ipa-prop.cc
@@ -126,7 +126,7 @@ struct ipa_vr_ggc_hash_traits : public ggc_cache_remove 

   static bool
   equal (const value_range *a, const value_range *b)
 {
-  return (a->equal_p (*b)
+  return (*a == *b
  && types_compatible_p (a->type (), b->type ()));
 }
   static const bool empty_zero_p = true;
diff --git a/gcc/tree-ssa-loop-unswitch.cc b/gcc/tree-ssa-loop-unswitch.cc
index afae9825eda..3a827f2f904 100644
--- a/gcc/tree-ssa-loop-unswitch.cc
+++ b/gcc/tree-ssa-loop-unswitch.cc
@@ -139,7 +139,7 @@ struct unswitch_predicate
auto range_op = range_op_handler (code, TREE_TYPE (lhs));
int_range<2> rhs_range (TREE_TYPE (rhs));
if (CONSTANT_CLASS_P (rhs))
- rhs_range.set (rhs);
+ rhs_range.set (rhs, rhs);
if (!range_op.op1_range (true_range, TREE_TYPE (lhs),
 int_range<2> (boolean_true_node,
   boolean_true_node), rhs_range)
@@ -535,7 +535,7 @@ find_unswitching_predicates_for_bb (basic_block bb, class 
loop *loop,
  else
{
  cmp = fold_build2 (EQ_EXPR, boolean_type_node, idx, low);
- lab_range.set (low);
+ lab_range.set (low, low);
}
 
  /* Combine the expression with the existing one.  */
diff --git a/gcc/tree-vrp.cc b/gcc/tree-vrp.cc
index 2d15bb5a650..ed881be7e5f 100644
--- a/gcc/tree-vrp.cc
+++ b/gcc/tree-vrp.cc
@@ -1024,7 +1024,8 @@ range_fold_unary_symbolics_p (value_range *vr,
{
  /* ~X is simply -1 - X.  */
  value_range minusone;
- minusone.set (build_int_cst (vr0->type (), -1));
+ tree t = build_int_cst (vr0->type (), -1);
+ minusone.set (t, t);
  range_fold_binary_expr (vr, MINUS_EXPR, expr_type, , vr0);
  return true;
}
diff --git a/gcc/value-range-equiv.cc b/gcc/value-range-equiv.cc
index b0ae1288a09..bd58e5a90bc 100644
--- a/gcc/value-range-equiv.cc
+++ b/gcc/value-range-equiv.cc
@@ -162,7 +162,7 @@ bool
 value_range_equiv::equal_p (const value_range_equiv ,
bool ignore_equivs) const
 {
-  return (value_range::equal_p (other)
+  return (value_range::operator== (other)
  && (ignore_equivs || vr_bitmap_equal_p (m_equiv, other.m_equiv)));
 }
 
diff --git a/gcc/value-range.cc b/gcc/value-range.cc
index 815cb783abc..574c51002b5 100644
--- a/gcc/value-range.cc
+++ b/gcc/value-range.cc
@@ -688,7 +688,7 @@ irange::legacy_equal_p (const irange ) const
 }
 
 bool
-irange::equal_p (const irange ) const
+irange::operator== (const irange ) const
 {
   if (legacy_mode_p ())
 {
diff --git a/gcc/value-range.h b/gcc/value-range.h
index 8ee7793baeb..fd6703138ac 100644
--- a/gcc/value-range.h
+++ b/gcc/value-range.h
@@ -157,8 +157,6 @@ public:
   void normalize_symbolics (); // DEPRECATED
   void normalize_addresses (); // DEPRECATED
   bool may_contain_p (tree) const; // DEPRECATED
-  void set (tree); // DEPRECATED
-  bool equal_p (const irange &) const; // DEPRECATED
   bool legacy_verbose_union_ 

RE: [PATCH] i386: Extend cvtps2pd to memory

2022-07-03 Thread Jiang, Haochen via Gcc-patches
Hi all,

I revised my patch according to all your reviews.

Regtested on x86_64-pc-linux-gnu.

BRs,
Haochen

> -Original Message-
> From: Liu, Hongtao 
> Sent: Thursday, June 30, 2022 4:57 PM
> To: Uros Bizjak ; Jiang, Haochen
> 
> Cc: gcc-patches@gcc.gnu.org
> Subject: RE: [PATCH] i386: Extend cvtps2pd to memory
> 
> 
> 
> > -Original Message-
> > From: Uros Bizjak 
> > Sent: Thursday, June 30, 2022 4:53 PM
> > To: Jiang, Haochen 
> > Cc: gcc-patches@gcc.gnu.org; Liu, Hongtao 
> > Subject: Re: [PATCH] i386: Extend cvtps2pd to memory
> >
> > On Thu, Jun 30, 2022 at 10:45 AM Uros Bizjak  wrote:
> > >
> > > On Thu, Jun 30, 2022 at 9:41 AM Uros Bizjak  wrote:
> > > >
> > > > On Thu, Jun 30, 2022 at 9:24 AM Jiang, Haochen
> 
> > wrote:
> > > > >
> > > > > > -Original Message-
> > > > > > From: Uros Bizjak 
> > > > > > Sent: Thursday, June 30, 2022 2:20 PM
> > > > > > To: Jiang, Haochen 
> > > > > > Cc: gcc-patches@gcc.gnu.org; Liu, Hongtao
> > > > > > 
> > > > > > Subject: Re: [PATCH] i386: Extend cvtps2pd to memory
> > > > > >
> > > > > > On Thu, Jun 30, 2022 at 7:59 AM Haochen Jiang
> > > > > > 
> > > > > > wrote:
> > > > > > >
> > > > > > > Hi all,
> > > > > > >
> > > > > > > This patch aims to fix the cvtps2pd insn, which should also
> > > > > > > work on memory operand but currently does not. After this fix,
> > > > > > > when loop == 2, it will eliminate movq instruction.
> > > > > > >
> > > > > > > Regtested on x86_64-pc-linux-gnu. Ok for trunk?
> > > > > > >
> > > > > > > BRs,
> > > > > > > Haochen
> > > > > > >
> > > > > > > gcc/ChangeLog:
> > > > > > >
> > > > > > > PR target/43618
> > > > > > > * config/i386/sse.md (extendv2sfv2df2): New define_expand.
> > > > > > > (sse2_cvtps2pd_load): Rename
> extendvsdfv2df2.
> > >
> > > Rename FROM ...
> > >
> > > Please also mention change to sse2_cvtps2pd.
> > >
> > > > > > >
> > > > > > > gcc/testsuite/ChangeLog:
> > > > > > >
> > > > > > > PR target/43618
> > > > > > > * gcc.target/i386/pr43618-1.c: New test.
> > > > > >
> > > > > > This patch could be as simple as:
> > > > > >
> > > > > > diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
> > > > > > index 8cd0f617bf3..c331445cb2d 100644
> > > > > > --- a/gcc/config/i386/sse.md
> > > > > > +++ b/gcc/config/i386/sse.md
> > > > > > @@ -9195,7 +9195,7 @@
> > > > > > (define_insn "extendv2sfv2df2"
> > > > > >   [(set (match_operand:V2DF 0 "register_operand" "=v")
> > > > > >(float_extend:V2DF
> > > > > > - (match_operand:V2SF 1 "register_operand" "v")))]
> > > > > > + (match_operand:V2SF 1 "nonimmediate_operand" "vm")))]
> > > > > >   "TARGET_MMX_WITH_SSE"
> > > > > >   "%vcvtps2pd\t{%1, %0|%0, %1}"
> > > > > >   [(set_attr "type" "ssecvt")
> > > > >
> > > > > We also tested on this version, it is ok.
> > > > >
> > > > > The reason why the patch looks like this is because in the
> > > > > previous insn sse2_cvtps2pd, the constraint vm and
> > > > > vector_operand actually does not match the actual instruction.
> > > > > Memory operand is V2SF, not V4SF.
> > > > >
> > > > > Therefore, we changed the constraint in that insn. Then it caused
> another
> > issue.
> > > > > For memory operand, it seems that we cannot generate those mask
> > instructions.
> > > > > So I change the pattern to how extendv2hfv2df2 works.
> > > >
> > > > If you want to change the memory access in
> sse2_cvtps2pd,
> > > > then please see how e.g. v2hiv2di is handled in sse.md. In
> > > > addition to two instructions, you will need one
> > > > define_insn_and_split with a pre-reload splitter.
> > >
> > > Oh, nowadays combine does vec_select from a paradoxical subreg on its
> own.
> > >
> > > +(define_expand "extendv2sfv2df2"
> > > +  [(set (match_operand:V2DF 0 "register_operand")
> > > +(float_extend:V2DF
> > > +  (match_operand:V2SF 1 "nonimmediate_operand")))]
> > > +  "TARGET_MMX_WITH_SSE"
> > > +{
> > > +  if (!MEM_P (operands[1]))
> > > +{
> > >
> > > You will need force reg here:
> > >
> > > rtx op1 = force_reg (V2SFmode, operands[1]);
> > > +  operands[1] = lowpart_subreg (V4SFmode, op1, V2SFmode);
> > > +  emit_insn (gen_sse2_cvtps2pd (operands[0], operands[1]));
> > > +  DONE;
> > > +}
> > > +})
> > >
> > >
> > > -(define_insn "extendv2sfv2df2"
> > > +(define_insn "sse2_cvtps2pd_load"
> > >
> > > Please name this insn "*sse2_cvtps2pd_1". Please note
> the
> > > star at the beginning, You don't have to make the name public.
> > >
> > > OK with the above changes.
> >
> > Forgot to mention:
> >
> >
> > - (match_operand:V2SF 1 "register_operand" "v")))]
> > -  "TARGET_MMX_WITH_SSE"
> > -  "%vcvtps2pd\t{%1, %0|%0, %1}"
> > + (match_operand:V2SF 1 "memory_operand" "m")))]
> > + "TARGET_MMX_WITH_SSE && "
> > +  "%vcvtps2pd\t{%1, %0|%0 > and2>, %q1}"
> >[(set_attr "type" "ssecvt")
> >
> > The new insn does not need to be limited to TARGET_MMX_WITH_SSE, so
> we
> > can use 

Re: [RFC] fortran: restore array indexing for all descriptor arrays [PR102043]

2022-07-03 Thread Bernhard Reutner-Fischer via Gcc-patches
On 2 July 2022 14:47:01 CEST, Mikael Morin  wrote:
>Le 02/07/2022 à 13:18, Thomas Koenig a écrit :
>> 
>> One thought: If we have to bite the bullet and break the ABI, why not go
>> all the way and use the C descriptors in ISO_Fortran_binding.h as
>> gfortran's native format?
>> 
>As far as I know, CFI descriptors are mutually exclusive with
>non-negative array indexes.
>
>CFI descriptors' base_addr field points to the first element in
>descriptor indexing order, so they can be indexed negatively and we
>can’t safely use array indexing with them.
>
>With an additional offset field it would be possible though (with a
>different semantics for the base_addr field).  Or we just keep the
>different semantics of the base_addr field and assume that there is an
>implicit offset with value sum(extent * max(-sm, 0)).
>
>Anyway, this is the long-delayed array descriptor reform, right?  Any

I think so, yes.

>one remembers how far we are from it?

We have a wiki page with notes IIRC.


Re: [PATCH] analyzer: Use fixed-width types in allocation size tests

2022-07-03 Thread David Malcolm via Gcc-patches
On Sat, 2022-07-02 at 19:38 -0400, David Malcolm wrote:
> On Sun, 2022-07-03 at 01:20 +0200, Tim Lange wrote:
> > Hi,
> > 
> > thanks for the mail! Embarrassingly, I did not account for the
> > different
> > sizes types may have on different systems. I've switched all
> > testcases
> > to the fixed-width types of stdint.h. 
> > 
> > Does this patch need an approval?
> 
> Arguably falls under the "obvious" rule.
> 
> That said, the patch looks good to me, though given that the sizes
> are
> now fixed the \\d+ regexps could be made more precise, if you like; I
> think it's good either way.

...and in case I didn't say earlier, Tim: congratulations on getting
your first patch into gcc.

Dave




[COMMITTED] Move range allocator code to value-range-storage.*

2022-07-03 Thread Aldy Hernandez via Gcc-patches
Now that vrange_storage is in its own file, I think it's prudent to
move all the vrange allocator code there since it's all related.
The users of value-range.h do not need to know the implementation
details of the storage facilities.

Tested and benchmarked on x86-64 Linux.

gcc/ChangeLog:

* gimple-range-cache.cc: Include value-range-storage.h.
* gimple-range-cache.h (class block_range_cache): Add "class" to
m_range_allocator.
* gimple-range-edge.cc
(gimple_outgoing_range::gimple_outgoing_range): Allocate allocator.
(gimple_outgoing_range::~gimple_outgoing_range): Free allocator.
(gimple_outgoing_range::calc_switch_ranges): Dereference allocator.
* gimple-range-edge.h: Add "class" to m_range_allocator.
* gimple-range-infer.cc
(infer_range_manager::infer_range_manager): Allocate allocator.
(infer_range_manager::~infer_range_manager): Free allocator.
(infer_range_manager::get_nonzero): Dereference allocator.
(infer_range_manager::add_range): Same.
* gimple-range-infer.h (class vrange_allocator): Add "class" to
m_range_allocator.
* value-range-storage.h (class vrange_allocator): Move from
value-range.h.
(class obstack_vrange_allocator): Same.
(class ggc_vrange_allocator): Same.
(vrange_allocator::alloc_vrange): Same.
(vrange_allocator::alloc_irange): Same.
* value-range.h (class vrange_allocator): Move to value-range-storage.h.
(class obstack_vrange_allocator): Same.
(class ggc_vrange_allocator): Same.
---
 gcc/gimple-range-cache.cc |   1 +
 gcc/gimple-range-cache.h  |   2 +-
 gcc/gimple-range-edge.cc  |   7 ++-
 gcc/gimple-range-edge.h   |   2 +-
 gcc/gimple-range-infer.cc |   9 ++-
 gcc/gimple-range-infer.h  |   2 +-
 gcc/value-range-storage.h | 113 --
 gcc/value-range.h | 109 
 8 files changed, 124 insertions(+), 121 deletions(-)

diff --git a/gcc/gimple-range-cache.cc b/gcc/gimple-range-cache.cc
index 5bb52d5f70f..9be8bc6123b 100644
--- a/gcc/gimple-range-cache.cc
+++ b/gcc/gimple-range-cache.cc
@@ -28,6 +28,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "ssa.h"
 #include "gimple-pretty-print.h"
 #include "gimple-range.h"
+#include "value-range-storage.h"
 #include "tree-cfg.h"
 #include "target.h"
 #include "attribs.h"
diff --git a/gcc/gimple-range-cache.h b/gcc/gimple-range-cache.h
index a784eba8345..0341192c9cb 100644
--- a/gcc/gimple-range-cache.h
+++ b/gcc/gimple-range-cache.h
@@ -44,7 +44,7 @@ private:
   vec m_ssa_ranges;
   ssa_block_ranges _block_ranges (tree name);
   ssa_block_ranges *query_block_ranges (tree name);
-  vrange_allocator *m_range_allocator;
+  class vrange_allocator *m_range_allocator;
   bitmap_obstack m_bitmaps;
 };
 
diff --git a/gcc/gimple-range-edge.cc b/gcc/gimple-range-edge.cc
index 03a804ac2be..194e8f87a4b 100644
--- a/gcc/gimple-range-edge.cc
+++ b/gcc/gimple-range-edge.cc
@@ -31,6 +31,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "gimple-iterator.h"
 #include "tree-cfg.h"
 #include "gimple-range.h"
+#include "value-range-storage.h"
 
 // If there is a range control statment at the end of block BB, return it.
 // Otherwise return NULL.
@@ -68,6 +69,7 @@ gimple_outgoing_range::gimple_outgoing_range (int 
max_sw_edges)
 {
   m_edge_table = NULL;
   m_max_edges = max_sw_edges;
+  m_range_allocator = new obstack_vrange_allocator;
 }
 
 
@@ -75,6 +77,7 @@ gimple_outgoing_range::~gimple_outgoing_range ()
 {
   if (m_edge_table)
 delete m_edge_table;
+  delete m_range_allocator;
 }
 
 
@@ -162,13 +165,13 @@ gimple_outgoing_range::calc_switch_ranges (gswitch *sw)
   // If there was an existing range and it doesn't fit, we lose the memory.
   // It'll get reclaimed when the obstack is freed.  This seems less
   // intrusive than allocating max ranges for each case.
-  slot = m_range_allocator.clone  (case_range);
+  slot = m_range_allocator->clone  (case_range);
 }
 
   irange * = m_edge_table->get_or_insert (default_edge, );
   // This should be the first call into this switch.
   gcc_checking_assert (!existed);
-  irange *dr = m_range_allocator.clone  (default_range);
+  irange *dr = m_range_allocator->clone  (default_range);
   slot = dr;
 }
 
diff --git a/gcc/gimple-range-edge.h b/gcc/gimple-range-edge.h
index c81b943dae6..1a4dee9f41b 100644
--- a/gcc/gimple-range-edge.h
+++ b/gcc/gimple-range-edge.h
@@ -47,7 +47,7 @@ private:
 
   int m_max_edges;
   hash_map *m_edge_table;
-  obstack_vrange_allocator m_range_allocator;
+  class obstack_vrange_allocator *m_range_allocator;
 };
 
 // If there is a range control statement at the end of block BB, return it.
diff --git a/gcc/gimple-range-infer.cc b/gcc/gimple-range-infer.cc
index eee149104b4..2d12f86ce89 100644
--- a/gcc/gimple-range-infer.cc
+++ b/gcc/gimple-range-infer.cc
@@ -28,6 +28,7 @@ 

[COMMITTED] Implement class vrange_storage to stream ranges to long term memory.

2022-07-03 Thread Aldy Hernandez via Gcc-patches
This patch implements a storage class that will be used to stream out
ranges to long term storage, initially in SSA_NAME_RANGE_INFO, but it
is flexible enough to use with our obstack allocator.  For instance,
in the future we could use it in the ranger cache to save memory.

The current size of range_info_def which is used in
SSA_NAME_RANGE_INFO is 16 bytes.  With this patch, the size of the
slot (irange_storage_slot) will be 24 bytes.  But we'll have the
ability to be able to store up to 5 pairs of sub-ranges if necessary.
If we ever need to save more (say for switches), we could explore a
trailing_wide_ints structure with a pointer to the m_len[N] bits as
Jakub has suggested.

In follow-up patches I will contribute the SSA_NAME_RANGE_INFO changes
as well as changes storing the nonzero bits within an irange.

For reference, the main interface is rather simple:

class vrange_storage
{
public:
  vrange_storage (vrange_allocator *alloc) : m_alloc (alloc) { }
  void *alloc_slot (const vrange );
  void free (void *slot);
  void get_vrange (const void *slot, vrange , tree type);
  void set_vrange (void *slot, const vrange );
  static bool fits_p (const void *slot, const vrange );
};

The above class will have the knowledge to stream out the different
ranges we support (currently only irange_storage_slot).  As has been
discussed, the irange storage will use trailing wide ints:

class GTY ((variable_size)) irange_storage_slot
{


  // This is the maximum number of wide_int's allowed in the trailing
  // ints structure, without going over 16 bytes (128 bits) in the
  // control word that preceeds the HOST_WIDE_INTs in
  // trailing_wide_ints::m_val[].
  static const unsigned MAX_INTS = 12;

  // Maximum number of range pairs we can handle, considering the
  // nonzero bits take one wide_int.
  static const unsigned MAX_PAIRS = (MAX_INTS - 1) / 2;

  trailing_wide_ints m_ints;
};

Tested on x86-64 Linux.

gcc/ChangeLog:

* Makefile.in (OBJS): Add value-range-storage.o.
(GTFILES): Add value-range-storage.h.
* gengtype.cc (open_base_files): Add value-range-storage.h.
* value-range-storage.cc: New file.
* value-range-storage.h: New file.
---
 gcc/Makefile.in|   2 +
 gcc/gengtype.cc|   1 +
 gcc/value-range-storage.cc | 212 +
 gcc/value-range-storage.h  |  85 +++
 4 files changed, 300 insertions(+)
 create mode 100644 gcc/value-range-storage.cc
 create mode 100644 gcc/value-range-storage.h

diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 69ac81a1e45..3ae23702426 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -1711,6 +1711,7 @@ OBJS = \
value-query.o \
value-range.o \
value-range-equiv.o \
+   value-range-storage.o \
value-relation.o \
value-prof.o \
var-tracking.o \
@@ -2719,6 +2720,7 @@ GTFILES = $(CPPLIB_H) $(srcdir)/input.h 
$(srcdir)/coretypes.h \
   $(srcdir)/tree-ssanames.h \
   $(srcdir)/tree-vrp.h \
   $(srcdir)/value-range.h \
+  $(srcdir)/value-range-storage.h \
   $(srcdir)/ipa-prop.h \
   $(srcdir)/trans-mem.cc \
   $(srcdir)/lto-streamer.h \
diff --git a/gcc/gengtype.cc b/gcc/gengtype.cc
index 19676251fdb..42363439bd8 100644
--- a/gcc/gengtype.cc
+++ b/gcc/gengtype.cc
@@ -1705,6 +1705,7 @@ open_base_files (void)
   "stmt.h", "expr.h", "alloc-pool.h", "cselib.h", "insn-addr.h",
   "optabs.h", "libfuncs.h", "debug.h", "internal-fn.h",
   "gimple-iterator.h", "gimple-fold.h", "value-range.h",
+  "value-range-storage.h",
   "tree-eh.h", "gimple-ssa.h", "tree-cfg.h",
   "tree-vrp.h", "tree-phinodes.h", "ssa-iterators.h", "stringpool.h",
   "tree-ssanames.h", "tree-ssa-loop.h", "tree-ssa-loop-ivopts.h",
diff --git a/gcc/value-range-storage.cc b/gcc/value-range-storage.cc
new file mode 100644
index 000..ea9b18f993b
--- /dev/null
+++ b/gcc/value-range-storage.cc
@@ -0,0 +1,212 @@
+/* Support routines for vrange storage.
+   Copyright (C) 2022 Free Software Foundation, Inc.
+   Contributed by Aldy Hernandez .
+
+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
+.  */
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "backend.h"
+#include "tree.h"
+#include "gimple.h"
+#include "ssa.h"
+#include "tree-pretty-print.h"
+#include "fold-const.h"
+#include "gimple-range.h"
+#include "value-range-storage.h"
+
+//