rs6000: Make the ctr* patterns allow ints in vector regs (PR71763)

Similar to PR70098, which is about integers in floating point registers,
we can have the completely analogous problem with vector registers as well
now that we allow integers in vector registers.  So, this patch solves it
in the same way.  This only works for targets with direct move.

To recap: register allocation can decide to put an integer mode value in
a floating point or vector register.  If that register is used in a bd*z
instruction, which is a jump instruction, reload can not do an output
reload on it (it does not do output reloads on any jump insns), so the
float or vector register will remain, and we have to allow it here or
recog will ICE.  Later on we will split this to valid instructions,
including a move from that fp/vec register to an int register; it is this
move that will still fail (PR70098) if we do not have direct move enabled.


	PR target/70098
	PR target/71763
	* config/rs6000/rs6000.md (*ctr<mode>_internal1, *ctr<mode>_internal2,
	*ctr<mode>_internal5, *ctr<mode>_internal6): Add *wi to the output
	constraint.

gcc/testsuite/
	PR target/70098
	PR target/71763
	* gcc.target/powerpc/pr71763.c: New file.

From-SVN: r238076
This commit is contained in:
Segher Boessenkool 2016-07-07 05:09:03 +02:00 committed by Segher Boessenkool
parent 242fab3667
commit 5ddaee94e2
4 changed files with 45 additions and 4 deletions

View file

@ -1,3 +1,11 @@
2016-07-06 Segher Boessenkool <segher@kernel.crashing.org>
PR target/70098
PR target/71763
* config/rs6000/rs6000.md (*ctr<mode>_internal1, *ctr<mode>_internal2,
*ctr<mode>_internal5, *ctr<mode>_internal6): Add *wi to the output
constraint.
2016-07-06 Trevor Saunders <tbsaunde+gcc@tbsaunde.org>
* var-tracking.c (struct adjust_mem_data): Make side_effects a vector.

View file

@ -12202,7 +12202,7 @@
(const_int 1))
(label_ref (match_operand 0 "" ""))
(pc)))
(set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*d*c*l")
(set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*d*wi*c*l")
(plus:P (match_dup 1)
(const_int -1)))
(clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
@ -12226,7 +12226,7 @@
(const_int 1))
(pc)
(label_ref (match_operand 0 "" ""))))
(set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*d*c*l")
(set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*d*wi*c*l")
(plus:P (match_dup 1)
(const_int -1)))
(clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
@ -12252,7 +12252,7 @@
(const_int 1))
(label_ref (match_operand 0 "" ""))
(pc)))
(set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*d*c*l")
(set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*d*wi*c*l")
(plus:P (match_dup 1)
(const_int -1)))
(clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
@ -12276,7 +12276,7 @@
(const_int 1))
(pc)
(label_ref (match_operand 0 "" ""))))
(set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*d*c*l")
(set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*d*wi*c*l")
(plus:P (match_dup 1)
(const_int -1)))
(clobber (match_scratch:CC 3 "=X,&x,&x,&x"))

View file

@ -1,3 +1,9 @@
2016-07-06 Segher Boessenkool <segher@kernel.crashing.org>
PR target/70098
PR target/71763
* gcc.target/powerpc/pr71763.c: New file.
2016-07-06 Yuri Rumyantsev <ysrumyan@gmail.com>
PR tree-optimization/71518

View file

@ -0,0 +1,27 @@
// PR target/71763
// { dg-do compile }
// { dg-options "-O1 -mvsx" }
// { dg-xfail-if "PR70098" { lp64 && powerpc64_no_dm } }
// { dg-prune-output ".*internal compiler error.*" }
int a, b;
float c;
void fn2(void);
void fn1(void)
{
long d;
for (d = 3; d; d--) {
for (a = 0; a <= 1; a++) {
b &= 1;
if (b) {
for (;;) {
fn2();
c = d;
}
}
}
}
}