Compare commits

...

31 Commits

Author SHA1 Message Date
Gregory Becker
f932135f08 node_flag_propagation_candidate: special cases for multiple node attrs 2024-01-26 00:26:06 -08:00
RikkiButler20
b7e7db4890 [@spackbot] updating style on behalf of RikkiButler20 2024-01-16 18:34:04 +00:00
Kayla Butler
f4762cfe7b Fix attribute error
Compiler flag test still fail
2023-11-17 13:51:25 -08:00
Richarda Butler
be5f1bd9d7
Merge branch 'develop' into bugfix/compiler-flag-propagation 2023-11-07 13:11:46 -08:00
Kayla Butler
dbb36dbbf1 Change method name 2023-11-07 12:32:00 -08:00
RikkiButler20
88368dea40 [@spackbot] updating style on behalf of RikkiButler20 2023-11-02 02:25:24 +00:00
Kayla Butler
968223758a Update & add test
Test for propagating compiler flags that aren't the root spec
2023-11-01 18:47:49 -07:00
Kayla Butler
177976b762 Remove compiler flag propagation from concretize.lp 2023-10-20 15:02:46 -07:00
Kayla Butler
3c9bac5861 Create a separate file for compiler flag propagation 2023-10-20 12:00:05 -07:00
Kayla Butler
b8c373f51e Check all dependencies for test 2023-10-05 11:03:48 -07:00
Kayla Butler
a27da63d3e Change test to widen spec checks 2023-10-05 09:41:07 -07:00
Kayla Butler
8a825667e4 Specify that Packages are PackageNodes 2023-10-05 09:25:58 -07:00
Richarda Butler
9db3d9dd6a
Merge branch 'develop' into bugfix/compiler-flag-propagation 2023-09-29 13:35:38 -07:00
Richarda Butler
69bbccef6e
Merge branch 'develop' into bugfix/compiler-flag-propagation 2023-09-28 14:38:54 -07:00
Richarda Butler
4bf6325930
Merge branch 'develop' into bugfix/compiler-flag-propagation 2023-09-25 08:37:41 -07:00
Richarda Butler
8a56c096d3
Merge branch 'develop' into bugfix/compiler-flag-propagation 2023-09-11 13:27:25 -07:00
Richarda Butler
8760d3885a
Merge branch 'develop' into bugfix/compiler-flag-propagation 2023-09-07 13:52:08 -07:00
Richarda Butler
1740c575a2
Merge branch 'develop' into bugfix/compiler-flag-propagation 2023-09-06 11:05:17 -07:00
Richarda Butler
d882116f75
Merge branch 'develop' into bugfix/compiler-flag-propagation 2023-09-05 09:20:32 -07:00
Richarda Butler
90393b77d9
Merge branch 'develop' into bugfix/compiler-flag-propagation 2023-08-31 09:20:48 -07:00
Richarda Butler
2096f35f76
Merge branch 'develop' into bugfix/compiler-flag-propagation 2023-08-30 14:27:36 -07:00
Kayla Butler
8897e1e11f Only specified compiler flag propagates 2023-08-29 13:18:12 -07:00
Kayla Butler
f0df745f54 Make sure literals have the right node id when propagating 2023-08-28 15:07:16 -07:00
RikkiButler20
06c516c580 [@spackbot] updating style on behalf of RikkiButler20 2023-08-24 15:24:06 -07:00
Kayla Butler
0d9b416bc5 Check that compiler flags can propagate 2023-08-24 15:22:50 -07:00
Kayla Butler
a9be08f560 Make sure to get the value from source package 2023-08-24 15:16:04 -07:00
Kayla Butler
eb62129654 Fix error in concretizer 2023-08-24 15:16:03 -07:00
Kayla Butler
92ff8cfd45 Simplify node_flag_propagate and propagate past 1st level dependencies 2023-08-24 15:14:53 -07:00
Kayla Butler
b0d13f8fcc Making compiler flag propagation test uniform 2023-08-24 14:49:57 -07:00
Kayla Butler
e101c77768 Change test for not passing compiler flag 2023-08-24 14:49:56 -07:00
Kayla Butler
fe5ea193fc Updating test and put in a fix 2023-08-24 14:42:57 -07:00
4 changed files with 113 additions and 40 deletions

View File

@ -948,6 +948,12 @@ def visit(node):
self.control.load(os.path.join(parent_dir, "display.lp")) self.control.load(os.path.join(parent_dir, "display.lp"))
if not setup.concretize_everything: if not setup.concretize_everything:
self.control.load(os.path.join(parent_dir, "when_possible.lp")) self.control.load(os.path.join(parent_dir, "when_possible.lp"))
for spec in specs:
if self._compiler_flags_has_propagation(spec.compiler_flags):
self.control.load(os.path.join(parent_dir, "propagation.lp"))
break
timer.stop("load") timer.stop("load")
# Grounding is the first step in the solve -- it turns our facts # Grounding is the first step in the solve -- it turns our facts
@ -1028,6 +1034,12 @@ def on_model(model):
return result, timer, self.control.statistics return result, timer, self.control.statistics
def _compiler_flags_has_propagation(self, flags):
for _, flag_vals in flags.items():
if any(val.propagate for val in flag_vals):
return True
return False
class ConcreteSpecsByHash(collections.abc.Mapping): class ConcreteSpecsByHash(collections.abc.Mapping):
"""Mapping containing concrete specs keyed by DAG hash. """Mapping containing concrete specs keyed by DAG hash.
@ -1921,7 +1933,7 @@ class Head:
node_compiler_version = fn.attr("node_compiler_version_set") node_compiler_version = fn.attr("node_compiler_version_set")
node_flag = fn.attr("node_flag_set") node_flag = fn.attr("node_flag_set")
node_flag_source = fn.attr("node_flag_source") node_flag_source = fn.attr("node_flag_source")
node_flag_propagate = fn.attr("node_flag_propagate") node_flag_propagation_candidate = fn.attr("node_flag_propagation_candidate")
variant_propagation_candidate = fn.attr("variant_propagation_candidate") variant_propagation_candidate = fn.attr("variant_propagation_candidate")
class Body: class Body:
@ -1935,7 +1947,7 @@ class Body:
node_compiler_version = fn.attr("node_compiler_version") node_compiler_version = fn.attr("node_compiler_version")
node_flag = fn.attr("node_flag") node_flag = fn.attr("node_flag")
node_flag_source = fn.attr("node_flag_source") node_flag_source = fn.attr("node_flag_source")
node_flag_propagate = fn.attr("node_flag_propagate") node_flag_propagation_candidate = fn.attr("node_flag_propagation_candidate")
variant_propagation_candidate = fn.attr("variant_propagation_candidate") variant_propagation_candidate = fn.attr("variant_propagation_candidate")
f = Body if body else Head f = Body if body else Head
@ -2020,7 +2032,9 @@ class Body:
clauses.append(f.node_flag(spec.name, flag_type, flag)) clauses.append(f.node_flag(spec.name, flag_type, flag))
clauses.append(f.node_flag_source(spec.name, flag_type, spec.name)) clauses.append(f.node_flag_source(spec.name, flag_type, spec.name))
if not spec.concrete and flag.propagate is True: if not spec.concrete and flag.propagate is True:
clauses.append(f.node_flag_propagate(spec.name, flag_type)) clauses.append(
f.node_flag_propagation_candidate(spec.name, flag_type, flag, spec.name)
)
# dependencies # dependencies
if spec.concrete: if spec.concrete:

View File

@ -318,9 +318,11 @@ trigger_condition_holds(ID, RequestorNode) :-
attr(Name, node(X, A1)) : condition_requirement(ID, Name, A1), condition_nodes(ID, PackageNode, node(X, A1)); attr(Name, node(X, A1)) : condition_requirement(ID, Name, A1), condition_nodes(ID, PackageNode, node(X, A1));
attr(Name, node(X, A1), A2) : condition_requirement(ID, Name, A1, A2), condition_nodes(ID, PackageNode, node(X, A1)); attr(Name, node(X, A1), A2) : condition_requirement(ID, Name, A1, A2), condition_nodes(ID, PackageNode, node(X, A1));
attr(Name, node(X, A1), A2, A3) : condition_requirement(ID, Name, A1, A2, A3), condition_nodes(ID, PackageNode, node(X, A1)), not multiple_nodes_attribute(Name); attr(Name, node(X, A1), A2, A3) : condition_requirement(ID, Name, A1, A2, A3), condition_nodes(ID, PackageNode, node(X, A1)), not multiple_nodes_attribute(Name);
attr(Name, node(X, A1), A2, A3, A4) : condition_requirement(ID, Name, A1, A2, A3, A4), condition_nodes(ID, PackageNode, node(X, A1)); attr(Name, node(X, A1), A2, A3, A4) : condition_requirement(ID, Name, A1, A2, A3, A4), condition_nodes(ID, PackageNode, node(X, A1)), not multiple_nodes_attribute(Name);
% Special cases % Special cases
attr("node_flag_source", node(X, A1), A2, node(Y, A3)) : condition_requirement(ID, "node_flag_source", A1, A2, A3), condition_nodes(ID, PackageNode, node(X, A1)), condition_nodes(ID, PackageNode, node(Y, A3)); attr("node_flag_source", node(X, A1), A2, node(Y, A3)) : condition_requirement(ID, "node_flag_source", A1, A2, A3), condition_nodes(ID, PackageNode, node(X, A1)), condition_nodes(ID, PackageNode, node(Y, A3));
attr("node_flag_propagation_candidate", node(X, A1), A2, A3, node(Y, A4)) : condition_reuqirement(ID, "node_flag_propagation_candidate", A1, A2, A3, A4), condition_nodes(ID, PackageNode, node(X, A1)), condition_nodes(ID, PackageNode, node(Y, A4));
% if the structure of the program ever could change so that node_flag_source can be in a condition, we will need a case for it here.
not cannot_hold(ID, PackageNode). not cannot_hold(ID, PackageNode).
condition_holds(ConditionID, node(X, Package)) condition_holds(ConditionID, node(X, Package))
@ -373,6 +375,15 @@ attr("node_flag_source", node(X, A1), A2, node(Y, A3))
imposed_constraint(ID, "node_flag_source", A1, A2, A3), imposed_constraint(ID, "node_flag_source", A1, A2, A3),
condition_set(node(Y, A3), node(X, A1)). condition_set(node(Y, A3), node(X, A1)).
% For node flag propagation, we need to look at the condition_set of the source, since it is the ancestor
% of the package on which we want to impose the constraint
attr("node_flag_propagation_candidate", node(X, A1), A2, A3, node(Y, A4))
:- impose(ID, node(X, A1)),
imposed_constraint(ID, "node_flag_propagation_candidate", A1, A2, A3, A4),
condition_set(node(Y, A4), node(X, A1)).
% if the structure of the program ever could change so that node_flag_source can be in a condition, we will need a case for it here.
% Provider set is relevant only for literals, since it's the only place where `^[virtuals=foo] bar` % Provider set is relevant only for literals, since it's the only place where `^[virtuals=foo] bar`
% might appear in the HEAD of a rule % might appear in the HEAD of a rule
attr("provider_set", node(min_dupe_id, Provider), node(min_dupe_id, Virtual)) attr("provider_set", node(min_dupe_id, Provider), node(min_dupe_id, Virtual))
@ -1212,46 +1223,16 @@ error(100, "Compiler {1}@{2} requested for {0} cannot be found. Set install_miss
% Compiler flags % Compiler flags
%----------------------------------------------------------------------------- %-----------------------------------------------------------------------------
% propagate flags when compiler match
can_inherit_flags(PackageNode, DependencyNode, FlagType)
:- same_compiler(PackageNode, DependencyNode),
not attr("node_flag_set", DependencyNode, FlagType, _),
flag_type(FlagType).
same_compiler(PackageNode, DependencyNode) same_compiler(PackageNode, DependencyNode)
:- depends_on(PackageNode, DependencyNode), :- depends_on(PackageNode, DependencyNode),
node_compiler(PackageNode, CompilerID), node_compiler(PackageNode, CompilerID),
node_compiler(DependencyNode, CompilerID), node_compiler(DependencyNode, CompilerID),
compiler_id(CompilerID). compiler_id(CompilerID).
node_flag_inherited(DependencyNode, FlagType, Flag)
:- attr("node_flag_set", PackageNode, FlagType, Flag),
can_inherit_flags(PackageNode, DependencyNode, FlagType),
attr("node_flag_propagate", PackageNode, FlagType).
% Ensure propagation
:- node_flag_inherited(PackageNode, FlagType, Flag),
can_inherit_flags(PackageNode, DependencyNode, FlagType),
attr("node_flag_propagate", PackageNode, FlagType).
error(100, "{0} and {1} cannot both propagate compiler flags '{2}' to {3}", Source1, Source2, Package, FlagType) :-
depends_on(Source1, Package),
depends_on(Source2, Package),
attr("node_flag_propagate", Source1, FlagType),
attr("node_flag_propagate", Source2, FlagType),
can_inherit_flags(Source1, Package, FlagType),
can_inherit_flags(Source2, Package, FlagType),
Source1 < Source2.
% remember where flags came from % remember where flags came from
attr("node_flag_source", PackageNode, FlagType, PackageNode) attr("node_flag_source", PackageNode, FlagType, PackageNode)
:- attr("node_flag_set", PackageNode, FlagType, _). :- attr("node_flag_set", PackageNode, FlagType, _).
attr("node_flag_source", DependencyNode, FlagType, Q)
:- attr("node_flag_source", PackageNode, FlagType, Q),
node_flag_inherited(DependencyNode, FlagType, _),
attr("node_flag_propagate", PackageNode, FlagType).
% compiler flags from compilers.yaml are put on nodes if compiler matches % compiler flags from compilers.yaml are put on nodes if compiler matches
attr("node_flag", PackageNode, FlagType, Flag) attr("node_flag", PackageNode, FlagType, Flag)
:- compiler_flag(CompilerID, FlagType, Flag), :- compiler_flag(CompilerID, FlagType, Flag),
@ -1272,7 +1253,30 @@ attr("node_flag_compiler_default", PackageNode)
% if a flag is set to something or inherited, it's included % if a flag is set to something or inherited, it's included
attr("node_flag", PackageNode, FlagType, Flag) :- attr("node_flag_set", PackageNode, FlagType, Flag). attr("node_flag", PackageNode, FlagType, Flag) :- attr("node_flag_set", PackageNode, FlagType, Flag).
attr("node_flag", PackageNode, FlagType, Flag) :- node_flag_inherited(PackageNode, FlagType, Flag).
attr("node_flag_propagate", PackageNode, FlagType, Flag, Source) :-
attr("node_flag_propagation_candidate", PackageNode, FlagType, Flag, Source),
not attr("node_flag_set", PackageNode, FlagType, _).
% source is a node() attribute
attr("node_flag_propagation_candidate", PackageNode, FlagType, Flag, Source) :-
same_compiler(ParentNode, PackageNode),
attr("node_flag_propagation_candidate", ParentNode, FlagType, _, Source),
attr("node_flag", Source, FlagType, Flag),
flag_type(FlagType).
error(100, "{0} and {1} cannot both propagate compiler flags '{2}' to {3}", Source1, Source2, PackageNode, FlagType) :-
same_compiler(Source1, PackageNode),
same_compiler(Source2, PackageNode),
attr("node_flag_propagate", _, FlagType, _, Source1),
attr("node_flag_propagate", _, FlagType, _, Source2),
Source1 < Source2.
attr("node_flag_source", PackageNode, FlagType, Q)
:- attr("node_flag_propagate", PackageNode, FlagType, _, Q).
attr("node_flag", PackageNode, FlagType, Flag) :- attr("node_flag_propagate", PackageNode, FlagType, Flag, _).
% if no node flags are set for a type, there are no flags. % if no node flags are set for a type, there are no flags.
attr("no_flags", PackageNode, FlagType) attr("no_flags", PackageNode, FlagType)

View File

@ -0,0 +1,31 @@
% Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
% Spack Project Developers. See the top-level COPYRIGHT file for details.
%
% SPDX-License-Identifier: (Apache-2.0 OR MIT)
%=============================================================================
% TODO: Later
%=============================================================================
% propagate flags when compiler match
attr("node_flag_propagate", PackageNode, FlagType, Flag, Source) :- % source is a node() attribute
attr("node_flag_propagation_candidate", PackageNode, FlagType, Flag, Source),
not attr("node_flag_set", PackageNode, FlagType, _).
attr("node_flag_propagation_candidate", PackageNode, FlagType, Flag, Source) :- % source is a node() attribute
same_compiler(ParentNode, PackageNode),
attr("node_flag_propagation_candidate", ParentNode, FlagType, _, Source),
attr("node_flag", Source, FlagType, Flag),
flag_type(FlagType).
error(100, "{0} and {1} cannot both propagate compiler flags '{2}' to {3}", Source1, Source2, PackageNode, FlagType) :-
same_compiler(Source1, PackageNode),
same_compiler(Source2, PackageNode),
attr("node_flag_propagate", _, FlagType, _, Source1),
attr("node_flag_propagate", _, FlagType, _, Source2),
Source1 < Source2.
attr("node_flag_source", PackageNode, FlagType, Q)
:- attr("node_flag_propagate", PackageNode, FlagType, _, Q).
attr("node_flag", PackageNode, FlagType, Flag) :- attr("node_flag_propagate", PackageNode, FlagType, Flag, _).

View File

@ -353,10 +353,21 @@ def test_compiler_flags_differ_identical_compilers(self):
"Optional compiler propagation isn't deprecated for original concretizer" "Optional compiler propagation isn't deprecated for original concretizer"
) )
def test_concretize_compiler_flag_propagate(self): def test_concretize_compiler_flag_propagate(self):
spec = Spec("hypre cflags=='-g' ^openblas") spec = Spec("callpath cflags=='-g'")
spec.concretize() spec.concretize()
assert spec.satisfies("^openblas cflags='-g'") for dep in spec.traverse():
assert dep.satisfies("cflags='-g'")
@pytest.mark.only_clingo(
"Optional compiler propagation isn't deprecated for original concretizer"
)
def test_concretize_non_root_compiler_flag_propagate(self):
spec = Spec("callpath ^dyninst cflags=='-g'")
spec.concretize()
assert spec.satisfies("^libdwarf cflags='-g'")
assert spec.satisfies("^libelf cflags='-g'")
@pytest.mark.only_clingo( @pytest.mark.only_clingo(
"Optional compiler propagation isn't deprecated for original concretizer" "Optional compiler propagation isn't deprecated for original concretizer"
@ -365,17 +376,30 @@ def test_concretize_compiler_flag_does_not_propagate(self):
spec = Spec("hypre cflags='-g' ^openblas") spec = Spec("hypre cflags='-g' ^openblas")
spec.concretize() spec.concretize()
assert not spec.satisfies("^openblas cflags='-g'") for dep in spec.traverse(root=False):
assert not dep.satisfies("cflags='-g'")
@pytest.mark.only_clingo( @pytest.mark.only_clingo(
"Optional compiler propagation isn't deprecated for original concretizer" "Optional compiler propagation isn't deprecated for original concretizer"
) )
def test_concretize_propagate_compiler_flag_not_passed_to_dependent(self): def test_concretize_propagate_compiler_flag_not_passed_to_dependent(self):
spec = Spec("hypre cflags=='-g' ^openblas cflags='-O3'") spec = Spec("callpath cflags=='-g' ^dyninst cflags='-O3'")
spec.concretize() spec.concretize()
assert set(spec.compiler_flags["cflags"]) == set(["-g"]) assert set(spec.compiler_flags["cflags"]) == set(["-g"])
assert spec.satisfies("^openblas cflags='-O3'") assert spec.satisfies("^dyninst cflags='-O3'")
assert spec.satisfies("^libelf cflags='-g'")
@pytest.mark.only_clingo(
"Optional compiler propagation isn't deprecated for original concretizer"
)
def test_concretize_propagate_specified_compiler_flag(self):
spec = Spec("callpath cflags=='-g' cxxflags='-O3'")
spec.concretize()
for dep in spec.traverse(root=False):
assert dep.satisfies("cflags='-g'")
assert not dep.satisfies("cxxflags='-O3'")
def test_mixing_compilers_only_affects_subdag(self): def test_mixing_compilers_only_affects_subdag(self):
spack.config.set("packages:all:compiler", ["clang", "gcc"]) spack.config.set("packages:all:compiler", ["clang", "gcc"])