mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-13 15:01:21 +08:00
Don't let DEBUG_INSNSs change register renaming decisions
PR debug/94439 * regrename.c (check_new_reg_p): Ignore DEBUG_INSNs when walking the chain. PR debug/94439 * gcc.dg/torture/pr94439.c: New test.
This commit is contained in:
parent
b57e1621eb
commit
baf3b9b2e5
gcc
@ -1,3 +1,9 @@
|
||||
2020-04-18 Jeff Law <law@redhat.com>
|
||||
|
||||
PR debug/94439
|
||||
* regrename.c (check_new_reg_p): Ignore DEBUG_INSNs when walking
|
||||
the chain.
|
||||
|
||||
2020-04-18 Iain Buclaw <ibuclaw@gdcproject.org>
|
||||
|
||||
* doc/sourcebuild.texi (Effective-Target Keywords, Environment
|
||||
|
@ -348,11 +348,17 @@ check_new_reg_p (int reg ATTRIBUTE_UNUSED, int new_reg,
|
||||
/* See whether it accepts all modes that occur in
|
||||
definition and uses. */
|
||||
for (tmp = this_head->first; tmp; tmp = tmp->next_use)
|
||||
if ((!targetm.hard_regno_mode_ok (new_reg, GET_MODE (*tmp->loc))
|
||||
&& ! DEBUG_INSN_P (tmp->insn))
|
||||
|| call_clobbered_in_chain_p (this_head, GET_MODE (*tmp->loc),
|
||||
new_reg))
|
||||
return false;
|
||||
{
|
||||
/* Completely ignore DEBUG_INSNs, otherwise we can get
|
||||
-fcompare-debug failures. */
|
||||
if (DEBUG_INSN_P (tmp->insn))
|
||||
continue;
|
||||
|
||||
if (!targetm.hard_regno_mode_ok (new_reg, GET_MODE (*tmp->loc))
|
||||
|| call_clobbered_in_chain_p (this_head, GET_MODE (*tmp->loc),
|
||||
new_reg))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -1,3 +1,8 @@
|
||||
2020-04-18 Jeff Law <law@redhat.com>
|
||||
|
||||
PR debug/94439
|
||||
* gcc.dg/torture/pr94439.c: New test.
|
||||
|
||||
2020-04-18 Iain Buclaw <ibuclaw@gdcproject.org>
|
||||
|
||||
* gdc.dg/link.d: Use d_runtime_has_std_library effective target.
|
||||
|
55
gcc/testsuite/gcc.dg/torture/pr94439.c
Normal file
55
gcc/testsuite/gcc.dg/torture/pr94439.c
Normal file
@ -0,0 +1,55 @@
|
||||
/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
|
||||
/* { dg-additional-options "-flive-patching=inline-clone -funroll-loops -fno-tree-forwprop -fno-expensive-optimizations -mstack-arg-probe -fcompare-debug" } */
|
||||
/* { dg-skip-if "" { *-*-* } { "-flto" } { "" } } */
|
||||
|
||||
extern void exit (int);
|
||||
extern void abort (void);
|
||||
|
||||
#define COMPARE_BODY(A, B, TYPE, COPYSIGN) \
|
||||
do { \
|
||||
TYPE s1 = COPYSIGN ((TYPE) 1.0, A); \
|
||||
TYPE s2 = COPYSIGN ((TYPE) 1.0, B); \
|
||||
if (s1 != s2) \
|
||||
abort (); \
|
||||
if ((__builtin_isnan (A) != 0) != (__builtin_isnan (B) != 0)) \
|
||||
abort (); \
|
||||
if ((A != B) != (__builtin_isnan (A) != 0)) \
|
||||
abort (); \
|
||||
} while (0)
|
||||
|
||||
void
|
||||
comparel (long double a, long double b)
|
||||
{
|
||||
COMPARE_BODY (a, b, long double, __builtin_copysignl);
|
||||
}
|
||||
|
||||
void
|
||||
comparecl (_Complex long double a, long double r, long double i)
|
||||
{
|
||||
comparel (__real__ a, r);
|
||||
comparel (__imag__ a, i);
|
||||
}
|
||||
|
||||
#define VERIFY(A, B, TYPE, COMPARE) \
|
||||
do { \
|
||||
TYPE a = A; \
|
||||
TYPE b = B; \
|
||||
_Complex TYPE cr = __builtin_complex (a, b); \
|
||||
static _Complex TYPE cs = __builtin_complex (A, B); \
|
||||
COMPARE (cr, A, B); \
|
||||
COMPARE (cs, A, B); \
|
||||
} while (0)
|
||||
|
||||
#define ALL_CHECKS(PZ, NZ, NAN, INF, TYPE, COMPARE) \
|
||||
do { \
|
||||
VERIFY (NAN, NZ, TYPE, COMPARE); \
|
||||
VERIFY (INF, NZ, TYPE, COMPARE); \
|
||||
VERIFY (INF, NAN, TYPE, COMPARE); \
|
||||
VERIFY (INF, INF, TYPE, COMPARE); \
|
||||
} while (0)
|
||||
|
||||
void
|
||||
check_long_double (void)
|
||||
{
|
||||
ALL_CHECKS (0.0l, -0.0l, __builtin_nanl(""), __builtin_infl(), long double, comparecl);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user