1 /* Gimple range GORI functions.
2 Copyright (C) 2017-2021 Free Software Foundation, Inc.
3 Contributed by Andrew MacLeod <amacleod@redhat.com>
4 and Aldy Hernandez <aldyh@redhat.com>.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
24 #include "coretypes.h"
29 #include "gimple-pretty-print.h"
30 #include "gimple-range.h"
32 // Calculate what we can determine of the range of this unary
33 // statement's operand if the lhs of the expression has the range
34 // LHS_RANGE. Return false if nothing can be determined.
37 gimple_range_calc_op1 (irange
&r
, const gimple
*stmt
, const irange
&lhs_range
)
39 gcc_checking_assert (gimple_num_ops (stmt
) < 3);
40 // Give up on empty ranges.
41 if (lhs_range
.undefined_p ())
44 // Unary operations require the type of the first operand in the
45 // second range position.
46 tree type
= TREE_TYPE (gimple_range_operand1 (stmt
));
47 int_range
<2> type_range (type
);
48 return gimple_range_handler (stmt
)->op1_range (r
, type
, lhs_range
,
52 // Calculate what we can determine of the range of this statement's
53 // first operand if the lhs of the expression has the range LHS_RANGE
54 // and the second operand has the range OP2_RANGE. Return false if
55 // nothing can be determined.
58 gimple_range_calc_op1 (irange
&r
, const gimple
*stmt
,
59 const irange
&lhs_range
, const irange
&op2_range
)
61 // Give up on empty ranges.
62 if (lhs_range
.undefined_p ())
65 // Unary operation are allowed to pass a range in for second operand
66 // as there are often additional restrictions beyond the type which
67 // can be imposed. See operator_cast::op1_range().
68 tree type
= TREE_TYPE (gimple_range_operand1 (stmt
));
69 // If op2 is undefined, solve as if it is varying.
70 if (op2_range
.undefined_p ())
72 // This is sometimes invoked on single operand stmts.
73 if (gimple_num_ops (stmt
) < 3)
75 int_range
<2> trange (TREE_TYPE (gimple_range_operand2 (stmt
)));
76 return gimple_range_handler (stmt
)->op1_range (r
, type
, lhs_range
,
79 return gimple_range_handler (stmt
)->op1_range (r
, type
, lhs_range
,
83 // Calculate what we can determine of the range of this statement's
84 // second operand if the lhs of the expression has the range LHS_RANGE
85 // and the first operand has the range OP1_RANGE. Return false if
86 // nothing can be determined.
89 gimple_range_calc_op2 (irange
&r
, const gimple
*stmt
,
90 const irange
&lhs_range
, const irange
&op1_range
)
92 // Give up on empty ranges.
93 if (lhs_range
.undefined_p ())
96 tree type
= TREE_TYPE (gimple_range_operand2 (stmt
));
97 // If op1 is undefined, solve as if it is varying.
98 if (op1_range
.undefined_p ())
100 int_range
<2> trange (TREE_TYPE (gimple_range_operand1 (stmt
)));
101 return gimple_range_handler (stmt
)->op2_range (r
, type
, lhs_range
,
104 return gimple_range_handler (stmt
)->op2_range (r
, type
, lhs_range
,
108 // Return TRUE if GS is a logical && or || expression.
111 is_gimple_logical_p (const gimple
*gs
)
113 // Look for boolean and/or condition.
114 if (is_gimple_assign (gs
))
115 switch (gimple_expr_code (gs
))
123 // Bitwise operations on single bits are logical too.
124 if (types_compatible_p (TREE_TYPE (gimple_assign_rhs1 (gs
)),
135 /* RANGE_DEF_CHAIN is used to determine which SSA names in a block can
136 have range information calculated for them, and what the
137 dependencies on each other are.
139 Information for a basic block is calculated once and stored. It is
140 only calculated the first time a query is made, so if no queries
141 are made, there is little overhead.
143 The def_chain bitmap is indexed by SSA_NAME_VERSION. Bits are set
144 within this bitmap to indicate SSA names that are defined in the
145 SAME block and used to calculate this SSA name.
159 This dump indicates the bits set in the def_chain vector.
160 as well as demonstrates the def_chain bits for the related ssa_names.
162 Checking the chain for _2 indicates that _1 and x_4 are used in
165 Def chains also only include statements which are valid gimple
166 so a def chain will only span statements for which the range
167 engine implements operations for. */
170 // Construct a range_def_chain.
172 range_def_chain::range_def_chain ()
174 bitmap_obstack_initialize (&m_bitmaps
);
175 m_def_chain
.create (0);
176 m_def_chain
.safe_grow_cleared (num_ssa_names
);
180 // Destruct a range_def_chain.
182 range_def_chain::~range_def_chain ()
184 m_def_chain
.release ();
185 bitmap_obstack_release (&m_bitmaps
);
188 // Return true if NAME is in the def chain of DEF. If BB is provided,
189 // only return true if the defining statement of DEF is in BB.
192 range_def_chain::in_chain_p (tree name
, tree def
)
194 gcc_checking_assert (gimple_range_ssa_p (def
));
195 gcc_checking_assert (gimple_range_ssa_p (name
));
197 // Get the defintion chain for DEF.
198 bitmap chain
= get_def_chain (def
);
202 return bitmap_bit_p (chain
, SSA_NAME_VERSION (name
));
205 // Add either IMP or the import list B to the import set of DATA.
208 range_def_chain::set_import (struct rdc
&data
, tree imp
, bitmap b
)
210 // If there are no imports, just return
211 if (imp
== NULL_TREE
&& !b
)
214 data
.m_import
= BITMAP_ALLOC (&m_bitmaps
);
215 if (imp
!= NULL_TREE
)
216 bitmap_set_bit (data
.m_import
, SSA_NAME_VERSION (imp
));
218 bitmap_ior_into (data
.m_import
, b
);
221 // Return the import list for NAME.
224 range_def_chain::get_imports (tree name
)
226 if (!has_def_chain (name
))
227 get_def_chain (name
);
228 bitmap i
= m_def_chain
[SSA_NAME_VERSION (name
)].m_import
;
232 // Return true if IMPORT is an import to NAMEs def chain.
235 range_def_chain::chain_import_p (tree name
, tree import
)
237 bitmap b
= get_imports (name
);
239 return bitmap_bit_p (b
, SSA_NAME_VERSION (import
));
243 // Build def_chains for NAME if it is in BB. Copy the def chain into RESULT.
246 range_def_chain::register_dependency (tree name
, tree dep
, basic_block bb
)
248 if (!gimple_range_ssa_p (dep
))
251 unsigned v
= SSA_NAME_VERSION (name
);
252 if (v
>= m_def_chain
.length ())
253 m_def_chain
.safe_grow_cleared (num_ssa_names
+ 1);
254 struct rdc
&src
= m_def_chain
[v
];
255 gimple
*def_stmt
= SSA_NAME_DEF_STMT (dep
);
256 unsigned dep_v
= SSA_NAME_VERSION (dep
);
259 // Set the direct dependency cache entries.
262 else if (!src
.ssa2
&& src
.ssa1
!= dep
)
265 // Don't calculate imports or export/dep chains if BB is not provided.
266 // This is usually the case for when the temporal cache wants the direct
267 // dependencies of a stmt.
272 src
.bm
= BITMAP_ALLOC (&m_bitmaps
);
274 // Add this operand into the result.
275 bitmap_set_bit (src
.bm
, dep_v
);
277 if (gimple_bb (def_stmt
) == bb
&& !is_a
<gphi
*>(def_stmt
))
279 // Get the def chain for the operand.
280 b
= get_def_chain (dep
);
281 // If there was one, copy it into result.
283 bitmap_ior_into (src
.bm
, b
);
284 // And copy the import list.
285 set_import (src
, NULL_TREE
, get_imports (dep
));
288 // Originated outside the block, so it is an import.
289 set_import (src
, dep
, NULL
);
293 range_def_chain::def_chain_in_bitmap_p (tree name
, bitmap b
)
295 bitmap a
= get_def_chain (name
);
297 return bitmap_intersect_p (a
, b
);
302 range_def_chain::add_def_chain_to_bitmap (bitmap b
, tree name
)
304 bitmap r
= get_def_chain (name
);
306 bitmap_ior_into (b
, r
);
310 // Return TRUE if NAME has been processed for a def_chain.
313 range_def_chain::has_def_chain (tree name
)
315 // Ensure there is an entry in the internal vector.
316 unsigned v
= SSA_NAME_VERSION (name
);
317 if (v
>= m_def_chain
.length ())
318 m_def_chain
.safe_grow_cleared (num_ssa_names
+ 1);
319 return (m_def_chain
[v
].ssa1
!= 0);
324 // Calculate the def chain for NAME and all of its dependent
325 // operands. Only using names in the same BB. Return the bitmap of
326 // all names in the m_def_chain. This only works for supported range
330 range_def_chain::get_def_chain (tree name
)
332 tree ssa1
, ssa2
, ssa3
;
333 unsigned v
= SSA_NAME_VERSION (name
);
334 bool is_logical
= false;
336 // If it has already been processed, just return the cached value.
337 if (has_def_chain (name
))
338 return m_def_chain
[v
].bm
;
340 // No definition chain for default defs.
341 if (SSA_NAME_IS_DEFAULT_DEF (name
))
343 // A Default def is always an import.
344 set_import (m_def_chain
[v
], name
, NULL
);
348 gimple
*stmt
= SSA_NAME_DEF_STMT (name
);
349 if (gimple_range_handler (stmt
))
351 is_logical
= is_gimple_logical_p (stmt
);
352 // Terminate the def chains if we see too many cascading logical stmts.
355 if (m_logical_depth
== param_ranger_logical_depth
)
360 ssa1
= gimple_range_ssa_p (gimple_range_operand1 (stmt
));
361 ssa2
= gimple_range_ssa_p (gimple_range_operand2 (stmt
));
364 else if (is_a
<gassign
*> (stmt
)
365 && gimple_assign_rhs_code (stmt
) == COND_EXPR
)
367 gassign
*st
= as_a
<gassign
*> (stmt
);
368 ssa1
= gimple_range_ssa_p (gimple_assign_rhs1 (st
));
369 ssa2
= gimple_range_ssa_p (gimple_assign_rhs2 (st
));
370 ssa3
= gimple_range_ssa_p (gimple_assign_rhs3 (st
));
374 // Stmts not understood are always imports.
375 set_import (m_def_chain
[v
], name
, NULL
);
379 register_dependency (name
, ssa1
, gimple_bb (stmt
));
380 register_dependency (name
, ssa2
, gimple_bb (stmt
));
381 register_dependency (name
, ssa3
, gimple_bb (stmt
));
382 // Stmts with no understandable operands are also imports.
383 if (!ssa1
&& !ssa2
& !ssa3
)
384 set_import (m_def_chain
[v
], name
, NULL
);
389 return m_def_chain
[v
].bm
;
392 // Dump what we know for basic block BB to file F.
395 range_def_chain::dump (FILE *f
, basic_block bb
, const char *prefix
)
400 // Dump the def chain for each SSA_NAME defined in BB.
401 for (x
= 1; x
< num_ssa_names
; x
++)
403 tree name
= ssa_name (x
);
406 gimple
*stmt
= SSA_NAME_DEF_STMT (name
);
407 if (!stmt
|| (bb
&& gimple_bb (stmt
) != bb
))
409 bitmap chain
= (has_def_chain (name
) ? get_def_chain (name
) : NULL
);
410 if (chain
&& !bitmap_empty_p (chain
))
413 print_generic_expr (f
, name
, TDF_SLIM
);
416 bitmap imports
= get_imports (name
);
417 EXECUTE_IF_SET_IN_BITMAP (chain
, 0, y
, bi
)
419 print_generic_expr (f
, ssa_name (y
), TDF_SLIM
);
420 if (imports
&& bitmap_bit_p (imports
, y
))
430 // -------------------------------------------------------------------
432 /* GORI_MAP is used to accumulate what SSA names in a block can
433 generate range information, and provides tools for the block ranger
434 to enable it to efficiently calculate these ranges.
436 GORI stands for "Generates Outgoing Range Information."
438 It utilizes the range_def_chain class to contruct def_chains.
439 Information for a basic block is calculated once and stored. It is
440 only calculated the first time a query is made. If no queries are
441 made, there is little overhead.
443 one bitmap is maintained for each basic block:
444 m_outgoing : a set bit indicates a range can be generated for a name.
446 Generally speaking, the m_outgoing vector is the union of the
447 entire def_chain of all SSA names used in the last statement of the
448 block which generate ranges. */
451 // Initialize a gori-map structure.
453 gori_map::gori_map ()
455 m_outgoing
.create (0);
456 m_outgoing
.safe_grow_cleared (last_basic_block_for_fn (cfun
));
457 m_incoming
.create (0);
458 m_incoming
.safe_grow_cleared (last_basic_block_for_fn (cfun
));
459 m_maybe_variant
= BITMAP_ALLOC (&m_bitmaps
);
462 // Free any memory the GORI map allocated.
464 gori_map::~gori_map ()
466 m_incoming
.release ();
467 m_outgoing
.release ();
470 // Return the bitmap vector of all export from BB. Calculate if necessary.
473 gori_map::exports (basic_block bb
)
475 if (bb
->index
>= (signed int)m_outgoing
.length () || !m_outgoing
[bb
->index
])
477 return m_outgoing
[bb
->index
];
480 // Return the bitmap vector of all imports to BB. Calculate if necessary.
483 gori_map::imports (basic_block bb
)
485 if (bb
->index
>= (signed int)m_outgoing
.length () || !m_outgoing
[bb
->index
])
487 return m_incoming
[bb
->index
];
490 // Return true if NAME is can have ranges generated for it from basic
494 gori_map::is_export_p (tree name
, basic_block bb
)
496 // If no BB is specified, test if it is exported anywhere in the IL.
498 return bitmap_bit_p (m_maybe_variant
, SSA_NAME_VERSION (name
));
499 return bitmap_bit_p (exports (bb
), SSA_NAME_VERSION (name
));
502 // Clear the m_maybe_variant bit so ranges will not be tracked for NAME.
505 gori_map::set_range_invariant (tree name
)
507 bitmap_clear_bit (m_maybe_variant
, SSA_NAME_VERSION (name
));
510 // Return true if NAME is an import to block BB.
513 gori_map::is_import_p (tree name
, basic_block bb
)
515 // If no BB is specified, test if it is exported anywhere in the IL.
516 return bitmap_bit_p (imports (bb
), SSA_NAME_VERSION (name
));
519 // If NAME is non-NULL and defined in block BB, calculate the def
520 // chain and add it to m_outgoing.
523 gori_map::maybe_add_gori (tree name
, basic_block bb
)
527 // Check if there is a def chain, regardless of the block.
528 add_def_chain_to_bitmap (m_outgoing
[bb
->index
], name
);
529 // Check for any imports.
530 bitmap imp
= get_imports (name
);
531 // If there were imports, add them so we can recompute
533 bitmap_ior_into (m_incoming
[bb
->index
], imp
);
534 // This name is always an import.
535 if (gimple_bb (SSA_NAME_DEF_STMT (name
)) != bb
)
536 bitmap_set_bit (m_incoming
[bb
->index
], SSA_NAME_VERSION (name
));
538 // Def chain doesn't include itself, and even if there isn't a
539 // def chain, this name should be added to exports.
540 bitmap_set_bit (m_outgoing
[bb
->index
], SSA_NAME_VERSION (name
));
544 // Calculate all the required information for BB.
547 gori_map::calculate_gori (basic_block bb
)
550 if (bb
->index
>= (signed int)m_outgoing
.length ())
552 m_outgoing
.safe_grow_cleared (last_basic_block_for_fn (cfun
));
553 m_incoming
.safe_grow_cleared (last_basic_block_for_fn (cfun
));
555 gcc_checking_assert (m_outgoing
[bb
->index
] == NULL
);
556 m_outgoing
[bb
->index
] = BITMAP_ALLOC (&m_bitmaps
);
557 m_incoming
[bb
->index
] = BITMAP_ALLOC (&m_bitmaps
);
559 // If this block's last statement may generate range informaiton, go
561 gimple
*stmt
= gimple_outgoing_range_stmt_p (bb
);
564 if (is_a
<gcond
*> (stmt
))
566 gcond
*gc
= as_a
<gcond
*>(stmt
);
567 name
= gimple_range_ssa_p (gimple_cond_lhs (gc
));
568 maybe_add_gori (name
, gimple_bb (stmt
));
570 name
= gimple_range_ssa_p (gimple_cond_rhs (gc
));
571 maybe_add_gori (name
, gimple_bb (stmt
));
575 // Do not process switches if they are too large.
576 if (EDGE_COUNT (bb
->succs
) > (unsigned)param_evrp_switch_limit
)
578 gswitch
*gs
= as_a
<gswitch
*>(stmt
);
579 name
= gimple_range_ssa_p (gimple_switch_index (gs
));
580 maybe_add_gori (name
, gimple_bb (stmt
));
582 // Add this bitmap to the aggregate list of all outgoing names.
583 bitmap_ior_into (m_maybe_variant
, m_outgoing
[bb
->index
]);
586 // Dump the table information for BB to file F.
589 gori_map::dump (FILE *f
, basic_block bb
, bool verbose
)
591 // BB was not processed.
592 if (!m_outgoing
[bb
->index
] || bitmap_empty_p (m_outgoing
[bb
->index
]))
597 bitmap imp
= imports (bb
);
598 if (!bitmap_empty_p (imp
))
601 fprintf (f
, "bb<%u> Imports: ",bb
->index
);
603 fprintf (f
, "Imports: ");
604 FOR_EACH_GORI_IMPORT_NAME (*this, bb
, name
)
606 print_generic_expr (f
, name
, TDF_SLIM
);
613 fprintf (f
, "bb<%u> Exports: ",bb
->index
);
615 fprintf (f
, "Exports: ");
616 // Dump the export vector.
617 FOR_EACH_GORI_EXPORT_NAME (*this, bb
, name
)
619 print_generic_expr (f
, name
, TDF_SLIM
);
624 range_def_chain::dump (f
, bb
, " ");
627 // Dump the entire GORI map structure to file F.
630 gori_map::dump (FILE *f
)
633 FOR_EACH_BB_FN (bb
, cfun
)
643 // -------------------------------------------------------------------
645 // Construct a gori_compute object.
647 gori_compute::gori_compute (int not_executable_flag
)
648 : outgoing (param_evrp_switch_limit
), tracer ("GORI ")
650 m_not_executable_flag
= not_executable_flag
;
651 // Create a boolean_type true and false range.
652 m_bool_zero
= int_range
<2> (boolean_false_node
, boolean_false_node
);
653 m_bool_one
= int_range
<2> (boolean_true_node
, boolean_true_node
);
654 if (dump_file
&& (param_ranger_debug
& RANGER_DEBUG_GORI
))
655 tracer
.enable_trace ();
658 // Given the switch S, return an evaluation in R for NAME when the lhs
659 // evaluates to LHS. Returning false means the name being looked for
660 // was not resolvable.
663 gori_compute::compute_operand_range_switch (irange
&r
, gswitch
*s
,
665 tree name
, fur_source
&src
)
667 tree op1
= gimple_switch_index (s
);
669 // If name matches, the range is simply the range from the edge.
670 // Empty ranges are viral as they are on a path which isn't
672 if (op1
== name
|| lhs
.undefined_p ())
678 // If op1 is in the defintion chain, pass lhs back.
679 if (gimple_range_ssa_p (op1
) && in_chain_p (name
, op1
))
680 return compute_operand_range (r
, SSA_NAME_DEF_STMT (op1
), lhs
, name
, src
);
686 // Return an evaluation for NAME as it would appear in STMT when the
687 // statement's lhs evaluates to LHS. If successful, return TRUE and
688 // store the evaluation in R, otherwise return FALSE.
691 gori_compute::compute_operand_range (irange
&r
, gimple
*stmt
,
692 const irange
&lhs
, tree name
,
695 // If the lhs doesn't tell us anything, neither will unwinding further.
696 if (lhs
.varying_p ())
699 // Empty ranges are viral as they are on an unexecutable path.
700 if (lhs
.undefined_p ())
705 if (is_a
<gswitch
*> (stmt
))
706 return compute_operand_range_switch (r
, as_a
<gswitch
*> (stmt
), lhs
, name
,
708 if (!gimple_range_handler (stmt
))
711 tree op1
= gimple_range_ssa_p (gimple_range_operand1 (stmt
));
712 tree op2
= gimple_range_ssa_p (gimple_range_operand2 (stmt
));
714 // Handle end of lookup first.
716 return compute_operand1_range (r
, stmt
, lhs
, name
, src
);
718 return compute_operand2_range (r
, stmt
, lhs
, name
, src
);
720 // NAME is not in this stmt, but one of the names in it ought to be
722 bool op1_in_chain
= op1
&& in_chain_p (name
, op1
);
723 bool op2_in_chain
= op2
&& in_chain_p (name
, op2
);
725 // If neither operand is derived, then this stmt tells us nothing.
726 if (!op1_in_chain
&& !op2_in_chain
)
730 // Process logicals as they have special handling.
731 if (is_gimple_logical_p (stmt
))
734 if ((idx
= tracer
.header ("compute_operand ")))
736 print_generic_expr (dump_file
, name
, TDF_SLIM
);
737 fprintf (dump_file
, " with LHS = ");
738 lhs
.dump (dump_file
);
739 fprintf (dump_file
, " at stmt ");
740 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
743 int_range_max op1_trange
, op1_frange
;
744 int_range_max op2_trange
, op2_frange
;
745 compute_logical_operands (op1_trange
, op1_frange
, stmt
, lhs
,
746 name
, src
, op1
, op1_in_chain
);
747 compute_logical_operands (op2_trange
, op2_frange
, stmt
, lhs
,
748 name
, src
, op2
, op2_in_chain
);
749 res
= logical_combine (r
, gimple_expr_code (stmt
), lhs
,
750 op1_trange
, op1_frange
, op2_trange
, op2_frange
);
752 tracer
.trailer (idx
, "compute_operand", res
, name
, r
);
754 // Follow the appropriate operands now.
755 else if (op1_in_chain
&& op2_in_chain
)
756 res
= compute_operand1_and_operand2_range (r
, stmt
, lhs
, name
, src
);
757 else if (op1_in_chain
)
758 res
= compute_operand1_range (r
, stmt
, lhs
, name
, src
);
759 else if (op2_in_chain
)
760 res
= compute_operand2_range (r
, stmt
, lhs
, name
, src
);
764 // If neither operand is derived, this statement tells us nothing.
769 // Return TRUE if range R is either a true or false compatible range.
772 range_is_either_true_or_false (const irange
&r
)
774 if (r
.undefined_p ())
777 // This is complicated by the fact that Ada has multi-bit booleans,
778 // so true can be ~[0, 0] (i.e. [1,MAX]).
779 tree type
= r
.type ();
780 gcc_checking_assert (range_compatible_p (type
, boolean_type_node
));
781 return (r
.singleton_p () || !r
.contains_p (build_zero_cst (type
)));
784 // Evaluate a binary logical expression by combining the true and
785 // false ranges for each of the operands based on the result value in
789 gori_compute::logical_combine (irange
&r
, enum tree_code code
,
791 const irange
&op1_true
, const irange
&op1_false
,
792 const irange
&op2_true
, const irange
&op2_false
)
794 if (op1_true
.varying_p () && op1_false
.varying_p ()
795 && op2_true
.varying_p () && op2_false
.varying_p ())
799 if ((idx
= tracer
.header ("logical_combine")))
805 fprintf (dump_file
, " || ");
809 fprintf (dump_file
, " && ");
814 fprintf (dump_file
, " with LHS = ");
815 lhs
.dump (dump_file
);
816 fputc ('\n', dump_file
);
818 tracer
.print (idx
, "op1_true = ");
819 op1_true
.dump (dump_file
);
820 fprintf (dump_file
, " op1_false = ");
821 op1_false
.dump (dump_file
);
822 fputc ('\n', dump_file
);
823 tracer
.print (idx
, "op2_true = ");
824 op2_true
.dump (dump_file
);
825 fprintf (dump_file
, " op2_false = ");
826 op2_false
.dump (dump_file
);
827 fputc ('\n', dump_file
);
830 // This is not a simple fold of a logical expression, rather it
831 // determines ranges which flow through the logical expression.
833 // Assuming x_8 is an unsigned char, and relational statements:
836 // consider the logical expression and branch:
840 // To determine the range of x_8 on either edge of the branch, one
841 // must first determine what the range of x_8 is when the boolean
842 // values of b_1 and b_2 are both true and false.
843 // b_1 TRUE x_8 = [0, 19]
844 // b_1 FALSE x_8 = [20, 255]
845 // b_2 TRUE x_8 = [6, 255]
846 // b_2 FALSE x_8 = [0,5].
848 // These ranges are then combined based on the expected outcome of
849 // the branch. The range on the TRUE side of the branch must satisfy
850 // b_1 == true && b_2 == true
852 // In terms of x_8, that means both x_8 == [0, 19] and x_8 = [6, 255]
853 // must be true. The range of x_8 on the true side must be the
854 // intersection of both ranges since both must be true. Thus the
855 // range of x_8 on the true side is [6, 19].
857 // To determine the ranges on the FALSE side, all 3 combinations of
858 // failing ranges must be considered, and combined as any of them
859 // can cause the false result.
861 // If the LHS can be TRUE or FALSE, then evaluate both a TRUE and
862 // FALSE results and combine them. If we fell back to VARYING any
863 // range restrictions that have been discovered up to this point
865 if (!range_is_either_true_or_false (lhs
))
869 if (logical_combine (r1
, code
, m_bool_zero
, op1_true
, op1_false
,
871 && logical_combine (r
, code
, m_bool_one
, op1_true
, op1_false
,
872 op2_true
, op2_false
))
880 tracer
.trailer (idx
, "logical_combine", res
, NULL_TREE
, r
);
885 // A logical AND combines ranges from 2 boolean conditions.
891 // The TRUE side is the intersection of the the 2 true ranges.
893 r
.intersect (op2_true
);
897 // The FALSE side is the union of the other 3 cases.
898 int_range_max
ff (op1_false
);
899 ff
.intersect (op2_false
);
900 int_range_max
tf (op1_true
);
901 tf
.intersect (op2_false
);
902 int_range_max
ft (op1_false
);
903 ft
.intersect (op2_true
);
909 // A logical OR combines ranges from 2 boolean conditons.
915 // An OR operation will only take the FALSE path if both
916 // operands are false simlulateously, which means they should
917 // be intersected. !(x || y) == !x && !y
919 r
.intersect (op2_false
);
923 // The TRUE side of an OR operation will be the union of
924 // the other three combinations.
925 int_range_max
tt (op1_true
);
926 tt
.intersect (op2_true
);
927 int_range_max
tf (op1_true
);
928 tf
.intersect (op2_false
);
929 int_range_max
ft (op1_false
);
930 ft
.intersect (op2_true
);
941 tracer
.trailer (idx
, "logical_combine", true, NULL_TREE
, r
);
946 // Given a logical STMT, calculate true and false ranges for each
947 // potential path of NAME, assuming NAME came through the OP chain if
948 // OP_IN_CHAIN is true.
951 gori_compute::compute_logical_operands (irange
&true_range
, irange
&false_range
,
954 tree name
, fur_source
&src
,
955 tree op
, bool op_in_chain
)
957 gimple
*src_stmt
= gimple_range_ssa_p (op
) ? SSA_NAME_DEF_STMT (op
) : NULL
;
958 if (!op_in_chain
|| !src_stmt
|| chain_import_p (gimple_get_lhs (stmt
), op
))
960 // If op is not in the def chain, or defined in this block,
961 // use its known value on entry to the block.
962 src
.get_operand (true_range
, name
);
963 false_range
= true_range
;
965 if ((idx
= tracer
.header ("logical_operand")))
967 print_generic_expr (dump_file
, op
, TDF_SLIM
);
968 fprintf (dump_file
, " not in computation chain. Queried.\n");
969 tracer
.trailer (idx
, "logical_operand", true, NULL_TREE
, true_range
);
974 enum tree_code code
= gimple_expr_code (stmt
);
975 // Optimize [0 = x | y], since neither operand can ever be non-zero.
976 if ((code
== BIT_IOR_EXPR
|| code
== TRUTH_OR_EXPR
) && lhs
.zero_p ())
978 if (!compute_operand_range (false_range
, src_stmt
, m_bool_zero
, name
,
980 src
.get_operand (false_range
, name
);
981 true_range
= false_range
;
985 // Optimize [1 = x & y], since neither operand can ever be zero.
986 if ((code
== BIT_AND_EXPR
|| code
== TRUTH_AND_EXPR
) && lhs
== m_bool_one
)
988 if (!compute_operand_range (true_range
, src_stmt
, m_bool_one
, name
, src
))
989 src
.get_operand (true_range
, name
);
990 false_range
= true_range
;
994 // Calculate ranges for true and false on both sides, since the false
995 // path is not always a simple inversion of the true side.
996 if (!compute_operand_range (true_range
, src_stmt
, m_bool_one
, name
, src
))
997 src
.get_operand (true_range
, name
);
998 if (!compute_operand_range (false_range
, src_stmt
, m_bool_zero
, name
, src
))
999 src
.get_operand (false_range
, name
);
1002 // Calculate a range for NAME from the operand 1 position of STMT
1003 // assuming the result of the statement is LHS. Return the range in
1004 // R, or false if no range could be calculated.
1007 gori_compute::compute_operand1_range (irange
&r
, gimple
*stmt
,
1008 const irange
&lhs
, tree name
,
1011 int_range_max op1_range
, op2_range
;
1012 tree op1
= gimple_range_operand1 (stmt
);
1013 tree op2
= gimple_range_operand2 (stmt
);
1015 // Fetch the known range for op1 in this block.
1016 src
.get_operand (op1_range
, op1
);
1018 // Now range-op calcuate and put that result in r.
1021 src
.get_operand (op2_range
, op2
);
1022 if (!gimple_range_calc_op1 (r
, stmt
, lhs
, op2_range
))
1027 // We pass op1_range to the unary operation. Nomally it's a
1028 // hidden range_for_type parameter, but sometimes having the
1029 // actual range can result in better information.
1030 if (!gimple_range_calc_op1 (r
, stmt
, lhs
, op1_range
))
1035 if ((idx
= tracer
.header ("compute op 1 (")))
1037 print_generic_expr (dump_file
, op1
, TDF_SLIM
);
1038 fprintf (dump_file
, ") at ");
1039 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
1040 tracer
.print (idx
, "LHS =");
1041 lhs
.dump (dump_file
);
1042 if (op2
&& TREE_CODE (op2
) == SSA_NAME
)
1044 fprintf (dump_file
, ", ");
1045 print_generic_expr (dump_file
, op2
, TDF_SLIM
);
1046 fprintf (dump_file
, " = ");
1047 op2_range
.dump (dump_file
);
1049 fprintf (dump_file
, "\n");
1050 tracer
.print (idx
, "Computes ");
1051 print_generic_expr (dump_file
, op1
, TDF_SLIM
);
1052 fprintf (dump_file
, " = ");
1054 fprintf (dump_file
, " intersect Known range : ");
1055 op1_range
.dump (dump_file
);
1056 fputc ('\n', dump_file
);
1058 // Intersect the calculated result with the known result and return if done.
1061 r
.intersect (op1_range
);
1063 tracer
.trailer (idx
, "produces ", true, name
, r
);
1066 // If the calculation continues, we're using op1_range as the new LHS.
1067 op1_range
.intersect (r
);
1070 tracer
.trailer (idx
, "produces ", true, op1
, op1_range
);
1071 gimple
*src_stmt
= SSA_NAME_DEF_STMT (op1
);
1072 gcc_checking_assert (src_stmt
);
1074 // Then feed this range back as the LHS of the defining statement.
1075 return compute_operand_range (r
, src_stmt
, op1_range
, name
, src
);
1079 // Calculate a range for NAME from the operand 2 position of S
1080 // assuming the result of the statement is LHS. Return the range in
1081 // R, or false if no range could be calculated.
1084 gori_compute::compute_operand2_range (irange
&r
, gimple
*stmt
,
1085 const irange
&lhs
, tree name
,
1088 int_range_max op1_range
, op2_range
;
1089 tree op1
= gimple_range_operand1 (stmt
);
1090 tree op2
= gimple_range_operand2 (stmt
);
1092 src
.get_operand (op1_range
, op1
);
1093 src
.get_operand (op2_range
, op2
);
1095 // Intersect with range for op2 based on lhs and op1.
1096 if (!gimple_range_calc_op2 (r
, stmt
, lhs
, op1_range
))
1100 if ((idx
= tracer
.header ("compute op 2 (")))
1102 print_generic_expr (dump_file
, op2
, TDF_SLIM
);
1103 fprintf (dump_file
, ") at ");
1104 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
1105 tracer
.print (idx
, "LHS = ");
1106 lhs
.dump (dump_file
);
1107 if (TREE_CODE (op1
) == SSA_NAME
)
1109 fprintf (dump_file
, ", ");
1110 print_generic_expr (dump_file
, op1
, TDF_SLIM
);
1111 fprintf (dump_file
, " = ");
1112 op1_range
.dump (dump_file
);
1114 fprintf (dump_file
, "\n");
1115 tracer
.print (idx
, "Computes ");
1116 print_generic_expr (dump_file
, op2
, TDF_SLIM
);
1117 fprintf (dump_file
, " = ");
1119 fprintf (dump_file
, " intersect Known range : ");
1120 op2_range
.dump (dump_file
);
1121 fputc ('\n', dump_file
);
1123 // Intersect the calculated result with the known result and return if done.
1126 r
.intersect (op2_range
);
1128 tracer
.trailer (idx
, " produces ", true, NULL_TREE
, r
);
1131 // If the calculation continues, we're using op2_range as the new LHS.
1132 op2_range
.intersect (r
);
1135 tracer
.trailer (idx
, " produces ", true, op2
, op2_range
);
1136 gimple
*src_stmt
= SSA_NAME_DEF_STMT (op2
);
1137 gcc_checking_assert (src_stmt
);
1138 // gcc_checking_assert (!is_import_p (op2, find.bb));
1140 // Then feed this range back as the LHS of the defining statement.
1141 return compute_operand_range (r
, src_stmt
, op2_range
, name
, src
);
1144 // Calculate a range for NAME from both operand positions of S
1145 // assuming the result of the statement is LHS. Return the range in
1146 // R, or false if no range could be calculated.
1149 gori_compute::compute_operand1_and_operand2_range (irange
&r
,
1155 int_range_max op_range
;
1157 // Calculate a good a range for op2. Since op1 == op2, this will
1158 // have already included whatever the actual range of name is.
1159 if (!compute_operand2_range (op_range
, stmt
, lhs
, name
, src
))
1162 // Now get the range thru op1.
1163 if (!compute_operand1_range (r
, stmt
, lhs
, name
, src
))
1166 // Both operands have to be simultaneously true, so perform an intersection.
1167 r
.intersect (op_range
);
1170 // Return TRUE if a range can be calculated or recomputed for NAME on edge E.
1173 gori_compute::has_edge_range_p (tree name
, edge e
)
1175 // Check if NAME is an export or can be recomputed.
1177 return is_export_p (name
, e
->src
) || may_recompute_p (name
, e
);
1179 // If no edge is specified, check if NAME can have a range calculated
1181 return is_export_p (name
) || may_recompute_p (name
);
1184 // Dump what is known to GORI computes to listing file F.
1187 gori_compute::dump (FILE *f
)
1192 // Return TRUE if NAME can be recomputed on edge E. If any direct dependant
1193 // is exported on edge E, it may change the computed value of NAME.
1196 gori_compute::may_recompute_p (tree name
, edge e
)
1198 tree dep1
= depend1 (name
);
1199 tree dep2
= depend2 (name
);
1201 // If the first dependency is not set, there is no recompuation.
1205 // Don't recalculate PHIs or statements with side_effects.
1206 gimple
*s
= SSA_NAME_DEF_STMT (name
);
1207 if (is_a
<gphi
*> (s
) || gimple_has_side_effects (s
))
1210 // If edge is specified, check if NAME can be recalculated on that edge.
1212 return ((is_export_p (dep1
, e
->src
))
1213 || (dep2
&& is_export_p (dep2
, e
->src
)));
1215 return (is_export_p (dep1
)) || (dep2
&& is_export_p (dep2
));
1218 // Calculate a range on edge E and return it in R. Try to evaluate a
1219 // range for NAME on this edge. Return FALSE if this is either not a
1220 // control edge or NAME is not defined by this edge.
1223 gori_compute::outgoing_edge_range_p (irange
&r
, edge e
, tree name
,
1229 if ((e
->flags
& m_not_executable_flag
))
1232 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1233 fprintf (dump_file
, "Outgoing edge %d->%d unexecutable.\n",
1234 e
->src
->index
, e
->dest
->index
);
1238 gcc_checking_assert (gimple_range_ssa_p (name
));
1239 // Determine if there is an outgoing edge.
1240 gimple
*stmt
= outgoing
.edge_range_p (lhs
, e
);
1244 fur_stmt
src (stmt
, &q
);
1245 // If NAME can be calculated on the edge, use that.
1246 if (is_export_p (name
, e
->src
))
1249 if ((idx
= tracer
.header ("outgoing_edge")))
1251 fprintf (dump_file
, " for ");
1252 print_generic_expr (dump_file
, name
, TDF_SLIM
);
1253 fprintf (dump_file
, " on edge %d->%d\n",
1254 e
->src
->index
, e
->dest
->index
);
1256 if ((res
= compute_operand_range (r
, stmt
, lhs
, name
, src
)))
1258 // Sometimes compatible types get interchanged. See PR97360.
1259 // Make sure we are returning the type of the thing we asked for.
1260 if (!r
.undefined_p () && r
.type () != TREE_TYPE (name
))
1262 gcc_checking_assert (range_compatible_p (r
.type (),
1264 range_cast (r
, TREE_TYPE (name
));
1268 tracer
.trailer (idx
, "outgoing_edge", res
, name
, r
);
1271 // If NAME isn't exported, check if it can be recomputed.
1272 else if (may_recompute_p (name
, e
))
1274 gimple
*def_stmt
= SSA_NAME_DEF_STMT (name
);
1276 if ((idx
= tracer
.header ("recomputation")))
1278 fprintf (dump_file
, " attempt on edge %d->%d for ",
1279 e
->src
->index
, e
->dest
->index
);
1280 print_gimple_stmt (dump_file
, def_stmt
, 0, TDF_SLIM
);
1282 // Simply calculate DEF_STMT on edge E using the range query Q.
1283 fold_range (r
, def_stmt
, e
, &q
);
1285 tracer
.trailer (idx
, "recomputation", true, name
, r
);
1292 // ------------------------------------------------------------------------
1293 // GORI iterator. Although we have bitmap iterators, don't expose that it
1294 // is currently a bitmap. Use an export iterator to hide future changes.
1296 // Construct a basic iterator over an export bitmap.
1298 gori_export_iterator::gori_export_iterator (bitmap b
)
1302 bmp_iter_set_init (&bi
, b
, 1, &y
);
1306 // Move to the next export bitmap spot.
1309 gori_export_iterator::next ()
1311 bmp_iter_next (&bi
, &y
);
1315 // Fetch the name of the next export in the export list. Return NULL if
1316 // iteration is done.
1319 gori_export_iterator::get_name ()
1324 while (bmp_iter_set (&bi
, &y
))
1326 tree t
= ssa_name (y
);