Martin's alloca work flagged this code as problematical. Essentially if
we had a statement with no operands and the statement was not in the
hash table, then we could end up performing alloca (0), which is
We can safely just avoid the whole block of code if there are no
operands. Bootstrapped and regression tested on x86_64-linux-gnu.
Installed on the trunk.
Author: law <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Fri Dec 2 06:40:57 2016 +0000
(record_temporary_equivalences_from_stmts_at_dest): Avoid temporary
propagation of operands if there are no operands.
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c3170c0..75881ee 100644
@@ -1,3 +1,9 @@
+2016-12-01 Jeff Law <l...@redhat.com>
+ * tree-ssa-threadedge.c
+ (record_temporary_equivalences_from_stmts_at_dest): Avoid temporary
+ propagation of operands if there are no operands.
2016-12-02 Jakub Jelinek <ja...@redhat.com>
diff --git a/gcc/tree-ssa-threadedge.c b/gcc/tree-ssa-threadedge.c
index 534292c..3fdd59e 100644
@@ -328,9 +328,10 @@ record_temporary_equivalences_from_stmts_at_dest (edge e,
SSA_NAME_VALUE in addition to its own lattice. */
cached_lhs = gimple_fold_stmt_to_constant_1 (stmt,
- if (!cached_lhs
- || (TREE_CODE (cached_lhs) != SSA_NAME
- && !is_gimple_min_invariant (cached_lhs)))
+ if (NUM_SSA_OPERANDS (stmt, SSA_OP_ALL_USES) != 0
+ && (!cached_lhs
+ || (TREE_CODE (cached_lhs) != SSA_NAME
+ && !is_gimple_min_invariant (cached_lhs))))
/* We're going to temporarily copy propagate the operands
and see if that allows us to simplify this statement. */