aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2021-05-11 11:05:10 +0200
committerRichard Biener <rguenther@suse.de>2021-05-11 12:52:34 +0200
commit2301a394607b88f8996efe864350c5f841000f76 (patch)
tree9c6a06b2b5944997ecb34bc5cc8a6eaacb4d5ead /gcc
parentca8e8301180fa71de1a76769fc038df2ab85dfeb (diff)
downloadgcc-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.c27
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;