* tree-ssa-dse.c (compute_trims): Avoid folding away undefined
[official-gcc.git] / gcc / tree-ssa-dse.c
blob016aa6cc97c7b5131bbb4c6682a9eb2d0e3beff5
1 /* Dead store elimination
2 Copyright (C) 2004-2018 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "backend.h"
24 #include "rtl.h"
25 #include "tree.h"
26 #include "gimple.h"
27 #include "tree-pass.h"
28 #include "ssa.h"
29 #include "gimple-pretty-print.h"
30 #include "fold-const.h"
31 #include "gimple-iterator.h"
32 #include "tree-cfg.h"
33 #include "tree-dfa.h"
34 #include "domwalk.h"
35 #include "tree-cfgcleanup.h"
36 #include "params.h"
37 #include "alias.h"
38 #include "tree-ssa-loop.h"
40 /* This file implements dead store elimination.
42 A dead store is a store into a memory location which will later be
43 overwritten by another store without any intervening loads. In this
44 case the earlier store can be deleted.
46 In our SSA + virtual operand world we use immediate uses of virtual
47 operands to detect dead stores. If a store's virtual definition
48 is used precisely once by a later store to the same location which
49 post dominates the first store, then the first store is dead.
51 The single use of the store's virtual definition ensures that
52 there are no intervening aliased loads and the requirement that
53 the second load post dominate the first ensures that if the earlier
54 store executes, then the later stores will execute before the function
55 exits.
57 It may help to think of this as first moving the earlier store to
58 the point immediately before the later store. Again, the single
59 use of the virtual definition and the post-dominance relationship
60 ensure that such movement would be safe. Clearly if there are
61 back to back stores, then the second is redundant.
63 Reviewing section 10.7.2 in Morgan's "Building an Optimizing Compiler"
64 may also help in understanding this code since it discusses the
65 relationship between dead store and redundant load elimination. In
66 fact, they are the same transformation applied to different views of
67 the CFG. */
70 /* Bitmap of blocks that have had EH statements cleaned. We should
71 remove their dead edges eventually. */
72 static bitmap need_eh_cleanup;
74 /* Return value from dse_classify_store */
75 enum dse_store_status
77 DSE_STORE_LIVE,
78 DSE_STORE_MAYBE_PARTIAL_DEAD,
79 DSE_STORE_DEAD
82 /* STMT is a statement that may write into memory. Analyze it and
83 initialize WRITE to describe how STMT affects memory.
85 Return TRUE if the the statement was analyzed, FALSE otherwise.
87 It is always safe to return FALSE. But typically better optimziation
88 can be achieved by analyzing more statements. */
90 static bool
91 initialize_ao_ref_for_dse (gimple *stmt, ao_ref *write)
93 /* It's advantageous to handle certain mem* functions. */
94 if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
96 switch (DECL_FUNCTION_CODE (gimple_call_fndecl (stmt)))
98 case BUILT_IN_MEMCPY:
99 case BUILT_IN_MEMMOVE:
100 case BUILT_IN_MEMSET:
102 tree size = NULL_TREE;
103 if (gimple_call_num_args (stmt) == 3)
104 size = gimple_call_arg (stmt, 2);
105 tree ptr = gimple_call_arg (stmt, 0);
106 ao_ref_init_from_ptr_and_size (write, ptr, size);
107 return true;
109 default:
110 break;
113 else if (is_gimple_assign (stmt))
115 ao_ref_init (write, gimple_assign_lhs (stmt));
116 return true;
118 return false;
121 /* Given REF from the the alias oracle, return TRUE if it is a valid
122 memory reference for dead store elimination, false otherwise.
124 In particular, the reference must have a known base, known maximum
125 size, start at a byte offset and have a size that is one or more
126 bytes. */
128 static bool
129 valid_ao_ref_for_dse (ao_ref *ref)
131 return (ao_ref_base (ref)
132 && known_size_p (ref->max_size)
133 && maybe_ne (ref->size, 0)
134 && known_eq (ref->max_size, ref->size)
135 && known_ge (ref->offset, 0)
136 && multiple_p (ref->offset, BITS_PER_UNIT)
137 && multiple_p (ref->size, BITS_PER_UNIT));
140 /* Try to normalize COPY (an ao_ref) relative to REF. Essentially when we are
141 done COPY will only refer bytes found within REF. Return true if COPY
142 is known to intersect at least one byte of REF. */
144 static bool
145 normalize_ref (ao_ref *copy, ao_ref *ref)
147 if (!ordered_p (copy->offset, ref->offset))
148 return false;
150 /* If COPY starts before REF, then reset the beginning of
151 COPY to match REF and decrease the size of COPY by the
152 number of bytes removed from COPY. */
153 if (maybe_lt (copy->offset, ref->offset))
155 poly_int64 diff = ref->offset - copy->offset;
156 if (maybe_le (copy->size, diff))
157 return false;
158 copy->size -= diff;
159 copy->offset = ref->offset;
162 poly_int64 diff = copy->offset - ref->offset;
163 if (maybe_le (ref->size, diff))
164 return false;
166 /* If COPY extends beyond REF, chop off its size appropriately. */
167 poly_int64 limit = ref->size - diff;
168 if (!ordered_p (limit, copy->size))
169 return false;
171 if (maybe_gt (copy->size, limit))
172 copy->size = limit;
173 return true;
176 /* Clear any bytes written by STMT from the bitmap LIVE_BYTES. The base
177 address written by STMT must match the one found in REF, which must
178 have its base address previously initialized.
180 This routine must be conservative. If we don't know the offset or
181 actual size written, assume nothing was written. */
183 static void
184 clear_bytes_written_by (sbitmap live_bytes, gimple *stmt, ao_ref *ref)
186 ao_ref write;
187 if (!initialize_ao_ref_for_dse (stmt, &write))
188 return;
190 /* Verify we have the same base memory address, the write
191 has a known size and overlaps with REF. */
192 HOST_WIDE_INT start, size;
193 if (valid_ao_ref_for_dse (&write)
194 && operand_equal_p (write.base, ref->base, OEP_ADDRESS_OF)
195 && known_eq (write.size, write.max_size)
196 && normalize_ref (&write, ref)
197 && (write.offset - ref->offset).is_constant (&start)
198 && write.size.is_constant (&size))
199 bitmap_clear_range (live_bytes, start / BITS_PER_UNIT,
200 size / BITS_PER_UNIT);
203 /* REF is a memory write. Extract relevant information from it and
204 initialize the LIVE_BYTES bitmap. If successful, return TRUE.
205 Otherwise return FALSE. */
207 static bool
208 setup_live_bytes_from_ref (ao_ref *ref, sbitmap live_bytes)
210 HOST_WIDE_INT const_size;
211 if (valid_ao_ref_for_dse (ref)
212 && ref->size.is_constant (&const_size)
213 && (const_size / BITS_PER_UNIT
214 <= PARAM_VALUE (PARAM_DSE_MAX_OBJECT_SIZE)))
216 bitmap_clear (live_bytes);
217 bitmap_set_range (live_bytes, 0, const_size / BITS_PER_UNIT);
218 return true;
220 return false;
223 /* Compute the number of elements that we can trim from the head and
224 tail of ORIG resulting in a bitmap that is a superset of LIVE.
226 Store the number of elements trimmed from the head and tail in
227 TRIM_HEAD and TRIM_TAIL.
229 STMT is the statement being trimmed and is used for debugging dump
230 output only. */
232 static void
233 compute_trims (ao_ref *ref, sbitmap live, int *trim_head, int *trim_tail,
234 gimple *stmt)
236 /* We use sbitmaps biased such that ref->offset is bit zero and the bitmap
237 extends through ref->size. So we know that in the original bitmap
238 bits 0..ref->size were true. We don't actually need the bitmap, just
239 the REF to compute the trims. */
241 /* Now identify how much, if any of the tail we can chop off. */
242 HOST_WIDE_INT const_size;
243 int last_live = bitmap_last_set_bit (live);
244 if (ref->size.is_constant (&const_size))
246 int last_orig = (const_size / BITS_PER_UNIT) - 1;
247 /* We can leave inconvenient amounts on the tail as
248 residual handling in mem* and str* functions is usually
249 reasonably efficient. */
250 *trim_tail = last_orig - last_live;
252 /* But don't trim away out of bounds accesses, as this defeats
253 proper warnings. */
254 if (*trim_tail
255 && compare_tree_int (TYPE_SIZE_UNIT (TREE_TYPE (ref->base)),
256 last_orig) <= 0)
257 *trim_tail = 0;
259 else
260 *trim_tail = 0;
262 /* Identify how much, if any of the head we can chop off. */
263 int first_orig = 0;
264 int first_live = bitmap_first_set_bit (live);
265 *trim_head = first_live - first_orig;
267 /* If more than a word remains, then make sure to keep the
268 starting point at least word aligned. */
269 if (last_live - first_live > UNITS_PER_WORD)
270 *trim_head &= ~(UNITS_PER_WORD - 1);
272 if ((*trim_head || *trim_tail)
273 && dump_file && (dump_flags & TDF_DETAILS))
275 fprintf (dump_file, " Trimming statement (head = %d, tail = %d): ",
276 *trim_head, *trim_tail);
277 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
278 fprintf (dump_file, "\n");
282 /* STMT initializes an object from COMPLEX_CST where one or more of the
283 bytes written may be dead stores. REF is a representation of the
284 memory written. LIVE is the bitmap of stores that are actually live.
286 Attempt to rewrite STMT so that only the real or imaginary part of
287 the object is actually stored. */
289 static void
290 maybe_trim_complex_store (ao_ref *ref, sbitmap live, gimple *stmt)
292 int trim_head, trim_tail;
293 compute_trims (ref, live, &trim_head, &trim_tail, stmt);
295 /* The amount of data trimmed from the head or tail must be at
296 least half the size of the object to ensure we're trimming
297 the entire real or imaginary half. By writing things this
298 way we avoid more O(n) bitmap operations. */
299 if (known_ge (trim_tail * 2 * BITS_PER_UNIT, ref->size))
301 /* TREE_REALPART is live */
302 tree x = TREE_REALPART (gimple_assign_rhs1 (stmt));
303 tree y = gimple_assign_lhs (stmt);
304 y = build1 (REALPART_EXPR, TREE_TYPE (x), y);
305 gimple_assign_set_lhs (stmt, y);
306 gimple_assign_set_rhs1 (stmt, x);
308 else if (known_ge (trim_head * 2 * BITS_PER_UNIT, ref->size))
310 /* TREE_IMAGPART is live */
311 tree x = TREE_IMAGPART (gimple_assign_rhs1 (stmt));
312 tree y = gimple_assign_lhs (stmt);
313 y = build1 (IMAGPART_EXPR, TREE_TYPE (x), y);
314 gimple_assign_set_lhs (stmt, y);
315 gimple_assign_set_rhs1 (stmt, x);
318 /* Other cases indicate parts of both the real and imag subobjects
319 are live. We do not try to optimize those cases. */
322 /* STMT initializes an object using a CONSTRUCTOR where one or more of the
323 bytes written are dead stores. ORIG is the bitmap of bytes stored by
324 STMT. LIVE is the bitmap of stores that are actually live.
326 Attempt to rewrite STMT so that only the real or imaginary part of
327 the object is actually stored.
329 The most common case for getting here is a CONSTRUCTOR with no elements
330 being used to zero initialize an object. We do not try to handle other
331 cases as those would force us to fully cover the object with the
332 CONSTRUCTOR node except for the components that are dead. */
334 static void
335 maybe_trim_constructor_store (ao_ref *ref, sbitmap live, gimple *stmt)
337 tree ctor = gimple_assign_rhs1 (stmt);
339 /* This is the only case we currently handle. It actually seems to
340 catch most cases of actual interest. */
341 gcc_assert (CONSTRUCTOR_NELTS (ctor) == 0);
343 int head_trim = 0;
344 int tail_trim = 0;
345 compute_trims (ref, live, &head_trim, &tail_trim, stmt);
347 /* Now we want to replace the constructor initializer
348 with memset (object + head_trim, 0, size - head_trim - tail_trim). */
349 if (head_trim || tail_trim)
351 /* We want &lhs for the MEM_REF expression. */
352 tree lhs_addr = build_fold_addr_expr (gimple_assign_lhs (stmt));
354 if (! is_gimple_min_invariant (lhs_addr))
355 return;
357 /* The number of bytes for the new constructor. */
358 poly_int64 ref_bytes = exact_div (ref->size, BITS_PER_UNIT);
359 poly_int64 count = ref_bytes - head_trim - tail_trim;
361 /* And the new type for the CONSTRUCTOR. Essentially it's just
362 a char array large enough to cover the non-trimmed parts of
363 the original CONSTRUCTOR. Note we want explicit bounds here
364 so that we know how many bytes to clear when expanding the
365 CONSTRUCTOR. */
366 tree type = build_array_type_nelts (char_type_node, count);
368 /* Build a suitable alias type rather than using alias set zero
369 to avoid pessimizing. */
370 tree alias_type = reference_alias_ptr_type (gimple_assign_lhs (stmt));
372 /* Build a MEM_REF representing the whole accessed area, starting
373 at the first byte not trimmed. */
374 tree exp = fold_build2 (MEM_REF, type, lhs_addr,
375 build_int_cst (alias_type, head_trim));
377 /* Now update STMT with a new RHS and LHS. */
378 gimple_assign_set_lhs (stmt, exp);
379 gimple_assign_set_rhs1 (stmt, build_constructor (type, NULL));
383 /* STMT is a memcpy, memmove or memset. Decrement the number of bytes
384 copied/set by DECREMENT. */
385 static void
386 decrement_count (gimple *stmt, int decrement)
388 tree *countp = gimple_call_arg_ptr (stmt, 2);
389 gcc_assert (TREE_CODE (*countp) == INTEGER_CST);
390 *countp = wide_int_to_tree (TREE_TYPE (*countp), (TREE_INT_CST_LOW (*countp)
391 - decrement));
395 static void
396 increment_start_addr (gimple *stmt, tree *where, int increment)
398 if (TREE_CODE (*where) == SSA_NAME)
400 tree tem = make_ssa_name (TREE_TYPE (*where));
401 gassign *newop
402 = gimple_build_assign (tem, POINTER_PLUS_EXPR, *where,
403 build_int_cst (sizetype, increment));
404 gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
405 gsi_insert_before (&gsi, newop, GSI_SAME_STMT);
406 *where = tem;
407 update_stmt (gsi_stmt (gsi));
408 return;
411 *where = build_fold_addr_expr (fold_build2 (MEM_REF, char_type_node,
412 *where,
413 build_int_cst (ptr_type_node,
414 increment)));
417 /* STMT is builtin call that writes bytes in bitmap ORIG, some bytes are dead
418 (ORIG & ~NEW) and need not be stored. Try to rewrite STMT to reduce
419 the amount of data it actually writes.
421 Right now we only support trimming from the head or the tail of the
422 memory region. In theory we could split the mem* call, but it's
423 likely of marginal value. */
425 static void
426 maybe_trim_memstar_call (ao_ref *ref, sbitmap live, gimple *stmt)
428 switch (DECL_FUNCTION_CODE (gimple_call_fndecl (stmt)))
430 case BUILT_IN_MEMCPY:
431 case BUILT_IN_MEMMOVE:
433 int head_trim, tail_trim;
434 compute_trims (ref, live, &head_trim, &tail_trim, stmt);
436 /* Tail trimming is easy, we can just reduce the count. */
437 if (tail_trim)
438 decrement_count (stmt, tail_trim);
440 /* Head trimming requires adjusting all the arguments. */
441 if (head_trim)
443 tree *dst = gimple_call_arg_ptr (stmt, 0);
444 increment_start_addr (stmt, dst, head_trim);
445 tree *src = gimple_call_arg_ptr (stmt, 1);
446 increment_start_addr (stmt, src, head_trim);
447 decrement_count (stmt, head_trim);
449 break;
452 case BUILT_IN_MEMSET:
454 int head_trim, tail_trim;
455 compute_trims (ref, live, &head_trim, &tail_trim, stmt);
457 /* Tail trimming is easy, we can just reduce the count. */
458 if (tail_trim)
459 decrement_count (stmt, tail_trim);
461 /* Head trimming requires adjusting all the arguments. */
462 if (head_trim)
464 tree *dst = gimple_call_arg_ptr (stmt, 0);
465 increment_start_addr (stmt, dst, head_trim);
466 decrement_count (stmt, head_trim);
468 break;
471 default:
472 break;
476 /* STMT is a memory write where one or more bytes written are dead
477 stores. ORIG is the bitmap of bytes stored by STMT. LIVE is the
478 bitmap of stores that are actually live.
480 Attempt to rewrite STMT so that it writes fewer memory locations. Right
481 now we only support trimming at the start or end of the memory region.
482 It's not clear how much there is to be gained by trimming from the middle
483 of the region. */
485 static void
486 maybe_trim_partially_dead_store (ao_ref *ref, sbitmap live, gimple *stmt)
488 if (is_gimple_assign (stmt)
489 && TREE_CODE (gimple_assign_lhs (stmt)) != TARGET_MEM_REF)
491 switch (gimple_assign_rhs_code (stmt))
493 case CONSTRUCTOR:
494 maybe_trim_constructor_store (ref, live, stmt);
495 break;
496 case COMPLEX_CST:
497 maybe_trim_complex_store (ref, live, stmt);
498 break;
499 default:
500 break;
505 /* Return TRUE if USE_REF reads bytes from LIVE where live is
506 derived from REF, a write reference.
508 While this routine may modify USE_REF, it's passed by value, not
509 location. So callers do not see those modifications. */
511 static bool
512 live_bytes_read (ao_ref use_ref, ao_ref *ref, sbitmap live)
514 /* We have already verified that USE_REF and REF hit the same object.
515 Now verify that there's actually an overlap between USE_REF and REF. */
516 HOST_WIDE_INT start, size;
517 if (normalize_ref (&use_ref, ref)
518 && (use_ref.offset - ref->offset).is_constant (&start)
519 && use_ref.size.is_constant (&size))
521 /* If USE_REF covers all of REF, then it will hit one or more
522 live bytes. This avoids useless iteration over the bitmap
523 below. */
524 if (start == 0 && known_eq (size, ref->size))
525 return true;
527 /* Now check if any of the remaining bits in use_ref are set in LIVE. */
528 return bitmap_bit_in_range_p (live, start / BITS_PER_UNIT,
529 (start + size - 1) / BITS_PER_UNIT);
531 return true;
534 /* Callback for dse_classify_store calling for_each_index. Verify that
535 indices are invariant in the loop with backedge PHI in basic-block DATA. */
537 static bool
538 check_name (tree, tree *idx, void *data)
540 basic_block phi_bb = (basic_block) data;
541 if (TREE_CODE (*idx) == SSA_NAME
542 && !SSA_NAME_IS_DEFAULT_DEF (*idx)
543 && dominated_by_p (CDI_DOMINATORS, gimple_bb (SSA_NAME_DEF_STMT (*idx)),
544 phi_bb))
545 return false;
546 return true;
549 /* A helper of dse_optimize_stmt.
550 Given a GIMPLE_ASSIGN in STMT that writes to REF, classify it
551 according to downstream uses and defs. Sets *BY_CLOBBER_P to true
552 if only clobber statements influenced the classification result.
553 Returns the classification. */
555 static dse_store_status
556 dse_classify_store (ao_ref *ref, gimple *stmt,
557 bool byte_tracking_enabled, sbitmap live_bytes,
558 bool *by_clobber_p = NULL)
560 gimple *temp;
561 int cnt = 0;
562 auto_bitmap visited;
564 if (by_clobber_p)
565 *by_clobber_p = true;
567 /* Find the first dominated statement that clobbers (part of) the
568 memory stmt stores to with no intermediate statement that may use
569 part of the memory stmt stores. That is, find a store that may
570 prove stmt to be a dead store. */
571 temp = stmt;
574 gimple *use_stmt;
575 imm_use_iterator ui;
576 bool fail = false;
577 tree defvar;
579 if (gimple_code (temp) == GIMPLE_PHI)
581 /* If we visit this PHI by following a backedge then we have to
582 make sure ref->ref only refers to SSA names that are invariant
583 with respect to the loop represented by this PHI node. */
584 if (dominated_by_p (CDI_DOMINATORS, gimple_bb (stmt),
585 gimple_bb (temp))
586 && !for_each_index (ref->ref ? &ref->ref : &ref->base,
587 check_name, gimple_bb (temp)))
588 return DSE_STORE_LIVE;
589 defvar = PHI_RESULT (temp);
590 bitmap_set_bit (visited, SSA_NAME_VERSION (defvar));
592 else
593 defvar = gimple_vdef (temp);
594 auto_vec<gimple *, 10> defs;
595 gimple *phi_def = NULL;
596 FOR_EACH_IMM_USE_STMT (use_stmt, ui, defvar)
598 /* Limit stmt walking. */
599 if (++cnt > PARAM_VALUE (PARAM_DSE_MAX_ALIAS_QUERIES_PER_STORE))
601 fail = true;
602 BREAK_FROM_IMM_USE_STMT (ui);
605 /* We have visited ourselves already so ignore STMT for the
606 purpose of chaining. */
607 if (use_stmt == stmt)
609 /* In simple cases we can look through PHI nodes, but we
610 have to be careful with loops and with memory references
611 containing operands that are also operands of PHI nodes.
612 See gcc.c-torture/execute/20051110-*.c. */
613 else if (gimple_code (use_stmt) == GIMPLE_PHI)
615 /* If we already visited this PHI ignore it for further
616 processing. */
617 if (!bitmap_bit_p (visited,
618 SSA_NAME_VERSION (PHI_RESULT (use_stmt))))
620 defs.safe_push (use_stmt);
621 phi_def = use_stmt;
624 /* If the statement is a use the store is not dead. */
625 else if (ref_maybe_used_by_stmt_p (use_stmt, ref))
627 /* Handle common cases where we can easily build an ao_ref
628 structure for USE_STMT and in doing so we find that the
629 references hit non-live bytes and thus can be ignored. */
630 if (byte_tracking_enabled
631 && is_gimple_assign (use_stmt))
633 ao_ref use_ref;
634 ao_ref_init (&use_ref, gimple_assign_rhs1 (use_stmt));
635 if (valid_ao_ref_for_dse (&use_ref)
636 && use_ref.base == ref->base
637 && known_eq (use_ref.size, use_ref.max_size)
638 && !live_bytes_read (use_ref, ref, live_bytes))
640 /* If this is a store, remember it as we possibly
641 need to walk the defs uses. */
642 if (gimple_vdef (use_stmt))
643 defs.safe_push (use_stmt);
644 continue;
648 fail = true;
649 BREAK_FROM_IMM_USE_STMT (ui);
651 /* If this is a store, remember it as we possibly need to walk the
652 defs uses. */
653 else if (gimple_vdef (use_stmt))
654 defs.safe_push (use_stmt);
657 if (fail)
659 /* STMT might be partially dead and we may be able to reduce
660 how many memory locations it stores into. */
661 if (byte_tracking_enabled && !gimple_clobber_p (stmt))
662 return DSE_STORE_MAYBE_PARTIAL_DEAD;
663 return DSE_STORE_LIVE;
666 /* If we didn't find any definition this means the store is dead
667 if it isn't a store to global reachable memory. In this case
668 just pretend the stmt makes itself dead. Otherwise fail. */
669 if (defs.is_empty ())
671 if (ref_may_alias_global_p (ref))
672 return DSE_STORE_LIVE;
674 if (by_clobber_p)
675 *by_clobber_p = false;
676 return DSE_STORE_DEAD;
679 /* Process defs and remove those we need not process further. */
680 for (unsigned i = 0; i < defs.length ();)
682 gimple *def = defs[i];
683 gimple *use_stmt;
684 use_operand_p use_p;
685 /* If the path to check starts with a kill we do not need to
686 process it further.
687 ??? With byte tracking we need only kill the bytes currently
688 live. */
689 if (stmt_kills_ref_p (def, ref))
691 if (by_clobber_p && !gimple_clobber_p (def))
692 *by_clobber_p = false;
693 defs.unordered_remove (i);
695 /* In addition to kills we can remove defs whose only use
696 is another def in defs. That can only ever be PHIs of which
697 we track a single for simplicity reasons (we fail for multiple
698 PHIs anyways). We can also ignore defs that feed only into
699 already visited PHIs. */
700 else if (gimple_code (def) != GIMPLE_PHI
701 && single_imm_use (gimple_vdef (def), &use_p, &use_stmt)
702 && (use_stmt == phi_def
703 || (gimple_code (use_stmt) == GIMPLE_PHI
704 && bitmap_bit_p (visited,
705 SSA_NAME_VERSION
706 (PHI_RESULT (use_stmt))))))
707 defs.unordered_remove (i);
708 else
709 ++i;
712 /* If all defs kill the ref we are done. */
713 if (defs.is_empty ())
714 return DSE_STORE_DEAD;
715 /* If more than one def survives fail. */
716 if (defs.length () > 1)
718 /* STMT might be partially dead and we may be able to reduce
719 how many memory locations it stores into. */
720 if (byte_tracking_enabled && !gimple_clobber_p (stmt))
721 return DSE_STORE_MAYBE_PARTIAL_DEAD;
722 return DSE_STORE_LIVE;
724 temp = defs[0];
726 /* Track partial kills. */
727 if (byte_tracking_enabled)
729 clear_bytes_written_by (live_bytes, temp, ref);
730 if (bitmap_empty_p (live_bytes))
732 if (by_clobber_p && !gimple_clobber_p (temp))
733 *by_clobber_p = false;
734 return DSE_STORE_DEAD;
738 /* Continue walking until there are no more live bytes. */
739 while (1);
743 class dse_dom_walker : public dom_walker
745 public:
746 dse_dom_walker (cdi_direction direction)
747 : dom_walker (direction),
748 m_live_bytes (PARAM_VALUE (PARAM_DSE_MAX_OBJECT_SIZE)),
749 m_byte_tracking_enabled (false) {}
751 virtual edge before_dom_children (basic_block);
753 private:
754 auto_sbitmap m_live_bytes;
755 bool m_byte_tracking_enabled;
756 void dse_optimize_stmt (gimple_stmt_iterator *);
759 /* Delete a dead call at GSI, which is mem* call of some kind. */
760 static void
761 delete_dead_call (gimple_stmt_iterator *gsi)
763 gimple *stmt = gsi_stmt (*gsi);
764 if (dump_file && (dump_flags & TDF_DETAILS))
766 fprintf (dump_file, " Deleted dead call: ");
767 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
768 fprintf (dump_file, "\n");
771 tree lhs = gimple_call_lhs (stmt);
772 if (lhs)
774 tree ptr = gimple_call_arg (stmt, 0);
775 gimple *new_stmt = gimple_build_assign (lhs, ptr);
776 unlink_stmt_vdef (stmt);
777 if (gsi_replace (gsi, new_stmt, true))
778 bitmap_set_bit (need_eh_cleanup, gimple_bb (stmt)->index);
780 else
782 /* Then we need to fix the operand of the consuming stmt. */
783 unlink_stmt_vdef (stmt);
785 /* Remove the dead store. */
786 if (gsi_remove (gsi, true))
787 bitmap_set_bit (need_eh_cleanup, gimple_bb (stmt)->index);
788 release_defs (stmt);
792 /* Delete a dead store at GSI, which is a gimple assignment. */
794 static void
795 delete_dead_assignment (gimple_stmt_iterator *gsi)
797 gimple *stmt = gsi_stmt (*gsi);
798 if (dump_file && (dump_flags & TDF_DETAILS))
800 fprintf (dump_file, " Deleted dead store: ");
801 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
802 fprintf (dump_file, "\n");
805 /* Then we need to fix the operand of the consuming stmt. */
806 unlink_stmt_vdef (stmt);
808 /* Remove the dead store. */
809 basic_block bb = gimple_bb (stmt);
810 if (gsi_remove (gsi, true))
811 bitmap_set_bit (need_eh_cleanup, bb->index);
813 /* And release any SSA_NAMEs set in this statement back to the
814 SSA_NAME manager. */
815 release_defs (stmt);
818 /* Attempt to eliminate dead stores in the statement referenced by BSI.
820 A dead store is a store into a memory location which will later be
821 overwritten by another store without any intervening loads. In this
822 case the earlier store can be deleted.
824 In our SSA + virtual operand world we use immediate uses of virtual
825 operands to detect dead stores. If a store's virtual definition
826 is used precisely once by a later store to the same location which
827 post dominates the first store, then the first store is dead. */
829 void
830 dse_dom_walker::dse_optimize_stmt (gimple_stmt_iterator *gsi)
832 gimple *stmt = gsi_stmt (*gsi);
834 /* If this statement has no virtual defs, then there is nothing
835 to do. */
836 if (!gimple_vdef (stmt))
837 return;
839 /* Don't return early on *this_2(D) ={v} {CLOBBER}. */
840 if (gimple_has_volatile_ops (stmt)
841 && (!gimple_clobber_p (stmt)
842 || TREE_CODE (gimple_assign_lhs (stmt)) != MEM_REF))
843 return;
845 ao_ref ref;
846 if (!initialize_ao_ref_for_dse (stmt, &ref))
847 return;
849 /* We know we have virtual definitions. We can handle assignments and
850 some builtin calls. */
851 if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
853 switch (DECL_FUNCTION_CODE (gimple_call_fndecl (stmt)))
855 case BUILT_IN_MEMCPY:
856 case BUILT_IN_MEMMOVE:
857 case BUILT_IN_MEMSET:
859 /* Occasionally calls with an explicit length of zero
860 show up in the IL. It's pointless to do analysis
861 on them, they're trivially dead. */
862 tree size = gimple_call_arg (stmt, 2);
863 if (integer_zerop (size))
865 delete_dead_call (gsi);
866 return;
869 enum dse_store_status store_status;
870 m_byte_tracking_enabled
871 = setup_live_bytes_from_ref (&ref, m_live_bytes);
872 store_status = dse_classify_store (&ref, stmt,
873 m_byte_tracking_enabled,
874 m_live_bytes);
875 if (store_status == DSE_STORE_LIVE)
876 return;
878 if (store_status == DSE_STORE_MAYBE_PARTIAL_DEAD)
880 maybe_trim_memstar_call (&ref, m_live_bytes, stmt);
881 return;
884 if (store_status == DSE_STORE_DEAD)
885 delete_dead_call (gsi);
886 return;
889 default:
890 return;
894 if (is_gimple_assign (stmt))
896 bool by_clobber_p = false;
898 /* Self-assignments are zombies. */
899 if (operand_equal_p (gimple_assign_rhs1 (stmt),
900 gimple_assign_lhs (stmt), 0))
902 else
904 m_byte_tracking_enabled
905 = setup_live_bytes_from_ref (&ref, m_live_bytes);
906 enum dse_store_status store_status;
907 store_status = dse_classify_store (&ref, stmt,
908 m_byte_tracking_enabled,
909 m_live_bytes, &by_clobber_p);
910 if (store_status == DSE_STORE_LIVE)
911 return;
913 if (store_status == DSE_STORE_MAYBE_PARTIAL_DEAD)
915 maybe_trim_partially_dead_store (&ref, m_live_bytes, stmt);
916 return;
920 /* Now we know that use_stmt kills the LHS of stmt. */
922 /* But only remove *this_2(D) ={v} {CLOBBER} if killed by
923 another clobber stmt. */
924 if (gimple_clobber_p (stmt)
925 && !by_clobber_p)
926 return;
928 delete_dead_assignment (gsi);
932 edge
933 dse_dom_walker::before_dom_children (basic_block bb)
935 gimple_stmt_iterator gsi;
937 for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi);)
939 dse_optimize_stmt (&gsi);
940 if (gsi_end_p (gsi))
941 gsi = gsi_last_bb (bb);
942 else
943 gsi_prev (&gsi);
945 return NULL;
948 namespace {
950 const pass_data pass_data_dse =
952 GIMPLE_PASS, /* type */
953 "dse", /* name */
954 OPTGROUP_NONE, /* optinfo_flags */
955 TV_TREE_DSE, /* tv_id */
956 ( PROP_cfg | PROP_ssa ), /* properties_required */
957 0, /* properties_provided */
958 0, /* properties_destroyed */
959 0, /* todo_flags_start */
960 0, /* todo_flags_finish */
963 class pass_dse : public gimple_opt_pass
965 public:
966 pass_dse (gcc::context *ctxt)
967 : gimple_opt_pass (pass_data_dse, ctxt)
970 /* opt_pass methods: */
971 opt_pass * clone () { return new pass_dse (m_ctxt); }
972 virtual bool gate (function *) { return flag_tree_dse != 0; }
973 virtual unsigned int execute (function *);
975 }; // class pass_dse
977 unsigned int
978 pass_dse::execute (function *fun)
980 need_eh_cleanup = BITMAP_ALLOC (NULL);
982 renumber_gimple_stmt_uids ();
984 /* We might consider making this a property of each pass so that it
985 can be [re]computed on an as-needed basis. Particularly since
986 this pass could be seen as an extension of DCE which needs post
987 dominators. */
988 calculate_dominance_info (CDI_POST_DOMINATORS);
989 calculate_dominance_info (CDI_DOMINATORS);
991 /* Dead store elimination is fundamentally a walk of the post-dominator
992 tree and a backwards walk of statements within each block. */
993 dse_dom_walker (CDI_POST_DOMINATORS).walk (fun->cfg->x_exit_block_ptr);
995 /* Removal of stores may make some EH edges dead. Purge such edges from
996 the CFG as needed. */
997 if (!bitmap_empty_p (need_eh_cleanup))
999 gimple_purge_all_dead_eh_edges (need_eh_cleanup);
1000 cleanup_tree_cfg ();
1003 BITMAP_FREE (need_eh_cleanup);
1005 /* For now, just wipe the post-dominator information. */
1006 free_dominance_info (CDI_POST_DOMINATORS);
1007 return 0;
1010 } // anon namespace
1012 gimple_opt_pass *
1013 make_pass_dse (gcc::context *ctxt)
1015 return new pass_dse (ctxt);