The test gcc.dg/torture/pr84682-2.c has been failing for some time on aarch64. Bin Cheng submitted a patch for this some time ago, the original patch was:
https://gcc.gnu.org/ml/gcc-patches/2018-03/msg00784.html But Richard Sandiford thought it should be fixed in recog.c instead of just in aarch64.c. Bin submitted a followup: https://gcc.gnu.org/ml/gcc-patches/2018-03/msg01166.html But there were no replies to that patch submission. I have retested the second patch and verified it fixes the aarch64 failure and causes no regressions on aarch64 or x86. OK to checkin? Steve Ellcey sell...@marvell.com 2019-01-23 Bin Cheng <bin.ch...@arm.com> Steve Ellcey <sell...@marvell.com> * recog.c (address_operand): Return false on wrong mode for address. * config/aarch64/aarch64.c (aarch64_classify_address): Remove assert since it's checked in general code now.
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 5df5a8b..aa3054d 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -6565,9 +6565,6 @@ aarch64_classify_address (struct aarch64_address_info *info, && (code != POST_INC && code != REG)) return false; - gcc_checking_assert (GET_MODE (x) == VOIDmode - || SCALAR_INT_MODE_P (GET_MODE (x))); - switch (code) { case REG: diff --git a/gcc/recog.c b/gcc/recog.c index d0c498f..fb90302 100644 --- a/gcc/recog.c +++ b/gcc/recog.c @@ -1070,6 +1070,11 @@ general_operand (rtx op, machine_mode mode) int address_operand (rtx op, machine_mode mode) { + /* Wrong mode for an address expr. */ + if (GET_MODE (op) != VOIDmode + && ! SCALAR_INT_MODE_P (GET_MODE (op))) + return false; + return memory_address_p (mode, op); }