# Copyright (C) 2004-2022 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.

# GCC testsuite that uses the 'dg.exp' driver.

# There's a bunch of headers we need.
if [is_remote host] {
    foreach header [glob -nocomplain $srcdir/$subdir/*.{h,def} ] {
        remote_download host $header
    }
}

# Load support procs.
load_lib g++-dg.exp
load_lib target-supports.exp

# If the target system supports vector instructions, the default action
# for a test is 'run', otherwise it's 'compile'.  Save current default.
# Executing vector instructions on a system without hardware vector support
# is also disabled by a call to check_vect, but disabling execution here is
# more efficient.
global dg-do-what-default
set save-dg-do-what-default ${dg-do-what-default}

# Set up flags used for tests that don't specify options.
global DEFAULT_VECTCFLAGS
set DEFAULT_VECTCFLAGS ""

# Set up a list of effective targets to run vector tests for all supported
# targets.
global EFFECTIVE_TARGETS
set EFFECTIVE_TARGETS ""

# These flags are used for all targets.
lappend DEFAULT_VECTCFLAGS "-O2" "-ftree-vectorize" "-fno-vect-cost-model"

# Skip these tests for targets that do not support generating vector
# code.  Set additional target-dependent vector flags, which can be
# overridden by using dg-options in individual tests.
if ![check_vect_support_and_set_flags] {
    return
}

set VECT_SLP_CFLAGS $DEFAULT_VECTCFLAGS

lappend DEFAULT_VECTCFLAGS "-fdump-tree-vect-details"
lappend VECT_SLP_CFLAGS "-fdump-tree-slp-details"

# Initialize `dg'.
dg-init

# Main loop.
et-dg-runtest g++-dg-runtest [lsort [glob -nocomplain \
	$srcdir/$subdir/{pr,simd}*.{c,cc,S} ]] "" $DEFAULT_VECTCFLAGS
et-dg-runtest g++-dg-runtest [lsort [glob -nocomplain \
	$srcdir/$subdir/slp-pr*.{c,cc,S} ]] "" $VECT_SLP_CFLAGS

#### Tests with special options
global SAVED_DEFAULT_VECTCFLAGS
set SAVED_DEFAULT_VECTCFLAGS $DEFAULT_VECTCFLAGS
    
# --param max-aliased-vops=0
set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS
lappend DEFAULT_VECTCFLAGS "--param max-aliased-vops=0"
et-dg-runtest g++-dg-runtest [lsort [glob -nocomplain \
	$srcdir/$subdir/param-max-aliased*.\[cS\]]] "" $DEFAULT_VECTCFLAGS

# Clean up.
set dg-do-what-default ${save-dg-do-what-default} 

# All done.
dg-finish
