aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@codesourcery.com>2010-12-17 13:48:40 +0000
committerBernd Schmidt <bernds@gcc.gnu.org>2010-12-17 13:48:40 +0000
commit4d5d65862a2a7d54abfee98d94aa2cb536b3d9ff (patch)
tree3c8a3b8b43afe876ae2f238034721d94b4eb4a78 /gcc
parent8b432c8b8323a67de0ac1c4fce32b80a6eaef9be (diff)
downloadgcc-4d5d65862a2a7d54abfee98d94aa2cb536b3d9ff.zip
gcc-4d5d65862a2a7d54abfee98d94aa2cb536b3d9ff.tar.gz
gcc-4d5d65862a2a7d54abfee98d94aa2cb536b3d9ff.tar.bz2
arm.c (arm_select_cc_mode): Before calling arm_select_dominance_cc_mode for AND or IOR operations...
gcc/ * config/arm/arm.c (arm_select_cc_mode): Before calling arm_select_dominance_cc_mode for AND or IOR operations, ensure that op is NE or EQ. gcc/testsuite/ * gcc.c-torture/compile/20101217-1.c: New test. From-SVN: r167981
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/arm/arm.c2
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20101217-1.c36
4 files changed, 48 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c5e8012..8aab810 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2010-12-17 Bernd Schmidt <bernds@codesourcery.com>
+
+ * config/arm/arm.c (arm_select_cc_mode): Before calling
+ arm_select_dominance_cc_mode for AND or IOR operations, ensure
+ that op is NE or EQ.
+
2010-12-17 Alexander Monakov <amonakov@ispras.ru>
PR middle-end/46761
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 21fc256..2bfdd9f 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -10602,12 +10602,14 @@ arm_select_cc_mode (enum rtx_code op, rtx x, rtx y)
/* Alternate canonicalizations of the above. These are somewhat cleaner. */
if (GET_CODE (x) == AND
+ && (op == EQ || op == NE)
&& COMPARISON_P (XEXP (x, 0))
&& COMPARISON_P (XEXP (x, 1)))
return arm_select_dominance_cc_mode (XEXP (x, 0), XEXP (x, 1),
DOM_CC_X_AND_Y);
if (GET_CODE (x) == IOR
+ && (op == EQ || op == NE)
&& COMPARISON_P (XEXP (x, 0))
&& COMPARISON_P (XEXP (x, 1)))
return arm_select_dominance_cc_mode (XEXP (x, 0), XEXP (x, 1),
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 67799d0..209174b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2010-12-17 Bernd Schmidt <bernds@codesourcery.com>
+
+ * gcc.c-torture/compile/20101217-1.c: New test.
+
2010-12-17 Alexander Monakov <amonakov@ispras.ru>
PR middle-end/46761
diff --git a/gcc/testsuite/gcc.c-torture/compile/20101217-1.c b/gcc/testsuite/gcc.c-torture/compile/20101217-1.c
new file mode 100644
index 0000000..c4eef0e
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/20101217-1.c
@@ -0,0 +1,36 @@
+/* Testcase provided by HUAWEI. */
+#include <stdio.h>
+int main()
+{
+ int cur_k;
+ int cur_j=0;
+ int cur_i=28;
+ unsigned char temp_data[8];
+ unsigned int Data_Size=20;
+
+ for (cur_k=0;cur_j<7;cur_j++,cur_i++) {
+ if (cur_j%2==0) {
+ temp_data[cur_k++]=0;
+ }
+ if (cur_k==7) {
+ for (;cur_k>0;cur_k--) {
+ if (cur_k>2) {
+ if ((temp_data[7-cur_k]=='n' || temp_data[7-cur_k]=='N' ) && (temp_data[7-cur_k+1]=='a' || temp_data[7-cur_k+1]=='A' )) {
+ break;
+ }
+ }
+ if (cur_k==1) {
+ if (temp_data[7-cur_k]=='n' || temp_data[7-cur_k]=='N' ) {
+ break;
+ }
+ }
+ }
+ if (cur_k==7) {
+ } else {
+ if (cur_k>0)
+ printf("dfjk");
+ }
+ }
+ }
+return 0;
+}