Hi all,
In this bug we ICE when checking REGNO_OK_FOR_INDEX_P on arm during
pre-IRA scheduling.
This is because REGNO_OK_FOR_INDEX_P ends up checking the reg_renumber
array.
Before IRA reg_renumber is NULL and thus we segfault.
The fix is to guard the use of reg_renumber in the logic in TEST_REGNO
in arm.h.
On aarch64, for example, we also guard against the reg_renumber == NULL
case.
This fixes the ICE. I also remove the part of the comment that muses on
when reg_renumber
is available as with this patch it should now be safe to use at any point.
Bootstrapped and tested on arm-none-linux-gnueabihf.
Committed to trunk as r255830.
Thanks,
Kyrill
2017-12-19 Kyrylo Tkachov <kyrylo.tkac...@arm.com>
PR target/82975
* config/arm/arm.h (TEST_REGNO): Check reg_renumber is set before
accessing it. Adjust comment.
2017-12-19 Kyrylo Tkachov <kyrylo.tkac...@arm.com>
PR target/82975
* gcc.dg/pr82975.c: New test.
commit 57beb9c5faf502ef6fb5a40bc0fa54541238b0c1
Author: Kyrylo Tkachov <kyrylo.tkac...@arm.com>
Date: Mon Dec 18 12:06:55 2017 +0000
[arm] PR target/82975: Guard against reg_renumber being NULL in arm.h
diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
index 47931e1..90478fc 100644
--- a/gcc/config/arm/arm.h
+++ b/gcc/config/arm/arm.h
@@ -1626,7 +1626,8 @@ enum arm_auto_incmodes
has been allocated, which happens in reginfo.c during register
allocation. */
#define TEST_REGNO(R, TEST, VALUE) \
- ((R TEST VALUE) || ((unsigned) reg_renumber[R] TEST VALUE))
+ ((R TEST VALUE) \
+ || (reg_renumber && ((unsigned) reg_renumber[R] TEST VALUE)))
/* Don't allow the pc to be used. */
#define ARM_REGNO_OK_FOR_BASE_P(REGNO) \
diff --git a/gcc/testsuite/gcc.dg/pr82975.c b/gcc/testsuite/gcc.dg/pr82975.c
new file mode 100644
index 0000000..e6c13bc
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr82975.c
@@ -0,0 +1,19 @@
+/* PR target/82975. */
+/* { dg-do compile } */
+/* { dg-options "-mtune=cortex-a57 -fno-sched-pressure -O2" } */
+
+typedef __SIZE_TYPE__ size_t;
+
+struct S1
+{
+ char pad1;
+ char val;
+ short pad2;
+};
+
+extern char t[256];
+
+void foo (struct S1 a, size_t i)
+{
+ t[i] = a.val;
+}