aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-cfg.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2018-08-22 08:07:36 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2018-08-22 08:07:36 +0000
commit66c4f4d8c4399c499f1af5f550bf28878a8d69db (patch)
treeccf1184d6515c05526f1c1d696d6b0a13464e475 /gcc/tree-cfg.c
parent30379cbf93b793ecce02968a8db989e8c2b627b3 (diff)
downloadgcc-66c4f4d8c4399c499f1af5f550bf28878a8d69db.zip
gcc-66c4f4d8c4399c499f1af5f550bf28878a8d69db.tar.gz
gcc-66c4f4d8c4399c499f1af5f550bf28878a8d69db.tar.bz2
re PR tree-optimization/86945 (BUG with optimisation of select case statement in gfortran)
2018-08-22 Richard Biener <rguenther@suse.de> PR tree-optimization/86945 * tree-cfg.c (generate_range_test): Use unsigned arithmetic. * gcc.dg/torture/pr86945.c: New testcase. From-SVN: r263761
Diffstat (limited to 'gcc/tree-cfg.c')
-rw-r--r--gcc/tree-cfg.c18
1 files changed, 7 insertions, 11 deletions
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index 14d66b7..463dd8a 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -9131,20 +9131,16 @@ generate_range_test (basic_block bb, tree index, tree low, tree high,
tree type = TREE_TYPE (index);
tree utype = unsigned_type_for (type);
- low = fold_convert (type, low);
- high = fold_convert (type, high);
+ low = fold_convert (utype, low);
+ high = fold_convert (utype, high);
- tree tmp = make_ssa_name (type);
- gassign *sub1
- = gimple_build_assign (tmp, MINUS_EXPR, index, low);
+ gimple_seq seq = NULL;
+ index = gimple_convert (&seq, utype, index);
+ *lhs = gimple_build (&seq, MINUS_EXPR, utype, index, low);
+ *rhs = const_binop (MINUS_EXPR, utype, high, low);
- *lhs = make_ssa_name (utype);
- gassign *a = gimple_build_assign (*lhs, NOP_EXPR, tmp);
-
- *rhs = fold_build2 (MINUS_EXPR, utype, high, low);
gimple_stmt_iterator gsi = gsi_last_bb (bb);
- gsi_insert_before (&gsi, sub1, GSI_SAME_STMT);
- gsi_insert_before (&gsi, a, GSI_SAME_STMT);
+ gsi_insert_seq_before (&gsi, seq, GSI_SAME_STMT);
}
/* Emit return warnings. */