[PR82096] Fix ICE in int_mode_for_mode with arm-linux-gnueabi
authorSudakshina Das <sudi.das@arm.com>
Thu, 11 Jan 2018 10:46:59 +0000 (10:46 +0000)
committerSudakshina Das <sudi@gcc.gnu.org>
Thu, 11 Jan 2018 10:46:59 +0000 (10:46 +0000)
The bug reported a particular test di-longlong64-sync-1.c failing when run
on arm-linux-gnueabi with options -mthumb -march=armv5t -O[g,1,2,3] and
-mthumb -march=armv6 -O[g,1,2,3].

The crash was caused because of the explicit VOIDmode argument that is sent
to emit_store_flag_force () and that the emit_store_flag_force () was not
handling the VOIDmode adequately. This patch fixes that.

ChangeLog entries:

*** gcc/ChangeLog ***

2017-01-11  Sudakshina Das  <sudi.das@arm.com>

PR target/82096
* expmed.c (emit_store_flag_force): Swap if const op0
and change VOIDmode to mode of op0.

*** gcc/testsuite/ChangeLog ***

2017-01-11  Sudakshina Das  <sudi.das@arm.com>

PR target/82096
* gcc.c-torture/compile/pr82096.c: New test.

From-SVN: r256526

gcc/ChangeLog
gcc/expmed.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr82096.c [new file with mode: 0644]

index 9e5f46a259d876473f631485874bcf06f00bddb8..d34418e82eeab2aa89f8dcc7be6abd9590e1534b 100644 (file)
@@ -1,3 +1,9 @@
+2017-01-11  Sudakshina Das  <sudi.das@arm.com>
+
+       PR target/82096
+       * expmed.c (emit_store_flag_force): Swap if const op0
+       and change VOIDmode to mode of op0.
+
 2018-01-11  Richard Sandiford  <richard.sandiford@linaro.org>
 
        PR rtl-optimization/83761
index f34ed9376af8d38e3eabb48472cbebbec6c75fa0..35ce82bbb29bd12ffabcd22ced2fb4d625f15d03 100644 (file)
@@ -6082,6 +6082,17 @@ emit_store_flag_force (rtx target, enum rtx_code code, rtx op0, rtx op1,
   if (tem != 0)
     return tem;
 
+  /* If one operand is constant, make it the second one.  Only do this
+     if the other operand is not constant as well.  */
+  if (swap_commutative_operands_p (op0, op1))
+    {
+      std::swap (op0, op1);
+      code = swap_condition (code);
+    }
+
+  if (mode == VOIDmode)
+    mode = GET_MODE (op0);
+
   if (!target)
     target = gen_reg_rtx (word_mode);
 
index e6d2045674a84d8bf7fb022eec99bf0952b65ed7..3b49b86a30b28715097837321ea163483d752105 100644 (file)
@@ -1,3 +1,8 @@
+2017-01-11  Sudakshina Das  <sudi.das@arm.com>
+
+       PR target/82096
+       * gcc.c-torture/compile/pr82096.c: New test.
+
 2018-01-11  Ed Schonberg  <schonberg@adacore.com>
 
        * gnat.dg/bip_overlay.adb, gnat.dg/bip_overlay.ads: New testcase.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr82096.c b/gcc/testsuite/gcc.c-torture/compile/pr82096.c
new file mode 100644 (file)
index 0000000..9fed28c
--- /dev/null
@@ -0,0 +1,9 @@
+/* { dg-additional-options "-march=armv5t -mthumb -mfloat-abi=soft" { target arm*-*-* } } */
+
+static long long AL[24];
+
+int
+check_ok (void)
+{
+  return (__sync_bool_compare_and_swap (AL+1, 0x200000003ll, 0x1234567890ll));
+}