diff options
author | Richard Biener <rguenther@suse.de> | 2018-08-22 08:07:36 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2018-08-22 08:07:36 +0000 |
commit | 66c4f4d8c4399c499f1af5f550bf28878a8d69db (patch) | |
tree | ccf1184d6515c05526f1c1d696d6b0a13464e475 /gcc/tree-cfg.c | |
parent | 30379cbf93b793ecce02968a8db989e8c2b627b3 (diff) | |
download | gcc-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.c | 18 |
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. */ |