diff mbox series

[RS6000] Don't pass -many to the assembler

Message ID 20181112114904.GH22752@bubble.grove.modra.org
State New
Headers show
Series [RS6000] Don't pass -many to the assembler | expand

Commit Message

Alan Modra Nov. 12, 2018, 11:49 a.m. UTC
I'd like to remove -many from the options passed by default to the
assembler, on the grounds that a gcc bug in instruction selection (eg.
emitting a power9 insn for -mcpu=power8) is better found at assembly
time than run time.

This might annoy people for a while fixing user asm that we didn't
diagnose previously, but I believe this is the right direction to go.
Of course, -Wa,-many is available for anyone who just wants their
dodgy old code to work.

Bootstrapped etc. powerpc64le-linux.  OK?

	* config/rs6000/rs6000.h (ASM_CPU_SPEC): Remove -many.
	* config/rs6000/aix61.h (ASM_CPU_SPEC): Likewise.
	* config/rs6000/aix71.h (ASM_CPU_SPEC): Likewise.
	* testsuite/gcc.target/powerpc/ppc32-abi-dfp-1.c: Don't use
	power mnemonics.

Comments

Alan Modra Nov. 12, 2018, 1:28 p.m. UTC | #1
On Mon, Nov 12, 2018 at 10:19:04PM +1030, Alan Modra wrote:
> I'd like to remove -many from the options passed by default to the
> assembler, on the grounds that a gcc bug in instruction selection (eg.
> emitting a power9 insn for -mcpu=power8) is better found at assembly
> time than run time.
> 
> This might annoy people for a while fixing user asm that we didn't
> diagnose previously, but I believe this is the right direction to go.
> Of course, -Wa,-many is available for anyone who just wants their
> dodgy old code to work.
> 
> Bootstrapped etc. powerpc64le-linux.  OK?

I forgot to mention something important.  This exposes a bug with our
target_clones support, in that we don't emit .machine directives when
changing cpu.  eg. gcc.target/powerpc/clone2.c fails with
"unrecognized opcode: `modsd'".

__attribute__((__target__("cpu=..."))) also doesn't emit a .machine
directive before the affected function code.
Michael Matz Nov. 12, 2018, 2:39 p.m. UTC | #2
Hi,

On Mon, 12 Nov 2018, Alan Modra wrote:

> I'd like to remove -many from the options passed by default to the 
> assembler, on the grounds that a gcc bug in instruction selection (eg. 
> emitting a power9 insn for -mcpu=power8) is better found at assembly 
> time than run time.
> 
> This might annoy people for a while fixing user asm that we didn't 
> diagnose previously, but I believe this is the right direction to go. Of 
> course, -Wa,-many is available for anyone who just wants their dodgy old 
> code to work.

Wouldn't this also break compiling code that contains power9 instructions 
but guarded by runtime tests to only be executed on power9 machines?  That 
seems a valid usecase, and it'd be bad if the assembler fails to compile 
such.  (You can't use -mcpu=power9 as work around as the other 
unguarded code is not supposed to be using power9 insns).


Ciao,
Michael.

> 
> Bootstrapped etc. powerpc64le-linux.  OK?
> 
> 	* config/rs6000/rs6000.h (ASM_CPU_SPEC): Remove -many.
> 	* config/rs6000/aix61.h (ASM_CPU_SPEC): Likewise.
> 	* config/rs6000/aix71.h (ASM_CPU_SPEC): Likewise.
> 	* testsuite/gcc.target/powerpc/ppc32-abi-dfp-1.c: Don't use
> 	power mnemonics.
> 
> diff --git a/gcc/config/rs6000/aix61.h b/gcc/config/rs6000/aix61.h
> index 353e5d6cfeb..a7a8246bfe3 100644
> --- a/gcc/config/rs6000/aix61.h
> +++ b/gcc/config/rs6000/aix61.h
> @@ -91,8 +91,7 @@ do {									\
>  %{mcpu=630: -m620} \
>  %{mcpu=970: -m970} \
>  %{mcpu=G5: -m970} \
> -%{mvsx: %{!mcpu*: -mpwr6}} \
> --many"
> +%{mvsx: %{!mcpu*: -mpwr6}}"
>  
>  #undef	ASM_DEFAULT_SPEC
>  #define ASM_DEFAULT_SPEC "-mpwr4"
> diff --git a/gcc/config/rs6000/aix71.h b/gcc/config/rs6000/aix71.h
> index 2398ed64baa..d2ca8dc275d 100644
> --- a/gcc/config/rs6000/aix71.h
> +++ b/gcc/config/rs6000/aix71.h
> @@ -89,8 +89,7 @@ do {									\
>  	    maltivec: -m970; \
>  	    maix64|mpowerpc64: -mppc64; \
>  	    : %(asm_default)}; \
> -  :%eMissing -mcpu option in ASM_SPEC_CPU?\n} \
> --many"
> +  :%eMissing -mcpu option in ASM_SPEC_CPU?\n}"
>  
>  #undef	ASM_DEFAULT_SPEC
>  #define ASM_DEFAULT_SPEC "-mpwr4"
> diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
> index d75137cf8f5..9d78173a680 100644
> --- a/gcc/config/rs6000/rs6000.h
> +++ b/gcc/config/rs6000/rs6000.h
> @@ -137,8 +137,7 @@
>  	    mvsx: -mpower7; \
>  	    mpowerpc64: -mppc64;: %(asm_default)}; \
>    :%eMissing -mcpu option in ASM_SPEC_CPU?\n} \
> -%{mvsx: -mvsx -maltivec; maltivec: -maltivec} \
> --many"
> +%{mvsx: -mvsx -maltivec; maltivec: -maltivec}"
>  
>  #define CPP_DEFAULT_SPEC ""
>  
> diff --git a/gcc/testsuite/gcc.target/powerpc/ppc32-abi-dfp-1.c b/gcc/testsuite/gcc.target/powerpc/ppc32-abi-dfp-1.c
> index 14908dba690..eea7f6ffc2e 100644
> --- a/gcc/testsuite/gcc.target/powerpc/ppc32-abi-dfp-1.c
> +++ b/gcc/testsuite/gcc.target/powerpc/ppc32-abi-dfp-1.c
> @@ -45,14 +45,14 @@ __asm__ ("\t.globl\t" #NAME "_asm\n\t"					\
>  	 #NAME "_asm:\n\t"						\
>  	 "lis 11,gparms@ha\n\t"						\
>  	 "la 11,gparms@l(11)\n\t"					\
> -	 "st 3,0(11)\n\t"						\
> -	 "st 4,4(11)\n\t"						\
> -	 "st 5,8(11)\n\t"						\
> -	 "st 6,12(11)\n\t"						\
> -	 "st 7,16(11)\n\t"						\
> -	 "st 8,20(11)\n\t"						\
> -	 "st 9,24(11)\n\t"						\
> -	 "st 10,28(11)\n\t"						\
> +	 "stw 3,0(11)\n\t"						\
> +	 "stw 4,4(11)\n\t"						\
> +	 "stw 5,8(11)\n\t"						\
> +	 "stw 6,12(11)\n\t"						\
> +	 "stw 7,16(11)\n\t"						\
> +	 "stw 8,20(11)\n\t"						\
> +	 "stw 9,24(11)\n\t"						\
> +	 "stw 10,28(11)\n\t"						\
>  	 "stfd 1,32(11)\n\t"						\
>  	 "stfd 2,40(11)\n\t"						\
>  	 "stfd 3,48(11)\n\t"						\
> 
>
Andreas Schwab Nov. 12, 2018, 2:52 p.m. UTC | #3
On Nov 12 2018, Michael Matz <matz@suse.de> wrote:

> Wouldn't this also break compiling code that contains power9 instructions 
> but guarded by runtime tests to only be executed on power9 machines?  That 
> seems a valid usecase, and it'd be bad if the assembler fails to compile 
> such.  (You can't use -mcpu=power9 as work around as the other 
> unguarded code is not supposed to be using power9 insns).

You'll need to put .machine directives around them.

Andreas.
Segher Boessenkool Nov. 12, 2018, 3:43 p.m. UTC | #4
On Mon, Nov 12, 2018 at 03:52:29PM +0100, Andreas Schwab wrote:
> On Nov 12 2018, Michael Matz <matz@suse.de> wrote:
> 
> > Wouldn't this also break compiling code that contains power9 instructions 
> > but guarded by runtime tests to only be executed on power9 machines?  That 
> > seems a valid usecase, and it'd be bad if the assembler fails to compile 
> > such.  (You can't use -mcpu=power9 as work around as the other 
> > unguarded code is not supposed to be using power9 insns).
> 
> You'll need to put .machine directives around them.

My worry with that is there may be too much legacy code that does not
do this :-(


Segher
Michael Matz Nov. 12, 2018, 4:17 p.m. UTC | #5
Hi,

On Mon, 12 Nov 2018, Segher Boessenkool wrote:

> > > Wouldn't this also break compiling code that contains power9 
> > > instructions but guarded by runtime tests to only be executed on 
> > > power9 machines?  That seems a valid usecase, and it'd be bad if the 
> > > assembler fails to compile such.  (You can't use -mcpu=power9 as 
> > > work around as the other unguarded code is not supposed to be using 
> > > power9 insns).
> > 
> > You'll need to put .machine directives around them.
> 
> My worry with that is there may be too much legacy code that does not do 
> this :-(

We'll see once we put gcc9 through a distro build.  My worry really only 
was that the change would result in compile breakage without a sensible 
solution.  (I'll just give all packages whose build failures prevent gcc9 
from being the new system compiler to Alan for fixing ;-) ).


Ciao,
Michael.
Peter Bergner Nov. 12, 2018, 5:50 p.m. UTC | #6
On 11/12/18 5:49 AM, Alan Modra wrote:
> I'd like to remove -many from the options passed by default to the
> assembler, on the grounds that a gcc bug in instruction selection (eg.
> emitting a power9 insn for -mcpu=power8) is better found at assembly
> time than run time.
> 
> This might annoy people for a while fixing user asm that we didn't
> diagnose previously, but I believe this is the right direction to go.
> Of course, -Wa,-many is available for anyone who just wants their
> dodgy old code to work.

+1

Peter
Alan Modra Nov. 12, 2018, 11:13 p.m. UTC | #7
On Mon, Nov 12, 2018 at 04:17:51PM +0000, Michael Matz wrote:
> Hi,
> 
> On Mon, 12 Nov 2018, Segher Boessenkool wrote:
> 
> > > > Wouldn't this also break compiling code that contains power9 
> > > > instructions but guarded by runtime tests to only be executed on 
> > > > power9 machines?  That seems a valid usecase, and it'd be bad if the 
> > > > assembler fails to compile such.  (You can't use -mcpu=power9 as 
> > > > work around as the other unguarded code is not supposed to be using 
> > > > power9 insns).
> > > 
> > > You'll need to put .machine directives around them.
> > 
> > My worry with that is there may be too much legacy code that does not do 
> > this :-(
> 
> We'll see once we put gcc9 through a distro build.  My worry really only 
> was that the change would result in compile breakage without a sensible 
> solution.  (I'll just give all packages whose build failures prevent gcc9 
> from being the new system compiler to Alan for fixing ;-) ).

Heh.  I've been using the patch (or one like it) myself for over 2
years, but of course I don't tend to compile whole distros.  The
length of time I've had it baking in my tree says something about my
hesitation to post the patch more than anything else.  Note that you
can easily "fix" package build failures by adding -Wa,-many to
CFLAGS.

For people developing new code, it's the right way to go, and
especially so for people working on gcc itself.  For people just
wanting stuff to compile, not so much.  I fully expect a chorus of
*MORON* or worse to come from the likes of the linux kernel rabble.
Mike Stump Nov. 13, 2018, 12:34 a.m. UTC | #8
On Nov 12, 2018, at 3:13 PM, Alan Modra <amodra@gmail.com> wrote:
> 
> For people developing new code, it's the right way to go, and
> especially so for people working on gcc itself.  For people just
> wanting stuff to compile, not so much.  I fully expect a chorus of
> *MORON* or worse to come from the likes of the linux kernel rabble.

So, if you just want to hear people whine...

On darwin, we (darwin, as a platform decision) like all instructions available from the assembler.  The assembler and the linker have specialized code to track all instructions used (from which CPU types those instructions come from), and mark the object file according to what is actually used.  We also have FAT binaries as a standard feature and other things to make everything play nicely.  People that use inline assembly are expected to know how to code, because it is an advanced feature, and not need hand holding on how to write the condition that guards the code.  I don't recall seeing any reports of anyone needing any extra help in this matter.  On darwin, there wasn't a .machine for a while, it came later.

Anyway, I thought about saying that it would be nice if all platforms behaved the same, and ask, what do people thing the recommended behavior of all platforms should be?

Personally I don't have a dog in this, as darwin cannot be changed, it's a platform feature, and personally, I don't write a ton of this type of code.  I just provide an alternate POV.  Darwin has api's to query the architecture and code in the assembler/linker to help manage it's decision.  Normal ELF systems, I want to say, usually lack such things.  So, choices it makes aren't necessarily right for others.
Iain Sandoe Nov. 13, 2018, 12:41 a.m. UTC | #9
> On 13 Nov 2018, at 00:34, Mike Stump <mikestump@comcast.net> wrote:
> 
> On Nov 12, 2018, at 3:13 PM, Alan Modra <amodra@gmail.com> wrote:
>> 
>> For people developing new code, it's the right way to go, and
>> especially so for people working on gcc itself.  For people just
>> wanting stuff to compile, not so much.  I fully expect a chorus of
>> *MORON* or worse to come from the likes of the linux kernel rabble.
> 
> So, if you just want to hear people whine...
> 
> On darwin, we (darwin, as a platform decision) like all instructions available from the assembler.  The assembler and the linker have specialized code to track all instructions used (from which CPU types those instructions come from), and mark the object file according to what is actually used.  We also have FAT binaries as a standard feature and other things to make everything play nicely.  People that use inline assembly are expected to know how to code, because it is an advanced feature, and not need hand holding on how to write the condition that guards the code.  I don't recall seeing any reports of anyone needing any extra help in this matter.  On darwin, there wasn't a .machine for a while, it came later.
> 
> Anyway, I thought about saying that it would be nice if all platforms behaved the same, and ask, what do people thing the recommended behavior of all platforms should be?
> 
> Personally I don't have a dog in this, as darwin cannot be changed, it's a platform feature, and personally, I don't write a ton of this type of code.  I just provide an alternate POV.  Darwin has api's to query the architecture and code in the assembler/linker to help manage it's decision.  Normal ELF systems, I want to say, usually lack such things.  So, choices it makes aren't necessarily right for others.

Given that we have our own assembler and platform equivalent of -many (-force_cpusubtype_ALL) .. I was just watching the thread go by ;) 

Having said that, it would be interesting to know what the recommendation is with .machine.

Iain
Alan Modra Nov. 13, 2018, 1:32 a.m. UTC | #10
On Mon, Nov 12, 2018 at 04:34:34PM -0800, Mike Stump wrote:
> On Nov 12, 2018, at 3:13 PM, Alan Modra <amodra@gmail.com> wrote:
> > 
> > For people developing new code, it's the right way to go, and
> > especially so for people working on gcc itself.  For people just
> > wanting stuff to compile, not so much.  I fully expect a chorus of
> > *MORON* or worse to come from the likes of the linux kernel rabble.
> 
> So, if you just want to hear people whine...

I'm happy to hear other points of view.  Ignore my hyperbole.

> On darwin, we (darwin, as a platform decision) like all instructions available from the assembler.

OK, fair enough.  Another option is to just disable -many when gcc is
in development, like we enable checking.
Segher Boessenkool Nov. 13, 2018, 11:17 a.m. UTC | #11
On Tue, Nov 13, 2018 at 12:02:55PM +1030, Alan Modra wrote:
> On Mon, Nov 12, 2018 at 04:34:34PM -0800, Mike Stump wrote:
> > On Nov 12, 2018, at 3:13 PM, Alan Modra <amodra@gmail.com> wrote:
> > > 
> > > For people developing new code, it's the right way to go, and
> > > especially so for people working on gcc itself.  For people just
> > > wanting stuff to compile, not so much.  I fully expect a chorus of
> > > *MORON* or worse to come from the likes of the linux kernel rabble.
> > 
> > So, if you just want to hear people whine...
> 
> I'm happy to hear other points of view.  Ignore my hyperbole.
> 
> > On darwin, we (darwin, as a platform decision) like all instructions available from the assembler.
> 
> OK, fair enough.  Another option is to just disable -many when gcc is
> in development, like we enable checking.

That is a good plan for GCC 9 at least.


Segher
Peter Bergner Nov. 13, 2018, 5:48 p.m. UTC | #12
On 11/13/18 5:17 AM, Segher Boessenkool wrote:
> On Tue, Nov 13, 2018 at 12:02:55PM +1030, Alan Modra wrote:
>> On Mon, Nov 12, 2018 at 04:34:34PM -0800, Mike Stump wrote:
>>> On Nov 12, 2018, at 3:13 PM, Alan Modra <amodra@gmail.com> wrote:
>>> On darwin, we (darwin, as a platform decision) like all instructions available from the assembler.
>>
>> OK, fair enough.  Another option is to just disable -many when gcc is
>> in development, like we enable checking.
> 
> That is a good plan for GCC 9 at least.

I like the plan too.  We can also continue to pass -many just for darwin
if they really really think they need it.

Peter
Iain Sandoe Nov. 13, 2018, 6:06 p.m. UTC | #13
Hi Folks,

> On 13 Nov 2018, at 17:48, Peter Bergner <bergner@linux.ibm.com> wrote:
> 
> On 11/13/18 5:17 AM, Segher Boessenkool wrote:
>> On Tue, Nov 13, 2018 at 12:02:55PM +1030, Alan Modra wrote:
>>> On Mon, Nov 12, 2018 at 04:34:34PM -0800, Mike Stump wrote:
>>>> On Nov 12, 2018, at 3:13 PM, Alan Modra <amodra@gmail.com> wrote:
>>>> On darwin, we (darwin, as a platform decision) like all instructions available from the assembler.
>>> 
>>> OK, fair enough.  Another option is to just disable -many when gcc is
>>> in development, like we enable checking.
>> 
>> That is a good plan for GCC 9 at least.
> 
> I like the plan too.  We can also continue to pass -many just for darwin
> if they really really think they need it.

As far as I expect, Darwin should be untouched by this - we have a separate assembler (which doesn’t even respond to -many), so unless there’s some higher level translation done (it’s not mentioned in any Darwin specs), we should just carry on as before.

When I do expect things to change is when multiple .machine directives are included in asm sources.
(probably) the old cctools assembler won’t deal with them properly
(the 4.0.1 era) LLVM-backend based version I have doesn’t deal with them either (this could be a general consideration for the other parts of the PPC toolchain).  Having said that, I didn’t experiment with .machine on later LLVM backend versions yet.

Thus, my current expectation is that this will be a NOP unless/until incompatible asm source changes are made.

Iain
Peter Bergner Nov. 13, 2018, 6:39 p.m. UTC | #14
On 11/13/18 12:06 PM, Iain Sandoe wrote:
> As far as I expect, Darwin should be untouched by this - we have a separate assembler (which doesn’t even respond to -many), so unless there’s some higher level translation done (it’s not mentioned in any Darwin specs), we should just carry on as before.

Ah, good then.

> When I do expect things to change is when multiple .machine directives are included in asm sources.
> (probably) the old cctools assembler won’t deal with them properly

Usually when there are multiple .machine's being used, they should be used
with the ".machine push" and ".machine pop" directives so the temporary
.machine value doesn't corrupt the .machine value being used for the rest
of the file.  Like so.

	.machine "power8"

	...

	.machine push
	.machine "power9"
	<power9 insns>
	.machine pop

	...

Hopefully the cctools supports that.

Peter
Alan Modra Nov. 14, 2018, 3:13 a.m. UTC | #15
On Tue, Nov 13, 2018 at 05:17:41AM -0600, Segher Boessenkool wrote:
> On Tue, Nov 13, 2018 at 12:02:55PM +1030, Alan Modra wrote:
> > OK, fair enough.  Another option is to just disable -many when gcc is
> > in development, like we enable checking.
> 
> That is a good plan for GCC 9 at least.

Here's the patch.  Bootstrapped etc. powerpc64le-linux with resultant
fail of clone2 test as already noted.  On top of
https://gcc.gnu.org/ml/gcc-patches/2018-11/msg00924.html so needs
to be hand edited if applying without that patch.  I'm going to be
away for a few days without email access, which means I probably won't
be seeing any replies until Monday.

	* config/rs6000/rs6000.h (ASM_OPT_ANY): Define.
	(ASM_CPU_SPEC): Conditionally add -many.
	* config/rs6000/aix61.h (ASM_CPU_SPEC): Likewise.
	* config/rs6000/aix71.h (ASM_CPU_SPEC): Likewise.
	* testsuite/gcc.target/powerpc/ppc32-abi-dfp-1.c: Don't use
	power mnemonics.

diff --git a/gcc/config/rs6000/aix61.h b/gcc/config/rs6000/aix61.h
index 353e5d6cfeb..809c5d8d599 100644
--- a/gcc/config/rs6000/aix61.h
+++ b/gcc/config/rs6000/aix61.h
@@ -91,8 +91,8 @@ do {									\
 %{mcpu=630: -m620} \
 %{mcpu=970: -m970} \
 %{mcpu=G5: -m970} \
-%{mvsx: %{!mcpu*: -mpwr6}} \
--many"
+%{mvsx: %{!mcpu*: -mpwr6}}" \
+ASM_OPT_ANY
 
 #undef	ASM_DEFAULT_SPEC
 #define ASM_DEFAULT_SPEC "-mpwr4"
diff --git a/gcc/config/rs6000/aix71.h b/gcc/config/rs6000/aix71.h
index 2398ed64baa..319bd2dc013 100644
--- a/gcc/config/rs6000/aix71.h
+++ b/gcc/config/rs6000/aix71.h
@@ -89,8 +89,8 @@ do {									\
 	    maltivec: -m970; \
 	    maix64|mpowerpc64: -mppc64; \
 	    : %(asm_default)}; \
-  :%eMissing -mcpu option in ASM_SPEC_CPU?\n} \
--many"
+  :%eMissing -mcpu option in ASM_SPEC_CPU?\n}" \
+ASM_OPT_ANY
 
 #undef	ASM_DEFAULT_SPEC
 #define ASM_DEFAULT_SPEC "-mpwr4"
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index d75137cf8f5..613d16add69 100644
--- a/gcc/config/rs6000/rs6000.h
+++ b/gcc/config/rs6000/rs6000.h
@@ -72,6 +72,12 @@
 #define PPC405_ERRATUM77 0
 #endif
 
+#if CHECKING_P
+#define ASM_OPT_ANY ""
+#else
+#define ASM_OPT_ANY " -many"
+#endif
+
 /* Common ASM definitions used by ASM_SPEC among the various targets for
    handling -mcpu=xxx switches.  There is a parallel list in driver-rs6000.c to
    provide the default assembler options if the user uses -mcpu=native, so if
@@ -137,8 +143,8 @@
 	    mvsx: -mpower7; \
 	    mpowerpc64: -mppc64;: %(asm_default)}; \
   :%eMissing -mcpu option in ASM_SPEC_CPU?\n} \
-%{mvsx: -mvsx -maltivec; maltivec: -maltivec} \
--many"
+%{mvsx: -mvsx -maltivec; maltivec: -maltivec}" \
+ASM_OPT_ANY
 
 #define CPP_DEFAULT_SPEC ""
 
diff --git a/gcc/testsuite/gcc.target/powerpc/ppc32-abi-dfp-1.c b/gcc/testsuite/gcc.target/powerpc/ppc32-abi-dfp-1.c
index 14908dba690..eea7f6ffc2e 100644
--- a/gcc/testsuite/gcc.target/powerpc/ppc32-abi-dfp-1.c
+++ b/gcc/testsuite/gcc.target/powerpc/ppc32-abi-dfp-1.c
@@ -45,14 +45,14 @@ __asm__ ("\t.globl\t" #NAME "_asm\n\t"					\
 	 #NAME "_asm:\n\t"						\
 	 "lis 11,gparms@ha\n\t"						\
 	 "la 11,gparms@l(11)\n\t"					\
-	 "st 3,0(11)\n\t"						\
-	 "st 4,4(11)\n\t"						\
-	 "st 5,8(11)\n\t"						\
-	 "st 6,12(11)\n\t"						\
-	 "st 7,16(11)\n\t"						\
-	 "st 8,20(11)\n\t"						\
-	 "st 9,24(11)\n\t"						\
-	 "st 10,28(11)\n\t"						\
+	 "stw 3,0(11)\n\t"						\
+	 "stw 4,4(11)\n\t"						\
+	 "stw 5,8(11)\n\t"						\
+	 "stw 6,12(11)\n\t"						\
+	 "stw 7,16(11)\n\t"						\
+	 "stw 8,20(11)\n\t"						\
+	 "stw 9,24(11)\n\t"						\
+	 "stw 10,28(11)\n\t"						\
 	 "stfd 1,32(11)\n\t"						\
 	 "stfd 2,40(11)\n\t"						\
 	 "stfd 3,48(11)\n\t"						\
Mike Stump Nov. 26, 2018, 11:03 p.m. UTC | #16
On Nov 13, 2018, at 10:39 AM, Peter Bergner <bergner@linux.ibm.com> wrote:
> 
> On 11/13/18 12:06 PM, Iain Sandoe wrote:
>> As far as I expect, Darwin should be untouched by this - we have a separate assembler (which doesn’t even respond to -many), so unless there’s some higher level translation done (it’s not mentioned in any Darwin specs), we should just carry on as before.
> 
> Ah, good then.
> 
>> When I do expect things to change is when multiple .machine directives are included in asm sources.
>> (probably) the old cctools assembler won’t deal with them properly
> 
> Usually when there are multiple .machine's being used, they should be used
> with the ".machine push" and ".machine pop" directives so the temporary
> .machine value doesn't corrupt the .machine value being used for the rest
> of the file.

> Hopefully the cctools supports that.

Likely not.  The modern tools don't for x86_64.
Alan Modra Dec. 13, 2018, 10:26 a.m. UTC | #17
On Wed, Nov 14, 2018 at 01:43:57PM +1030, Alan Modra wrote:
> On Tue, Nov 13, 2018 at 05:17:41AM -0600, Segher Boessenkool wrote:
> > On Tue, Nov 13, 2018 at 12:02:55PM +1030, Alan Modra wrote:
> > > OK, fair enough.  Another option is to just disable -many when gcc is
> > > in development, like we enable checking.
> > 
> > That is a good plan for GCC 9 at least.
> 
> Here's the patch.  Bootstrapped etc. powerpc64le-linux with resultant
> fail of clone2 test as already noted.

Revised again, with a bunch of related issues solved.  Bootstrapped
etc. powerpc64le-linux with no regressions.  OK to apply mainline?

---
I'd like to remove -many from the options passed by default to the
assembler, on the grounds that a gcc bug in instruction selection (eg.
emitting a power9 insn for -mcpu=power8) is better found at assembly
time than run time.

For now, just do this when --enable-checking or gcc is not a release.

In contrast to the previous patch, I haven't changed any of the AIX
header files in this patch.  So AIX gcc will continue to pass -many to
their assembler until someone else (David?) makes that change.  This
patch also emits .machine assembler directives for ELF targets when
functions are compiled for different cpus via attributes or pragmas.
That's necessary when the initial -m<cpu> option passed to the
assembler doesn't enable the superset of all opcodes emitted, as seen
by the earlier failure of gcc.target/powerpc/clone2.c (without
.machine) when building gcc for power8.

O3-pr70130.c also failed on an earlier version of this patch (when
only testing one ISA bit to determine .machine).  This is a test for a
power7 vector bug, but on power8 hw check_vect_support_and_set_flags
passes -mpower8-vector which means the test isn't exercising the
original bug exactly.  I reckon that is wrong, and similary for other
vector testcases that ask for a specific cpu.  I've fixed it here by
explicitly passing -mno-power8-vector and similar vector options.

	* config/rs6000/rs6000.h (ASM_OPT_ANY): Define.
	(ASM_CPU_SPEC): Conditionally add -many.
	* config/rs6000/rs6000.c (rs6000_machine): New static var.
	(rs6000_machine_from_flags, emit_asm_machine): New functions..
	(rs6000_file_start): ..extracted from here, and modified to
	test all ISA bits.
	(rs6000_output_function_prologue): Emit .machine as necessary.
	* testsuite/gcc.target/powerpc/ppc32-abi-dfp-1.c: Don't use
	power mnemonics.
	* testsuite/gcc.dg/vect/O3-pr70130.c: Disable default options
	added by check_vect_support_and_set_flags.
	* testsuite/gcc.dg/vect/pr48765.c: Likewise.
	* testsuite/gfortran.dg/vect/pr45714-b.f: Likewise.

diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index f774e2d0bf7..4ca68d0a1d1 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -5715,6 +5715,36 @@ rs6000_builtin_md_vectorized_function (tree fndecl, tree type_out,
 /* Default CPU string for rs6000*_file_start functions.  */
 static const char *rs6000_default_cpu;
 
+#ifdef USING_ELFOS_H
+static const char *rs6000_machine;
+
+static const char *
+rs6000_machine_from_flags (void)
+{
+  if ((rs6000_isa_flags & (ISA_3_0_MASKS_SERVER ^ ISA_2_7_MASKS_SERVER)) != 0)
+    return "power9";
+  if ((rs6000_isa_flags & (ISA_2_7_MASKS_SERVER ^ ISA_2_6_MASKS_SERVER)) != 0)
+    return "power8";
+  if ((rs6000_isa_flags & (ISA_2_6_MASKS_SERVER ^ ISA_2_5_MASKS_SERVER)) != 0)
+    return "power7";
+  if ((rs6000_isa_flags & (ISA_2_5_MASKS_SERVER ^ ISA_2_4_MASKS)) != 0)
+    return "power6";
+  if ((rs6000_isa_flags & (ISA_2_4_MASKS ^ ISA_2_1_MASKS)) != 0)
+    return "power5";
+  if ((rs6000_isa_flags & ISA_2_1_MASKS) != 0)
+    return "power4";
+  if ((rs6000_isa_flags & OPTION_MASK_POWERPC64) != 0)
+    return "ppc64";
+  return "ppc";
+}
+
+static void
+emit_asm_machine (void)
+{
+  fprintf (asm_out_file, "\t.machine %s\n", rs6000_machine);
+}
+#endif
+
 /* Do anything needed at the start of the asm file.  */
 
 static void
@@ -5780,27 +5810,10 @@ rs6000_file_start (void)
     }
 
 #ifdef USING_ELFOS_H
+  rs6000_machine = rs6000_machine_from_flags ();
   if (!(rs6000_default_cpu && rs6000_default_cpu[0])
       && !global_options_set.x_rs6000_cpu_index)
-    {
-      fputs ("\t.machine ", asm_out_file);
-      if ((rs6000_isa_flags & OPTION_MASK_MODULO) != 0)
-	fputs ("power9\n", asm_out_file);
-      else if ((rs6000_isa_flags & OPTION_MASK_DIRECT_MOVE) != 0)
-	fputs ("power8\n", asm_out_file);
-      else if ((rs6000_isa_flags & OPTION_MASK_POPCNTD) != 0)
-	fputs ("power7\n", asm_out_file);
-      else if ((rs6000_isa_flags & OPTION_MASK_CMPB) != 0)
-	fputs ("power6\n", asm_out_file);
-      else if ((rs6000_isa_flags & OPTION_MASK_POPCNTB) != 0)
-	fputs ("power5\n", asm_out_file);
-      else if ((rs6000_isa_flags & OPTION_MASK_MFCRF) != 0)
-	fputs ("power4\n", asm_out_file);
-      else if ((rs6000_isa_flags & OPTION_MASK_POWERPC64) != 0)
-	fputs ("ppc64\n", asm_out_file);
-      else
-	fputs ("ppc\n", asm_out_file);
-    }
+    emit_asm_machine ();
 #endif
 
   if (DEFAULT_ABI == ABI_ELFv2)
@@ -27757,7 +27770,17 @@ static void
 rs6000_output_function_prologue (FILE *file)
 {
   if (!cfun->is_thunk)
-    rs6000_output_savres_externs (file);
+    {
+      rs6000_output_savres_externs (file);
+#ifdef USING_ELFOS_H
+      const char *curr_machine = rs6000_machine_from_flags ();
+      if (rs6000_machine != curr_machine)
+	{
+	  rs6000_machine = curr_machine;
+	  emit_asm_machine ();
+	}
+#endif
+    }
 
   /* ELFv2 ABI r2 setup code and local entry point.  This must follow
      immediately after the global entry point label.  */
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index e7e998d1492..2e2d253705b 100644
--- a/gcc/config/rs6000/rs6000.h
+++ b/gcc/config/rs6000/rs6000.h
@@ -70,6 +70,12 @@
 #define PPC405_ERRATUM77 0
 #endif
 
+#if CHECKING_P
+#define ASM_OPT_ANY ""
+#else
+#define ASM_OPT_ANY " -many"
+#endif
+
 /* Common ASM definitions used by ASM_SPEC among the various targets for
    handling -mcpu=xxx switches.  There is a parallel list in driver-rs6000.c to
    provide the default assembler options if the user uses -mcpu=native, so if
@@ -137,8 +143,8 @@
 	    mvsx: -mpower7; \
 	    mpowerpc64: -mppc64;: %(asm_default)}; \
   :%eMissing -mcpu option in ASM_CPU_SPEC?\n} \
-%{mvsx: -mvsx -maltivec; maltivec: -maltivec} \
--many"
+%{mvsx: -mvsx -maltivec; maltivec: -maltivec}" \
+ASM_OPT_ANY
 
 #define CPP_DEFAULT_SPEC ""
 
diff --git a/gcc/testsuite/gcc.dg/vect/O3-pr70130.c b/gcc/testsuite/gcc.dg/vect/O3-pr70130.c
index 18a295c83f0..f8b84405140 100644
--- a/gcc/testsuite/gcc.dg/vect/O3-pr70130.c
+++ b/gcc/testsuite/gcc.dg/vect/O3-pr70130.c
@@ -1,5 +1,5 @@
 /* { dg-require-effective-target vsx_hw { target powerpc*-*-* } } */
-/* { dg-additional-options "-mcpu=power7" { target powerpc*-*-* } } */
+/* { dg-additional-options "-mcpu=power7 -mno-power9-vector -mno-power8-vector" { target powerpc*-*-* } } */
 
 #include "tree-vect.h"
 
diff --git a/gcc/testsuite/gcc.dg/vect/pr48765.c b/gcc/testsuite/gcc.dg/vect/pr48765.c
index ae364379d07..b091a145d0f 100644
--- a/gcc/testsuite/gcc.dg/vect/pr48765.c
+++ b/gcc/testsuite/gcc.dg/vect/pr48765.c
@@ -1,6 +1,6 @@
 /* { dg-do compile { target { powerpc*-*-* } } } */
 /* { dg-skip-if "do not override -mcpu" { *-*-* } { "-mcpu=*" } { "-mcpu=power6" } } */
-/* { dg-additional-options "-O3 -mcpu=power6" } */
+/* { dg-additional-options "-O3 -mcpu=power6 -mno-power9-vector -mno-power8-vector -mno-vsx" } */
 
 enum reg_class
 {
diff --git a/gcc/testsuite/gcc.target/powerpc/ppc32-abi-dfp-1.c b/gcc/testsuite/gcc.target/powerpc/ppc32-abi-dfp-1.c
index 14908dba690..eea7f6ffc2e 100644
--- a/gcc/testsuite/gcc.target/powerpc/ppc32-abi-dfp-1.c
+++ b/gcc/testsuite/gcc.target/powerpc/ppc32-abi-dfp-1.c
@@ -45,14 +45,14 @@ __asm__ ("\t.globl\t" #NAME "_asm\n\t"					\
 	 #NAME "_asm:\n\t"						\
 	 "lis 11,gparms@ha\n\t"						\
 	 "la 11,gparms@l(11)\n\t"					\
-	 "st 3,0(11)\n\t"						\
-	 "st 4,4(11)\n\t"						\
-	 "st 5,8(11)\n\t"						\
-	 "st 6,12(11)\n\t"						\
-	 "st 7,16(11)\n\t"						\
-	 "st 8,20(11)\n\t"						\
-	 "st 9,24(11)\n\t"						\
-	 "st 10,28(11)\n\t"						\
+	 "stw 3,0(11)\n\t"						\
+	 "stw 4,4(11)\n\t"						\
+	 "stw 5,8(11)\n\t"						\
+	 "stw 6,12(11)\n\t"						\
+	 "stw 7,16(11)\n\t"						\
+	 "stw 8,20(11)\n\t"						\
+	 "stw 9,24(11)\n\t"						\
+	 "stw 10,28(11)\n\t"						\
 	 "stfd 1,32(11)\n\t"						\
 	 "stfd 2,40(11)\n\t"						\
 	 "stfd 3,48(11)\n\t"						\
diff --git a/gcc/testsuite/gfortran.dg/vect/pr45714-b.f b/gcc/testsuite/gfortran.dg/vect/pr45714-b.f
index 0d00c6fd666..abf33cd25b8 100644
--- a/gcc/testsuite/gfortran.dg/vect/pr45714-b.f
+++ b/gcc/testsuite/gfortran.dg/vect/pr45714-b.f
@@ -1,5 +1,5 @@
 ! { dg-do compile { target powerpc*-*-* } }
-! { dg-additional-options "-O3 -mcpu=power7 -ffast-math -mveclibabi=mass" }
+! { dg-additional-options "-O3 -mcpu=power7 -mno-power9-vector -mno-power8-vector -ffast-math -mveclibabi=mass" }
 
       integer index(18),i,j,k,l,ipiv(18),info,ichange,neq,lda,ldb,
      &  nrhs,iplas
David Edelsohn Dec. 13, 2018, 3:02 p.m. UTC | #18
On Thu, Dec 13, 2018 at 5:26 AM Alan Modra <amodra@gmail.com> wrote:
>
> On Wed, Nov 14, 2018 at 01:43:57PM +1030, Alan Modra wrote:
> > On Tue, Nov 13, 2018 at 05:17:41AM -0600, Segher Boessenkool wrote:
> > > On Tue, Nov 13, 2018 at 12:02:55PM +1030, Alan Modra wrote:
> > > > OK, fair enough.  Another option is to just disable -many when gcc is
> > > > in development, like we enable checking.
> > >
> > > That is a good plan for GCC 9 at least.
> >
> > Here's the patch.  Bootstrapped etc. powerpc64le-linux with resultant
> > fail of clone2 test as already noted.
>
> Revised again, with a bunch of related issues solved.  Bootstrapped
> etc. powerpc64le-linux with no regressions.  OK to apply mainline?
>
> ---
> I'd like to remove -many from the options passed by default to the
> assembler, on the grounds that a gcc bug in instruction selection (eg.
> emitting a power9 insn for -mcpu=power8) is better found at assembly
> time than run time.
>
> For now, just do this when --enable-checking or gcc is not a release.
>
> In contrast to the previous patch, I haven't changed any of the AIX
> header files in this patch.  So AIX gcc will continue to pass -many to
> their assembler until someone else (David?) makes that change.  This
> patch also emits .machine assembler directives for ELF targets when
> functions are compiled for different cpus via attributes or pragmas.
> That's necessary when the initial -m<cpu> option passed to the
> assembler doesn't enable the superset of all opcodes emitted, as seen
> by the earlier failure of gcc.target/powerpc/clone2.c (without
> .machine) when building gcc for power8.

The AIX release schedule and numbering of releases to support new
processors is making it impossible to reliably predict which
directives (processor names) will be supported on a system on which
GCC is installed.  It's safer to hide the problem on AIX with the use
of -many.

Thanks, David
diff mbox series

Patch

diff --git a/gcc/config/rs6000/aix61.h b/gcc/config/rs6000/aix61.h
index 353e5d6cfeb..a7a8246bfe3 100644
--- a/gcc/config/rs6000/aix61.h
+++ b/gcc/config/rs6000/aix61.h
@@ -91,8 +91,7 @@  do {									\
 %{mcpu=630: -m620} \
 %{mcpu=970: -m970} \
 %{mcpu=G5: -m970} \
-%{mvsx: %{!mcpu*: -mpwr6}} \
--many"
+%{mvsx: %{!mcpu*: -mpwr6}}"
 
 #undef	ASM_DEFAULT_SPEC
 #define ASM_DEFAULT_SPEC "-mpwr4"
diff --git a/gcc/config/rs6000/aix71.h b/gcc/config/rs6000/aix71.h
index 2398ed64baa..d2ca8dc275d 100644
--- a/gcc/config/rs6000/aix71.h
+++ b/gcc/config/rs6000/aix71.h
@@ -89,8 +89,7 @@  do {									\
 	    maltivec: -m970; \
 	    maix64|mpowerpc64: -mppc64; \
 	    : %(asm_default)}; \
-  :%eMissing -mcpu option in ASM_SPEC_CPU?\n} \
--many"
+  :%eMissing -mcpu option in ASM_SPEC_CPU?\n}"
 
 #undef	ASM_DEFAULT_SPEC
 #define ASM_DEFAULT_SPEC "-mpwr4"
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index d75137cf8f5..9d78173a680 100644
--- a/gcc/config/rs6000/rs6000.h
+++ b/gcc/config/rs6000/rs6000.h
@@ -137,8 +137,7 @@ 
 	    mvsx: -mpower7; \
 	    mpowerpc64: -mppc64;: %(asm_default)}; \
   :%eMissing -mcpu option in ASM_SPEC_CPU?\n} \
-%{mvsx: -mvsx -maltivec; maltivec: -maltivec} \
--many"
+%{mvsx: -mvsx -maltivec; maltivec: -maltivec}"
 
 #define CPP_DEFAULT_SPEC ""
 
diff --git a/gcc/testsuite/gcc.target/powerpc/ppc32-abi-dfp-1.c b/gcc/testsuite/gcc.target/powerpc/ppc32-abi-dfp-1.c
index 14908dba690..eea7f6ffc2e 100644
--- a/gcc/testsuite/gcc.target/powerpc/ppc32-abi-dfp-1.c
+++ b/gcc/testsuite/gcc.target/powerpc/ppc32-abi-dfp-1.c
@@ -45,14 +45,14 @@  __asm__ ("\t.globl\t" #NAME "_asm\n\t"					\
 	 #NAME "_asm:\n\t"						\
 	 "lis 11,gparms@ha\n\t"						\
 	 "la 11,gparms@l(11)\n\t"					\
-	 "st 3,0(11)\n\t"						\
-	 "st 4,4(11)\n\t"						\
-	 "st 5,8(11)\n\t"						\
-	 "st 6,12(11)\n\t"						\
-	 "st 7,16(11)\n\t"						\
-	 "st 8,20(11)\n\t"						\
-	 "st 9,24(11)\n\t"						\
-	 "st 10,28(11)\n\t"						\
+	 "stw 3,0(11)\n\t"						\
+	 "stw 4,4(11)\n\t"						\
+	 "stw 5,8(11)\n\t"						\
+	 "stw 6,12(11)\n\t"						\
+	 "stw 7,16(11)\n\t"						\
+	 "stw 8,20(11)\n\t"						\
+	 "stw 9,24(11)\n\t"						\
+	 "stw 10,28(11)\n\t"						\
 	 "stfd 1,32(11)\n\t"						\
 	 "stfd 2,40(11)\n\t"						\
 	 "stfd 3,48(11)\n\t"						\