On Wed, Aug 23, 2017 at 12:18 PM, Richard Biener <rguent...@suse.de> wrote:
> On Wed, 23 Aug 2017, Uros Bizjak wrote:
>
>> On Wed, Aug 23, 2017 at 11:55 AM, Richard Biener <rguent...@suse.de> wrote:
>> > On Wed, 23 Aug 2017, Uros Bizjak wrote:
>> >
>> >> On Wed, Aug 23, 2017 at 11:40 AM, Uros Bizjak <ubiz...@gmail.com> wrote:
>> >> > On Wed, Aug 23, 2017 at 11:22 AM, Richard Biener <rguent...@suse.de> 
>> >> > wrote:
>> >> >>> >  /* If the machine does not have a case insn that compares the 
>> >> >>> > bounds,
>> >> >>> > Index: gcc/config/i386/i386.c
>> >> >>> > ===================================================================
>> >> >>> > --- gcc/config/i386/i386.c      (revision 251275)
>> >> >>> > +++ gcc/config/i386/i386.c      (working copy)
>> >> >>> > @@ -7369,7 +7369,8 @@ ix86_valid_target_attribute_tree (tree a
>> >> >>> >        || opts->x_target_flags != def->x_target_flags
>> >> >>> >        || option_strings[IX86_FUNCTION_SPECIFIC_ARCH]
>> >> >>> >        || option_strings[IX86_FUNCTION_SPECIFIC_TUNE]
>> >> >>> > -      || enum_opts_set.x_ix86_fpmath)
>> >> >>> > +      || enum_opts_set.x_ix86_fpmath
>> >> >>> > +      || !TARGET_64BIT_P (opts->x_ix86_isa_flags))
>> >> >>>
>> >> >>> You should use (!TARGET_64BIT_P ... && TARGET_SSE_P ...) to match the
>> >> >>> condition in the special fpmath processing part. (BTW: The comment in
>> >> >>> that part is wrong, we need SSE, not sse2 on 32-bit targets to use SSE
>> >> >>> math.)
>> >> >>
>> >> >> Hmpf, with the change I again run into the libgo bootstrap fail
>> >> >> (appearantly my reduced testcase is incomplete)
>> >> >>
>> >> >> libtool: compile:  /abuild/rguenther/obj2/./gcc/xgcc
>> >> >> -B/abuild/rguenther/obj2/./gcc/ -B/usr/local/x86_64-pc-linux-gnu/bin/
>> >> >> -B/usr/local/x86_64-pc-linux-gnu/lib/ -isystem
>> >> >> /usr/local/x86_64-pc-linux-gnu/include -isystem
>> >> >> /usr/local/x86_64-pc-linux-gnu/sys-include -m32 -DHAVE_CONFIG_H -I.
>> >> >> -I/space/rguenther/src/svn/trunk2/libgo -I
>> >> >> /space/rguenther/src/svn/trunk2/libgo/runtime
>> >> >> -I/space/rguenther/src/svn/trunk2/libgo/../libffi/include
>> >> >> -I../libffi/include -pthread -fexceptions -fnon-call-exceptions
>> >> >> -fplan9-extensions -fsplit-stack -Wall -Wextra -Wwrite-strings 
>> >> >> -Wcast-qual
>> >> >> -Werror -minline-all-stringops -D_GNU_SOURCE -D_LARGEFILE_SOURCE
>> >> >> -D_FILE_OFFSET_BITS=64 -I 
>> >> >> /space/rguenther/src/svn/trunk2/libgo/../libgcc
>> >> >> -I /space/rguenther/src/svn/trunk2/libgo/../libbacktrace -I
>> >> >> ../../../gcc/include -g -O2 -m32 -MT aeshash.lo -MD -MP -MF
>> >> >> .deps/aeshash.Tpo -c
>> >> >> /space/rguenther/src/svn/trunk2/libgo/runtime/aeshash.c  -fPIC -DPIC -o
>> >> >> .libs/aeshash.o
>> >> >> In file included from
>> >> >> /space/rguenther/src/svn/trunk2/libgo/runtime/aeshash.c:17:0:
>> >> >> /space/rguenther/src/svn/trunk2/libgo/runtime/aeshash.c: In function
>> >> >> ‘aeshashbody’:
>> >> >> /abuild/rguenther/obj2/./gcc/include/emmintrin.h:700:1: error: inlining
>> >> >> failed in call to always_inline ‘_mm_loadu_si128’: target specific 
>> >> >> option
>> >> >> mismatch
>> >> >>  _mm_loadu_si128 (__m128i_u const *__P)
>> >> >>  ^~~~~~~~~~~~~~~
>> >> >> /space/rguenther/src/svn/trunk2/libgo/runtime/aeshash.c:387:11: note:
>> >> >> called from here
>> >> >>   mseed ^= _mm_loadu_si128(aeskeysched.__values);
>> >> >>            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> >> >>
>> >> >> that appens even with making the if a if (1).  The check we run into
>> >> >> is somehow still
>> >> >>
>> >> >>   else if (caller_opts->x_ix86_fpmath != callee_opts->x_ix86_fpmath)
>> >> >>     ret = false;
>> >> >>
>> >> >> ah ...
>> >> >>
>> >> >> #ifndef __SSE__
>> >> >> #pragma GCC push_options
>> >> >> #pragma GCC target("sse")
>> >> >> #define __DISABLE_SSE__
>> >> >> #endif /* __SSE__ */
>> >> >>
>> >> >> but on x86_64 when building with -m32 we _do_ have __SSE__ set so
>> >> >> the intrinsics get target_option_default_node which doesn't have
>> >> >> fmpath=sse.  So x86_64 -m32 -march=i586 enables SSE math for
>> >> >> the intrinsics while x86_64 -m32 [-march=x86-64] does not...
>> >> >
>> >> > IMO target_default_node should already enable fpmath=sse. When SSE is
>> >> > available, fpmath should be set to SSE, unless there is fpmath option
>> >> > specified.
>> >>
>> >> Following part from ix86_option_override_internal looks a bit mismatched:
>> >>
>> >> --cut here--
>> >>   /* For all chips supporting SSE2, -mfpmath=sse performs better than
>> >>      fpmath=387.  The second is however default at many targets since the
>> >>      extra 80bit precision of temporaries is considered to be part of ABI.
>> >>      Overwrite the default at least for -ffast-math.
>> >>      TODO: -mfpmath=both seems to produce same performing code with bit
>> >>      smaller binaries.  It is however not clear if register allocation is
>> >>      ready for this setting.
>> >>      Also -mfpmath=387 is overall a lot more compact (bout 4-5%) than SSE
>> >>      codegen.  We may switch to 387 with -ffast-math for size optimized
>> >>      functions. */
>> >>   else if (fast_math_flags_set_p (&global_options)
>> >>        && TARGET_SSE2_P (opts->x_ix86_isa_flags))
>> >>     opts->x_ix86_fpmath = FPMATH_SSE;
>> >> --cut here--
>> >>
>> >> We probably have to set fpmath to SSE also for (!TARGET_64BIT_P ... &&
>> >> TARGET_SSE_P ...).
>> >
>> > The comment says we can't because 387 math is considered part of the ABI.
>>
>> Then ix86_valid_target_attribute_tree needs to set fpmath in the same
>> way to avoid fpmath mismatch, probably using TARGET_FPMATH_DEFAULT.
>
> Or keep it at the global opts level?

Yep, ix86_option_override_internal will later do its magic. Needs some
testing, though.

Uros.

> @@ -7398,16 +7400,6 @@ ix86_valid_target_attribute_tree (tree a
>        /* If fpmath= is not set, and we now have sse2 on 32-bit, use it.
> */
>        if (enum_opts_set.x_ix86_fpmath)
>         opts_set->x_ix86_fpmath = (enum fpmath_unit) 1;
> -      else if (!TARGET_64BIT_P (opts->x_ix86_isa_flags)
> -              && TARGET_SSE_P (opts->x_ix86_isa_flags))
> -       {
> -         if (TARGET_80387_P (opts->x_target_flags))
> -           opts->x_ix86_fpmath = (enum fpmath_unit) (FPMATH_SSE
> -                                                     | FPMATH_387);
> -         else
> -           opts->x_ix86_fpmath = (enum fpmath_unit) FPMATH_SSE;
> -         opts_set->x_ix86_fpmath = (enum fpmath_unit) 1;
> -       }
>
>        /* Do any overrides, such as arch=xxx, or tune=xxx support.  */
>        bool r = ix86_option_override_internal (false, opts, opts_set);
>
>
>> Uros.
>>
>>
>
> --
> Richard Biener <rguent...@suse.de>
> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 
> 21284 (AG Nuernberg)

Reply via email to