On Wed, Sep 30, 2020 at 11:32:55AM +0200, Jakub Jelinek wrote: > On Mon, Sep 28, 2020 at 09:50:00PM +0200, Stefan Schulze Frielinghaus via > Gcc-patches wrote: > > This patch breaks quite a view test cases (target-attribute/tattr-*) on > > IBM Z. Having a look at function cl_target_option_restore reveals that > > some members of opts_set are reduced to 1 or 0 depending on whether a > > member was set before or not, e.g. for target_flags we have > > I've tried to reproduce the tattr FAILs reported in > https://gcc.gnu.org/pipermail/gcc-testresults/2020-September/608760.html > in a cross-compiler (with > #define HAVE_AS_MACHINE_MACHINEMODE 1 > ), but couldn't, neither the ICEs nor the scan-assembler failures. > Anyway, could you do a side-by-side debugging of one of those failures > before/after my change and see what behaves differently?
I think the problem boils down that on S/390 we distinguish between four states of a flag: explicitely set to yes/no and implicitely set to yes/no. If set explicitely, the option wins. For example, the options `-march=z10 -mhtm` should enable the hardware transactional memory option although z10 does not have one. In the past if a flag was set or not explicitely was encoded into opts_set->x_target_flags ... for each flag individually, e.g. TARGET_OPT_HTM_P (opts_set->x_target_flags) was used. This has changed with the mentioned patch in the sense that opts_set encodes whether any flag of x_target_flags was set or not but not which individual one after a call to the generated function cl_target_option_restore where we have: opts_set->x_target_flags = (mask & 1) != 0; Compiling the following program #pragma GCC target ("arch=z10") void fn_pragma_0 (void) { } with options `-march=z13 -mzarch -mhtm -mdebug` produces different flags for 4ac7b669580 (commit prior your patch) and ba948b37768 (your patch). This is my current understanding of the option handling. I will try to come up with a trace where these things become hopefully more clear. Cheers, Stefan