On 2020-10-30 7:36 p.m., Segher Boessenkool wrote:
Thanks for the patch! But it has a problem:
diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md
index 67e4f2fd037..78de85ccbbb 100644
--- a/gcc/config/rs6000/vsx.md
+++ b/gcc/config/rs6000/vsx.md
@@ -3717,7 +3717,7 @@
(vec_select:<VS_scalar>
(match_operand:VSX_EXTRACT_I 1 "gpc_reg_operand" "<VSX_EX>,v")
(parallel [(match_operand:QI 2 "const_int_operand" "n,n")])))
- (clobber (match_scratch:<VS_scalar> 3 "=<VSX_EX>,&r"))
+ (clobber (match_scratch:<VS_scalar> 3 "=*<VSX_EX>,&*r"))
(clobber (match_scratch:SI 4 "=X,&r"))]
"VECTOR_MEM_VSX_P (<MODE>mode) && TARGET_VEXTRACTUB"
"#"
You add * to both alternatives here? I would expect adding it to only
the second alternative, does it work better with both?
No. It works the same. When the both alternatives use the hint, the
scratch pseudo got the class ALL_REGS. When only the 2nd use the hint,
the class is VSX_REGS. As I understand now the preferable alternative
is the 1st one (with <VSX> for the scratch). In this case using the
hint only for the 2nd alternative has more sense.
That also avoids a different problem: *<VSX_EX> won't work as expected.
'*' in IRA skips one constraint character, but <VSX_EX> can be "wa", a
two-letter constraint (and we do have an "a" constraint as well,
something wholly different: "wa" means a VSX register, while "a" is an
indexed address).
case '*':
/* Ignore the next letter for this pass. */
c = *++p;
break;
I see. Thanks for pointing this out. Definitely it is better to use the
hint only for the second alternative ("&*r") then. Is this solution ok
for you?