[Bug rtl-optimization/82058] New: ICE in process_alt_operands, at lra-constraints.c:2954 (after adding early clobber in .md)
vries at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Aug 31 15:39:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82058
Bug ID: 82058
Summary: ICE in process_alt_operands, at lra-constraints.c:2954
(after adding early clobber in .md)
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: vries at gcc dot gnu.org
Target Milestone: ---
At r251537, with this patch:
...
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index d61afcf..a42358d 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -1741,7 +1741,7 @@
(set_attr "mode" "<MODE>")])
(define_insn "srcp14<mode>_mask"
- [(set (match_operand:VF_128 0 "register_operand" "=v")
+ [(set (match_operand:VF_128 0 "register_operand" "=&v")
(vec_merge:VF_128
(vec_merge:VF_128
(unspec:VF_128
...
and this test-case:
...
typedef double v2df __attribute__ ((__vector_size__ (16)));
v2df
foo (unsigned char u, v2df a, v2df b)
{
v2df zero = __extension__ (typeof (zero)){ 0.0f, 0.0f };
return __builtin_ia32_rcp14sd_mask (a, b, zero, u);
}
...
compiled like this:
...
$ gcc avx-1.c -O2 -S -mavx512f
...
we run into this ICE:
...
during RTL pass: reload
avx-1.c: In function ‘foo’:
avx-1.c:8:1: internal compiler error: in process_alt_operands, at
lra-constraints.c:2954
}
^
0xdf7053 process_alt_operands
gcc/lra-constraints.c:2954
0xdfafc4 curr_insn_transform
gcc/lra-constraints.c:3850
0xdffdcc lra_constraints(bool)
gcc/lra-constraints.c:4846
0xde2237 lra(_IO_FILE*)
gcc/lra.c:2392
0xd6f378 do_reload
gcc/ira.c:5440
0xd6f83c execute
gcc/ira.c:5624
...
The ICE in more detail:
...
(gdb)
#6 0x0000000000df7054 in process_alt_operands (only_alternative=-1)
at gcc/lra-constraints.c:2954
2954 lra_assert (reject > 0);
(gdb) p reject
$1 = 0
...
The insn that triggers this ICE:
...
(gdb) call debug_rtx (curr_insn)
(insn 14 12 19 2 (set (reg:V2DF 93)
(vec_merge:V2DF (vec_merge:V2DF (unspec:V2DF [
(reg/v:V2DF 91 [ a ])
] UNSPEC_RCP14)
(const_vector:V2DF [
(const_double:DF 0.0 [0x0.0p+0])
(const_double:DF 0.0 [0x0.0p+0])
])
(subreg:QI (reg:SI 90 [ u ]) 0))
(reg:V2DF 22 xmm1 [ b ])
(const_int 1 [0x1]))) "avx-1.c":7 1503 {srcp14v2df_mask}
(expr_list:REG_DEAD (reg/v:V2DF 91 [ a ])
(expr_list:REG_DEAD (reg:SI 90 [ u ])
(expr_list:REG_DEAD (reg:V2DF 22 xmm1 [ b ])
(nil)))))
...
-fira-verbose output:
...
Starting decreasing number of live ranges...
********** Local #1: **********
Spilling non-eliminable hard regs: 7
New elimination table:
Can eliminate 16 to 7 (offset=8, prev_offset=0)
Can eliminate 16 to 6 (offset=8, prev_offset=0)
Can eliminate 20 to 7 (offset=0, prev_offset=0)
Can eliminate 20 to 6 (offset=0, prev_offset=0)
0 Early clobber: reject++
3 Matching earlyclobber alt: reject--
...
The documentation of reject is:
...
/* REJECT is a count of how undesirable this alternative says it is
if any reloading is required. If the alternative matches exactly
then REJECT is ignored, but otherwise it gets this much counted
against it in addition to the reloading needed. */
int reject;
...
More information about the Gcc-bugs
mailing list