Skip to content

Commit 989f02d

Browse files
author
rsandifo
committed
Set the call nothrow flag more often
This patch sets the nothrow flag for various calls to internal functions that are not inherently NOTHROW (and so can't be declared that way in internal-fn.def) but that are used in contexts that can guarantee NOTHROWness. 2017-08-29 Richard Sandiford <[email protected]> gcc/ * gimplify.c (gimplify_call_expr): Copy the nothrow flag to calls to internal functions. (gimplify_modify_expr): Likewise. * tree-call-cdce.c (use_internal_fn): Likewise. * tree-ssa-math-opts.c (pass_cse_reciprocals::execute): Likewise. (convert_to_divmod): Set the nothrow flag. * tree-if-conv.c (predicate_mem_writes): Likewise. * tree-vect-stmts.c (vectorizable_mask_load_store): Likewise. (vectorizable_call): Likewise. (vectorizable_store): Likewise. (vectorizable_load): Likewise. * tree-vect-patterns.c (vect_recog_pow_pattern): Likewise. (vect_recog_mask_conversion_pattern): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@251401 138bc75d-0d04-0410-961f-82ee72b054a4
1 parent 9810238 commit 989f02d

File tree

7 files changed

+79
-29
lines changed

7 files changed

+79
-29
lines changed

gcc/ChangeLog

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,19 @@
1+
2017-08-29 Richard Sandiford <[email protected]>
2+
3+
* gimplify.c (gimplify_call_expr): Copy the nothrow flag to
4+
calls to internal functions.
5+
(gimplify_modify_expr): Likewise.
6+
* tree-call-cdce.c (use_internal_fn): Likewise.
7+
* tree-ssa-math-opts.c (pass_cse_reciprocals::execute): Likewise.
8+
(convert_to_divmod): Set the nothrow flag.
9+
* tree-if-conv.c (predicate_mem_writes): Likewise.
10+
* tree-vect-stmts.c (vectorizable_mask_load_store): Likewise.
11+
(vectorizable_call): Likewise.
12+
(vectorizable_store): Likewise.
13+
(vectorizable_load): Likewise.
14+
* tree-vect-patterns.c (vect_recog_pow_pattern): Likewise.
15+
(vect_recog_mask_conversion_pattern): Likewise.
16+
117
2017-08-29 Martin Liska <[email protected]>
218

319
PR other/39851

gcc/gimplify.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3150,7 +3150,8 @@ gimplify_call_expr (tree *expr_p, gimple_seq *pre_p, bool want_value)
31503150

31513151
if (EXPR_CILK_SPAWN (*expr_p))
31523152
gimplify_cilk_detach (pre_p);
3153-
gimple *call = gimple_build_call_internal_vec (ifn, vargs);
3153+
gcall *call = gimple_build_call_internal_vec (ifn, vargs);
3154+
gimple_call_set_nothrow (call, TREE_NOTHROW (*expr_p));
31543155
gimplify_seq_add_stmt (pre_p, call);
31553156
return GS_ALL_DONE;
31563157
}
@@ -5636,6 +5637,7 @@ gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
56365637
vargs.quick_push (CALL_EXPR_ARG (*from_p, i));
56375638
}
56385639
call_stmt = gimple_build_call_internal_vec (ifn, vargs);
5640+
gimple_call_set_nothrow (call_stmt, TREE_NOTHROW (*from_p));
56395641
gimple_set_location (call_stmt, EXPR_LOCATION (*expr_p));
56405642
}
56415643
else

gcc/tree-call-cdce.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,6 +1019,7 @@ use_internal_fn (gcall *call)
10191019
args.safe_push (gimple_call_arg (call, i));
10201020
gcall *new_call = gimple_build_call_internal_vec (ifn, args);
10211021
gimple_set_location (new_call, gimple_location (call));
1022+
gimple_call_set_nothrow (new_call, gimple_call_nothrow_p (call));
10221023

10231024
/* Transfer the LHS to the new call. */
10241025
tree lhs = gimple_call_lhs (call);

gcc/tree-if-conv.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2219,7 +2219,7 @@ predicate_mem_writes (loop_p loop)
22192219
tree lhs = gimple_assign_lhs (stmt);
22202220
tree rhs = gimple_assign_rhs1 (stmt);
22212221
tree ref, addr, ptr, mask;
2222-
gimple *new_stmt;
2222+
gcall *new_stmt;
22232223
gimple_seq stmts = NULL;
22242224
int bitsize = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (lhs)));
22252225
ref = TREE_CODE (lhs) == SSA_NAME ? rhs : lhs;
@@ -2281,6 +2281,7 @@ predicate_mem_writes (loop_p loop)
22812281
gimple_set_vdef (new_stmt, gimple_vdef (stmt));
22822282
SSA_NAME_DEF_STMT (gimple_vdef (new_stmt)) = new_stmt;
22832283
}
2284+
gimple_call_set_nothrow (new_stmt, true);
22842285

22852286
gsi_replace (&gsi, new_stmt, true);
22862287
}

gcc/tree-ssa-math-opts.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,8 @@ pass_cse_reciprocals::execute (function *fun)
690690
gimple_set_vdef (stmt2, gimple_vdef (call));
691691
SSA_NAME_DEF_STMT (gimple_vdef (stmt2)) = stmt2;
692692
}
693+
gimple_call_set_nothrow (stmt2,
694+
gimple_call_nothrow_p (call));
693695
gimple_set_vuse (stmt2, gimple_vuse (call));
694696
gimple_stmt_iterator gsi2 = gsi_for_stmt (call);
695697
gsi_replace (&gsi2, stmt2, true);
@@ -4100,6 +4102,8 @@ convert_to_divmod (gassign *stmt)
41004102
tree res = make_temp_ssa_name (build_complex_type (TREE_TYPE (op1)),
41014103
call_stmt, "divmod_tmp");
41024104
gimple_call_set_lhs (call_stmt, res);
4105+
/* We rejected throwing statements above. */
4106+
gimple_call_set_nothrow (call_stmt, true);
41034107

41044108
/* Insert the call before top_stmt. */
41054109
gimple_stmt_iterator top_stmt_gsi = gsi_for_stmt (top_stmt);

gcc/tree-vect-patterns.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1085,6 +1085,7 @@ vect_recog_pow_pattern (vec<gimple *> *stmts, tree *type_in,
10851085
gcall *stmt = gimple_build_call_internal (IFN_SQRT, 1, base);
10861086
var = vect_recog_temp_ssa_var (TREE_TYPE (base), stmt);
10871087
gimple_call_set_lhs (stmt, var);
1088+
gimple_call_set_nothrow (stmt, true);
10881089
return stmt;
10891090
}
10901091
}
@@ -3867,14 +3868,14 @@ vect_recog_mask_conversion_pattern (vec<gimple *> *stmts, tree *type_in,
38673868
stmt_vec_info stmt_vinfo = vinfo_for_stmt (last_stmt);
38683869
stmt_vec_info pattern_stmt_info;
38693870
vec_info *vinfo = stmt_vinfo->vinfo;
3870-
gimple *pattern_stmt;
38713871

38723872
/* Check for MASK_LOAD ans MASK_STORE calls requiring mask conversion. */
38733873
if (is_gimple_call (last_stmt)
38743874
&& gimple_call_internal_p (last_stmt)
38753875
&& (gimple_call_internal_fn (last_stmt) == IFN_MASK_STORE
38763876
|| gimple_call_internal_fn (last_stmt) == IFN_MASK_LOAD))
38773877
{
3878+
gcall *pattern_stmt;
38783879
bool load = (gimple_call_internal_fn (last_stmt) == IFN_MASK_LOAD);
38793880

38803881
if (load)
@@ -3918,6 +3919,7 @@ vect_recog_mask_conversion_pattern (vec<gimple *> *stmts, tree *type_in,
39183919
tmp,
39193920
gimple_call_arg (last_stmt, 3));
39203921

3922+
gimple_call_set_nothrow (pattern_stmt, true);
39213923

39223924
pattern_stmt_info = new_stmt_vec_info (pattern_stmt, vinfo);
39233925
set_vinfo_for_stmt (pattern_stmt, pattern_stmt_info);
@@ -3940,6 +3942,7 @@ vect_recog_mask_conversion_pattern (vec<gimple *> *stmts, tree *type_in,
39403942
if (!is_gimple_assign (last_stmt))
39413943
return NULL;
39423944

3945+
gimple *pattern_stmt;
39433946
lhs = gimple_assign_lhs (last_stmt);
39443947
rhs1 = gimple_assign_rhs1 (last_stmt);
39453948
rhs_code = gimple_assign_rhs_code (last_stmt);

gcc/tree-vect-stmts.c

Lines changed: 49 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2364,9 +2364,11 @@ vectorizable_mask_load_store (gimple *stmt, gimple_stmt_iterator *gsi,
23642364
misalign);
23652365
tree ptr = build_int_cst (TREE_TYPE (gimple_call_arg (stmt, 1)),
23662366
misalign ? least_bit_hwi (misalign) : align);
2367-
new_stmt
2367+
gcall *call
23682368
= gimple_build_call_internal (IFN_MASK_STORE, 4, dataref_ptr,
23692369
ptr, vec_mask, vec_rhs);
2370+
gimple_call_set_nothrow (call, true);
2371+
new_stmt = call;
23702372
vect_finish_stmt_generation (stmt, new_stmt, gsi);
23712373
if (i == 0)
23722374
STMT_VINFO_VEC_STMT (stmt_info) = *vec_stmt = new_stmt;
@@ -2414,16 +2416,17 @@ vectorizable_mask_load_store (gimple *stmt, gimple_stmt_iterator *gsi,
24142416
misalign);
24152417
tree ptr = build_int_cst (TREE_TYPE (gimple_call_arg (stmt, 1)),
24162418
misalign ? least_bit_hwi (misalign) : align);
2417-
new_stmt
2419+
gcall *call
24182420
= gimple_build_call_internal (IFN_MASK_LOAD, 3, dataref_ptr,
24192421
ptr, vec_mask);
2420-
gimple_call_set_lhs (new_stmt, make_ssa_name (vec_dest));
2421-
vect_finish_stmt_generation (stmt, new_stmt, gsi);
2422+
gimple_call_set_lhs (call, make_ssa_name (vec_dest));
2423+
gimple_call_set_nothrow (call, true);
2424+
vect_finish_stmt_generation (stmt, call, gsi);
24222425
if (i == 0)
2423-
STMT_VINFO_VEC_STMT (stmt_info) = *vec_stmt = new_stmt;
2426+
STMT_VINFO_VEC_STMT (stmt_info) = *vec_stmt = call;
24242427
else
2425-
STMT_VINFO_RELATED_STMT (prev_stmt_info) = new_stmt;
2426-
prev_stmt_info = vinfo_for_stmt (new_stmt);
2428+
STMT_VINFO_RELATED_STMT (prev_stmt_info) = call;
2429+
prev_stmt_info = vinfo_for_stmt (call);
24272430
}
24282431
}
24292432

@@ -2867,8 +2870,11 @@ vectorizable_call (gimple *gs, gimple_stmt_iterator *gsi, gimple **vec_stmt,
28672870
if (modifier == NARROW)
28682871
{
28692872
tree half_res = make_ssa_name (vectype_in);
2870-
new_stmt = gimple_build_call_internal_vec (ifn, vargs);
2871-
gimple_call_set_lhs (new_stmt, half_res);
2873+
gcall *call
2874+
= gimple_build_call_internal_vec (ifn, vargs);
2875+
gimple_call_set_lhs (call, half_res);
2876+
gimple_call_set_nothrow (call, true);
2877+
new_stmt = call;
28722878
vect_finish_stmt_generation (stmt, new_stmt, gsi);
28732879
if ((i & 1) == 0)
28742880
{
@@ -2881,12 +2887,15 @@ vectorizable_call (gimple *gs, gimple_stmt_iterator *gsi, gimple **vec_stmt,
28812887
}
28822888
else
28832889
{
2890+
gcall *call;
28842891
if (ifn != IFN_LAST)
2885-
new_stmt = gimple_build_call_internal_vec (ifn, vargs);
2892+
call = gimple_build_call_internal_vec (ifn, vargs);
28862893
else
2887-
new_stmt = gimple_build_call_vec (fndecl, vargs);
2888-
new_temp = make_ssa_name (vec_dest, new_stmt);
2889-
gimple_call_set_lhs (new_stmt, new_temp);
2894+
call = gimple_build_call_vec (fndecl, vargs);
2895+
new_temp = make_ssa_name (vec_dest, call);
2896+
gimple_call_set_lhs (call, new_temp);
2897+
gimple_call_set_nothrow (call, true);
2898+
new_stmt = call;
28902899
}
28912900
vect_finish_stmt_generation (stmt, new_stmt, gsi);
28922901
SLP_TREE_VEC_STMTS (slp_node).quick_push (new_stmt);
@@ -2934,8 +2943,10 @@ vectorizable_call (gimple *gs, gimple_stmt_iterator *gsi, gimple **vec_stmt,
29342943
else if (modifier == NARROW)
29352944
{
29362945
tree half_res = make_ssa_name (vectype_in);
2937-
new_stmt = gimple_build_call_internal_vec (ifn, vargs);
2938-
gimple_call_set_lhs (new_stmt, half_res);
2946+
gcall *call = gimple_build_call_internal_vec (ifn, vargs);
2947+
gimple_call_set_lhs (call, half_res);
2948+
gimple_call_set_nothrow (call, true);
2949+
new_stmt = call;
29392950
vect_finish_stmt_generation (stmt, new_stmt, gsi);
29402951
if ((j & 1) == 0)
29412952
{
@@ -2948,12 +2959,15 @@ vectorizable_call (gimple *gs, gimple_stmt_iterator *gsi, gimple **vec_stmt,
29482959
}
29492960
else
29502961
{
2962+
gcall *call;
29512963
if (ifn != IFN_LAST)
2952-
new_stmt = gimple_build_call_internal_vec (ifn, vargs);
2964+
call = gimple_build_call_internal_vec (ifn, vargs);
29532965
else
2954-
new_stmt = gimple_build_call_vec (fndecl, vargs);
2966+
call = gimple_build_call_vec (fndecl, vargs);
29552967
new_temp = make_ssa_name (vec_dest, new_stmt);
2956-
gimple_call_set_lhs (new_stmt, new_temp);
2968+
gimple_call_set_lhs (call, new_temp);
2969+
gimple_call_set_nothrow (call, true);
2970+
new_stmt = call;
29572971
}
29582972
vect_finish_stmt_generation (stmt, new_stmt, gsi);
29592973

@@ -2996,12 +3010,15 @@ vectorizable_call (gimple *gs, gimple_stmt_iterator *gsi, gimple **vec_stmt,
29963010
vargs.quick_push (vec_oprndsk[i]);
29973011
vargs.quick_push (vec_oprndsk[i + 1]);
29983012
}
3013+
gcall *call;
29993014
if (ifn != IFN_LAST)
3000-
new_stmt = gimple_build_call_internal_vec (ifn, vargs);
3015+
call = gimple_build_call_internal_vec (ifn, vargs);
30013016
else
3002-
new_stmt = gimple_build_call_vec (fndecl, vargs);
3003-
new_temp = make_ssa_name (vec_dest, new_stmt);
3004-
gimple_call_set_lhs (new_stmt, new_temp);
3017+
call = gimple_build_call_vec (fndecl, vargs);
3018+
new_temp = make_ssa_name (vec_dest, call);
3019+
gimple_call_set_lhs (call, new_temp);
3020+
gimple_call_set_nothrow (call, true);
3021+
new_stmt = call;
30053022
vect_finish_stmt_generation (stmt, new_stmt, gsi);
30063023
SLP_TREE_VEC_STMTS (slp_node).quick_push (new_stmt);
30073024
}
@@ -6356,8 +6373,11 @@ vectorizable_store (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt,
63566373
/* Emit:
63576374
MEM_REF[...all elements...] = STORE_LANES (VEC_ARRAY). */
63586375
data_ref = create_array_ref (aggr_type, dataref_ptr, ref_type);
6359-
new_stmt = gimple_build_call_internal (IFN_STORE_LANES, 1, vec_array);
6360-
gimple_call_set_lhs (new_stmt, data_ref);
6376+
gcall *call = gimple_build_call_internal (IFN_STORE_LANES, 1,
6377+
vec_array);
6378+
gimple_call_set_lhs (call, data_ref);
6379+
gimple_call_set_nothrow (call, true);
6380+
new_stmt = call;
63616381
vect_finish_stmt_generation (stmt, new_stmt, gsi);
63626382
}
63636383
else
@@ -7448,8 +7468,11 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt,
74487468
/* Emit:
74497469
VEC_ARRAY = LOAD_LANES (MEM_REF[...all elements...]). */
74507470
data_ref = create_array_ref (aggr_type, dataref_ptr, ref_type);
7451-
new_stmt = gimple_build_call_internal (IFN_LOAD_LANES, 1, data_ref);
7452-
gimple_call_set_lhs (new_stmt, vec_array);
7471+
gcall *call = gimple_build_call_internal (IFN_LOAD_LANES, 1,
7472+
data_ref);
7473+
gimple_call_set_lhs (call, vec_array);
7474+
gimple_call_set_nothrow (call, true);
7475+
new_stmt = call;
74537476
vect_finish_stmt_generation (stmt, new_stmt, gsi);
74547477

74557478
/* Extract each vector into an SSA_NAME. */

0 commit comments

Comments
 (0)