[PR82096] Fix ICE in int_mode_for_mode with arm-linux-gnueabi
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
This commit is contained in:
parent
69a3508539
commit
f8f77d4d00
|
@ -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
|
||||
|
|
11
gcc/expmed.c
11
gcc/expmed.c
|
@ -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);
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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));
|
||||
}
|
Loading…
Reference in New Issue