Hi, Please find attached the patch fixing bug 49069.
This patch is tested with check-gcc on trunk and 4.6 without regression. OK for trunk? Is it fine to backport to 4.6 branch? ChangeLog: 2012-01-24 Sameera Deshpande <sameera.deshpa...@arm.com> PR target/49069 gcc/config/arm/arm.md (cstoredi4): Handle the case when both operands are const_int. gcc/testsuite/ChangeLog: 2012-01-24 Sameera Deshpande <sameera.deshpa...@arm.com> PR target/49069 gcc.target/arm/pr49069.c: New compile-only test. - Thanks and regards, Sameera D.
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md index 751997f..e3dc98f 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -7911,8 +7911,9 @@ enum rtx_code code = GET_CODE (operands[1]); /* We should not have two constants. */ - gcc_assert (GET_MODE (operands[2]) == DImode - || GET_MODE (operands[3]) == DImode); + if (!(GET_MODE (operands[2]) == DImode || GET_MODE (operands[3]) == DImode) + && !(reload_in_progress || reload_completed)) + operands[3] = force_reg (DImode, operands[3]); /* Flip unimplemented DImode comparisons to a form that arm_gen_compare_reg can handle. */ diff --git a/gcc/testsuite/gcc.target/arm/pr49069.c b/gcc/testsuite/gcc.target/arm/pr49069.c new file mode 100644 index 0000000..3cc903e --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr49069.c @@ -0,0 +1,24 @@ +/* { dg-do compile } */ +/* { dg-options "-Os -mfloat-abi=softfp -mfpu=vfpv3-d16" } */ + +__extension__ typedef unsigned long long int uint64_t; + +static int +func2 (int a, int b) +{ + return a == 0 ? a : a / b; +} + +int array1[1]; +const uint64_t array2[1] = { 1 }; + +void +foo (void) +{ + for (array1[0] = 0; array1[0] == 1; array1[0]++) + { + } + if (bar (array2[0] == func2 (array1[0], 0)) == 0) + { + } +}