aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2021-09-23 09:32:00 -0400
committerAndrew MacLeod <amacleod@redhat.com>2021-09-23 12:56:43 -0400
commitfe4e6c824a580012bf9034cc33f0b440df93f56f (patch)
treed51ab000122b4b0e4c987ac4c00cccf6d0675680 /gcc
parent053e1d642104d19d5f9e5fb08a9e7354a0db28f5 (diff)
downloadgcc-fe4e6c824a580012bf9034cc33f0b440df93f56f.zip
gcc-fe4e6c824a580012bf9034cc33f0b440df93f56f.tar.gz
gcc-fe4e6c824a580012bf9034cc33f0b440df93f56f.tar.bz2
Look for a relation between operands only when possible.
Do not look for a relation between 2 operands if there is no range-ops handler. gcc/ PR tree-optimization/102463 * gimple-range-fold.cc (fold_using_range::relation_fold_and_or): If there is no range-ops handler, don't look for a relation. gcc/testsuite/ * gcc.dg/pr102463.c: New.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/gimple-range-fold.cc4
-rw-r--r--gcc/testsuite/gcc.dg/pr102463.c21
2 files changed, 25 insertions, 0 deletions
diff --git a/gcc/gimple-range-fold.cc b/gcc/gimple-range-fold.cc
index 35324fd..bb09b75 100644
--- a/gcc/gimple-range-fold.cc
+++ b/gcc/gimple-range-fold.cc
@@ -1358,6 +1358,10 @@ fold_using_range::relation_fold_and_or (irange& lhs_range, gimple *s,
range_operator *handler1 = gimple_range_handler (SSA_NAME_DEF_STMT (ssa1));
range_operator *handler2 = gimple_range_handler (SSA_NAME_DEF_STMT (ssa2));
+ // If either handler is not present, no relation is found.
+ if (!handler1 || !handler2)
+ return;
+
int_range<2> bool_one (boolean_true_node, boolean_true_node);
relation_kind relation1 = handler1->op1_op2_relation (bool_one);
diff --git a/gcc/testsuite/gcc.dg/pr102463.c b/gcc/testsuite/gcc.dg/pr102463.c
new file mode 100644
index 0000000..ca63f0b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr102463.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+_Bool _bfd_elf_merge_symbol_h, _bfd_elf_merge_symbol_h_1;
+_Bool _bfd_elf_merge_symbol_olddef;
+_Bool bfd_is_com_section();
+
+void
+_bfd_elf_merge_symbol() {
+ _Bool newdef = bfd_is_com_section(), ntdef, tdef;
+ _bfd_elf_merge_symbol_olddef = _bfd_elf_merge_symbol_h;
+ if (_bfd_elf_merge_symbol_h_1) {
+ ntdef = newdef;
+ tdef = _bfd_elf_merge_symbol_h;
+ } else {
+ ntdef = _bfd_elf_merge_symbol_h;
+ tdef = newdef;
+ }
+ if (tdef && ntdef)
+ ;
+}