Hi All,
This checks if the arguments of the boolean operation
are an SSA_NAME before we try to lookup their definition.
Bootstrapped Regtested on aarch64-none-linux-gnu,
arm-none-linux-gnueabihf, x86_64-pc-linux-gnu
-m32, -m64 and on-going issues.
Ok for master if no regressions?
Thanks,
Tamar
gcc/ChangeLog:
PR middle-end/122890
* optabs.cc (emit_cmp_and_jump_insns): Check for SSA Name.
gcc/testsuite/ChangeLog:
PR middle-end/122890
* g++.target/aarch64/pr122890.C: New test.
---
diff --git a/gcc/optabs.cc b/gcc/optabs.cc
index
0f1495545a496e9045f1a9d35b3b1385a80bc558..183ad910fcd7c579cead076afe0e6bc069d25d5e
100644
--- a/gcc/optabs.cc
+++ b/gcc/optabs.cc
@@ -4854,13 +4854,15 @@ emit_cmp_and_jump_insns (rtx x, rtx y, enum rtx_code
comparison, rtx size,
gimple *mask_def = NULL;
tree rhs1 = gimple_assign_rhs1 (def_stmt);
tree rhs2 = gimple_assign_rhs2 (def_stmt);
- if ((mask_def = get_gimple_for_ssa_name (rhs1))
+ if (TREE_CODE (rhs1) == SSA_NAME
+ && (mask_def = get_gimple_for_ssa_name (rhs1))
&& is_gimple_assign (mask_def)
&& TREE_CODE_CLASS (gimple_assign_rhs_code (mask_def)))
masked_op = rhs2;
- else if ((mask_def = get_gimple_for_ssa_name (rhs2))
- && is_gimple_assign (mask_def)
- && TREE_CODE_CLASS (gimple_assign_rhs_code (mask_def)))
+ else if (TREE_CODE (rhs2) == SSA_NAME
+ && (mask_def = get_gimple_for_ssa_name (rhs2))
+ && is_gimple_assign (mask_def)
+ && TREE_CODE_CLASS (gimple_assign_rhs_code (mask_def)))
masked_op = rhs1;
if (masked_op)
@@ -4890,7 +4892,8 @@ emit_cmp_and_jump_insns (rtx x, rtx y, enum rtx_code
comparison, rtx size,
len_bias = gimple_call_arg (call, 4);
tree arg0 = gimple_call_arg (call, 0);
- def_stmt = get_gimple_for_ssa_name (arg0);
+ if (TREE_CODE (arg0) == SSA_NAME)
+ def_stmt = get_gimple_for_ssa_name (arg0);
}
}
diff --git a/gcc/testsuite/g++.target/aarch64/pr122890.C
b/gcc/testsuite/g++.target/aarch64/pr122890.C
new file mode 100644
index
0000000000000000000000000000000000000000..2b7426486d42fdf8d7008165d1a1ff5364547079
--- /dev/null
+++ b/gcc/testsuite/g++.target/aarch64/pr122890.C
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-march=armv8-a -std=c++11 -Ofast" } */
+
+#include <vector>
+
+int foo()
+{
+ bool xs[] = { true, true, false, true };
+ bool s[] = { true, true, false };
+ std::vector<bool> x(xs, xs+4);
+ std::vector<bool> g(s, s+3);
+ g.push_back(true);
+ if (g != x)
+ __builtin_abort();
+ return 0;
+}
--
diff --git a/gcc/optabs.cc b/gcc/optabs.cc
index 0f1495545a496e9045f1a9d35b3b1385a80bc558..183ad910fcd7c579cead076afe0e6bc069d25d5e 100644
--- a/gcc/optabs.cc
+++ b/gcc/optabs.cc
@@ -4854,13 +4854,15 @@ emit_cmp_and_jump_insns (rtx x, rtx y, enum rtx_code comparison, rtx size,
gimple *mask_def = NULL;
tree rhs1 = gimple_assign_rhs1 (def_stmt);
tree rhs2 = gimple_assign_rhs2 (def_stmt);
- if ((mask_def = get_gimple_for_ssa_name (rhs1))
+ if (TREE_CODE (rhs1) == SSA_NAME
+ && (mask_def = get_gimple_for_ssa_name (rhs1))
&& is_gimple_assign (mask_def)
&& TREE_CODE_CLASS (gimple_assign_rhs_code (mask_def)))
masked_op = rhs2;
- else if ((mask_def = get_gimple_for_ssa_name (rhs2))
- && is_gimple_assign (mask_def)
- && TREE_CODE_CLASS (gimple_assign_rhs_code (mask_def)))
+ else if (TREE_CODE (rhs2) == SSA_NAME
+ && (mask_def = get_gimple_for_ssa_name (rhs2))
+ && is_gimple_assign (mask_def)
+ && TREE_CODE_CLASS (gimple_assign_rhs_code (mask_def)))
masked_op = rhs1;
if (masked_op)
@@ -4890,7 +4892,8 @@ emit_cmp_and_jump_insns (rtx x, rtx y, enum rtx_code comparison, rtx size,
len_bias = gimple_call_arg (call, 4);
tree arg0 = gimple_call_arg (call, 0);
- def_stmt = get_gimple_for_ssa_name (arg0);
+ if (TREE_CODE (arg0) == SSA_NAME)
+ def_stmt = get_gimple_for_ssa_name (arg0);
}
}
diff --git a/gcc/testsuite/g++.target/aarch64/pr122890.C b/gcc/testsuite/g++.target/aarch64/pr122890.C
new file mode 100644
index 0000000000000000000000000000000000000000..2b7426486d42fdf8d7008165d1a1ff5364547079
--- /dev/null
+++ b/gcc/testsuite/g++.target/aarch64/pr122890.C
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-march=armv8-a -std=c++11 -Ofast" } */
+
+#include <vector>
+
+int foo()
+{
+ bool xs[] = { true, true, false, true };
+ bool s[] = { true, true, false };
+ std::vector<bool> x(xs, xs+4);
+ std::vector<bool> g(s, s+3);
+ g.push_back(true);
+ if (g != x)
+ __builtin_abort();
+ return 0;
+}