diff options
author | Jakub Jelinek <jakub@redhat.com> | 2008-10-15 08:43:19 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2008-10-15 08:43:19 +0200 |
commit | f6e6e9904cd32cc78873a33f0a3839812b0d0f57 (patch) | |
tree | 29214d79594ce43e6efb4c36998eb8577cdb8070 /gcc/tree-switch-conversion.c | |
parent | e3bc2fa7e63a75f1a31057aa9c77451f1263488a (diff) | |
download | gcc-f6e6e9904cd32cc78873a33f0a3839812b0d0f57.tar.gz |
re PR tree-optimization/36881 (Creating runtime relocations for code which does not need it)
PR tree-optimization/36881
* tree-switch-conversion.c (check_final_bb): For flag_pic, check
that each value doesn't need runtime relocations, for !flag_pic
check that each value is just a valid initializer constant.
* gcc.dg/tree-ssa/pr36881.c: New test.
From-SVN: r141129
Diffstat (limited to 'gcc/tree-switch-conversion.c')
-rw-r--r-- | gcc/tree-switch-conversion.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/gcc/tree-switch-conversion.c b/gcc/tree-switch-conversion.c index e9757454f21..798cf161569 100644 --- a/gcc/tree-switch-conversion.c +++ b/gcc/tree-switch-conversion.c @@ -296,12 +296,29 @@ check_final_bb (void) { basic_block bb = gimple_phi_arg_edge (phi, i)->src; - if ((bb == info.switch_bb - || (single_pred_p (bb) && single_pred (bb) == info.switch_bb)) - && !is_gimple_ip_invariant (gimple_phi_arg_def (phi, i))) + if (bb == info.switch_bb + || (single_pred_p (bb) && single_pred (bb) == info.switch_bb)) { - info.reason = " Non-invariant value from a case\n"; - return false; /* Non-invariant argument. */ + tree reloc, val; + + val = gimple_phi_arg_def (phi, i); + if (!is_gimple_ip_invariant (val)) + { + info.reason = " Non-invariant value from a case\n"; + return false; /* Non-invariant argument. */ + } + reloc = initializer_constant_valid_p (val, TREE_TYPE (val)); + if ((flag_pic && reloc != null_pointer_node) + || (!flag_pic && reloc == NULL_TREE)) + { + if (reloc) + info.reason + = " Value from a case would need runtime relocations\n"; + else + info.reason + = " Value from a case is not a valid initializer\n"; + return false; + } } } } |