diff options
author | Richard Biener <rguenther@suse.de> | 2021-05-11 11:05:10 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2021-05-11 12:52:34 +0200 |
commit | 2301a394607b88f8996efe864350c5f841000f76 (patch) | |
tree | 9c6a06b2b5944997ecb34bc5cc8a6eaacb4d5ead /gcc | |
parent | ca8e8301180fa71de1a76769fc038df2ab85dfeb (diff) | |
download | gcc-2301a394607b88f8996efe864350c5f841000f76.zip gcc-2301a394607b88f8996efe864350c5f841000f76.tar.gz gcc-2301a394607b88f8996efe864350c5f841000f76.tar.bz2 |
More maybe_fold_reference TLC
This adjusts maybe_fold_reference to adhere to its desired behavior
of performing constant folding and thus explicitely avoid returning
unfolded reference trees.
2021-05-11 Richard Biener <rguenther@suse.de>
* gimple-fold.c (maybe_fold_reference): Only return
is_gimple_min_invariant values.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/gimple-fold.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index 6beb4f3..74ec36e 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -311,27 +311,28 @@ get_symbol_constant_value (tree sym) static tree maybe_fold_reference (tree expr) { - tree result; + tree result = NULL_TREE; if ((TREE_CODE (expr) == VIEW_CONVERT_EXPR || TREE_CODE (expr) == REALPART_EXPR || TREE_CODE (expr) == IMAGPART_EXPR) && CONSTANT_CLASS_P (TREE_OPERAND (expr, 0))) - return fold_unary_loc (EXPR_LOCATION (expr), - TREE_CODE (expr), - TREE_TYPE (expr), - TREE_OPERAND (expr, 0)); - else if (TREE_CODE (expr) == BIT_FIELD_REF - && CONSTANT_CLASS_P (TREE_OPERAND (expr, 0))) - return fold_ternary_loc (EXPR_LOCATION (expr), + result = fold_unary_loc (EXPR_LOCATION (expr), TREE_CODE (expr), TREE_TYPE (expr), - TREE_OPERAND (expr, 0), - TREE_OPERAND (expr, 1), - TREE_OPERAND (expr, 2)); + TREE_OPERAND (expr, 0)); + else if (TREE_CODE (expr) == BIT_FIELD_REF + && CONSTANT_CLASS_P (TREE_OPERAND (expr, 0))) + result = fold_ternary_loc (EXPR_LOCATION (expr), + TREE_CODE (expr), + TREE_TYPE (expr), + TREE_OPERAND (expr, 0), + TREE_OPERAND (expr, 1), + TREE_OPERAND (expr, 2)); + else + result = fold_const_aggregate_ref (expr); - if ((result = fold_const_aggregate_ref (expr)) - && is_gimple_min_invariant (result)) + if (result && is_gimple_min_invariant (result)) return result; return NULL_TREE; |