[PATCH] Fix power8 non-delegitimized UNSPEC UNSPEC_FUSION_GPR messages
Jakub Jelinek
jakub@redhat.com
Tue Jan 8 20:34:00 GMT 2019
Hi!
My recent changes to UNSPEC handling in dwarf2out.c apparently broke
(non-release checking) regtest on powerpc*, a lot of
note: non-delegitimized UNSPEC UNSPEC_FUSION_GPR (73) found in variable location
messages are emitted while compiling pretty much anything with -mcpu=power8
or later.
The problem is that debug insns say some variable lives in the result of
UNSPEC_FUSION_GPR and var-tracking manages to optimize the operand of that
UNSPEC from a complex MEM into a LABEL_REF. For UNSPECs that don't have any
constant arguments dwarf2out is silent as before, but for those that have
CONSTANT_P operands it hints that it would be nice to delegitimize those.
Apparently UNSPEC_FUSION_GPR wraps a MEM that isn't valid in a normal insn,
as it includes both the high and lo_sum parts, but otherwise it is something
that is completely ok for debug info purposes.
So, this patch delegitimizes this UNSPEC to its argument.
Bootstrapped/regtested on powerpc64le-linux, ok for trunk?
2019-01-08 Jakub Jelinek <jakub@redhat.com>
* config/rs6000/rs6000.c (rs6000_delegitimize_address): Delegitimize
UNSPEC_FUSION_GPR to its argument. Formatting fixes.
--- gcc/config/rs6000/rs6000.c.jj 2019-01-01 12:37:44.885520010 +0100
+++ gcc/config/rs6000/rs6000.c 2019-01-08 13:22:48.846995153 +0100
@@ -8388,14 +8388,17 @@ rs6000_delegitimize_address (rtx orig_x)
{
rtx x, y, offset;
+ if (GET_CODE (orig_x) == UNSPEC && XINT (orig_x, 1) == UNSPEC_FUSION_GPR)
+ orig_x = XVECEXP (orig_x, 0, 0);
+
orig_x = delegitimize_mem_from_attrs (orig_x);
+
x = orig_x;
if (MEM_P (x))
x = XEXP (x, 0);
y = x;
- if (TARGET_CMODEL != CMODEL_SMALL
- && GET_CODE (y) == LO_SUM)
+ if (TARGET_CMODEL != CMODEL_SMALL && GET_CODE (y) == LO_SUM)
y = XEXP (y, 1);
offset = NULL_RTX;
@@ -8407,8 +8410,7 @@ rs6000_delegitimize_address (rtx orig_x)
y = XEXP (y, 0);
}
- if (GET_CODE (y) == UNSPEC
- && XINT (y, 1) == UNSPEC_TOCREL)
+ if (GET_CODE (y) == UNSPEC && XINT (y, 1) == UNSPEC_TOCREL)
{
y = XVECEXP (y, 0, 0);
@@ -8435,8 +8437,7 @@ rs6000_delegitimize_address (rtx orig_x)
&& GET_CODE (XEXP (orig_x, 1)) == CONST)
{
y = XEXP (XEXP (orig_x, 1), 0);
- if (GET_CODE (y) == UNSPEC
- && XINT (y, 1) == UNSPEC_MACHOPIC_OFFSET)
+ if (GET_CODE (y) == UNSPEC && XINT (y, 1) == UNSPEC_MACHOPIC_OFFSET)
return XVECEXP (y, 0, 0);
}
Jakub
More information about the Gcc-patches
mailing list