From 88dac4be5b720b7030b88c3daf8c636754b4995d Mon Sep 17 00:00:00 2001 From: chriselrod Date: Mon, 17 Jul 2023 22:38:24 -0400 Subject: [PATCH 001/112] negligible progress --- compile_commands.json | 368 +++++++++++++----------- include/IR/Address.hpp | 6 +- include/IR/Cache.hpp | 2 +- include/IR/CostModeling.hpp | 36 ++- include/IR/Node.hpp | 17 ++ include/LinearProgramming/LoopBlock.hpp | 2 +- include/Polyhedra/Dependence.hpp | 10 +- 7 files changed, 246 insertions(+), 195 deletions(-) diff --git a/compile_commands.json b/compile_commands.json index 59630f355..5e5110f6f 100644 --- a/compile_commands.json +++ b/compile_commands.json @@ -1,637 +1,655 @@ [ { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -fpch-instantiate-templates -Xclang -emit-pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -x c++-header -o CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.cxx", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -fpch-instantiate-templates -Xclang -emit-pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -x c++-header -o CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.cxx", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.cxx", "output": "CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/bumpmap_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/bumpmap_test.cpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/bumpmap_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/bumpmap_test.cpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/bumpmap_test.cpp", "output": "CMakeFiles/LoopModelsTests.dir/bumpmap_test.cpp.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/comparator_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/comparator_test.cpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/comparator_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/comparator_test.cpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/comparator_test.cpp", "output": "CMakeFiles/LoopModelsTests.dir/comparator_test.cpp.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/compat_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/compat_test.cpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/compat_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/compat_test.cpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/compat_test.cpp", "output": "CMakeFiles/LoopModelsTests.dir/compat_test.cpp.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/dependence_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/dependence_test.cpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/dependence_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/dependence_test.cpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/dependence_test.cpp", "output": "CMakeFiles/LoopModelsTests.dir/dependence_test.cpp.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/graph_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/graph_test.cpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/graph_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/graph_test.cpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/graph_test.cpp", "output": "CMakeFiles/LoopModelsTests.dir/graph_test.cpp.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/orthogonalize_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/orthogonalize_test.cpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/orthogonalize_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/orthogonalize_test.cpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/orthogonalize_test.cpp", "output": "CMakeFiles/LoopModelsTests.dir/orthogonalize_test.cpp.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/remarks_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/remarks_test.cpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/remarks_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/remarks_test.cpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/remarks_test.cpp", "output": "CMakeFiles/LoopModelsTests.dir/remarks_test.cpp.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -o CMakeFiles/gtest.dir/src/gtest-all.cc.o -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-all.cc", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -o CMakeFiles/gtest.dir/src/gtest-all.cc.o -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-all.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-all.cc", "output": "_deps/googletest-build/googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -o CMakeFiles/gtest_main.dir/src/gtest_main.cc.o -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest_main.cc", + "command": "/bin/clang++ -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -o CMakeFiles/gtest_main.dir/src/gtest_main.cc.o -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest_main.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest_main.cc", "output": "_deps/googletest-build/googletest/CMakeFiles/gtest_main.dir/src/gtest_main.cc.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -fpch-instantiate-templates -Xclang -emit-pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -x c++-header -o CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.cxx", + "command": "/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -fpch-instantiate-templates -Xclang -emit-pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -x c++-header -o CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.cxx", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.cxx", "output": "LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -o CMakeFiles/LoopModels.dir/lib/TurboLoop.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/lib/TurboLoop.cpp", + "command": "/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -o CMakeFiles/LoopModels.dir/lib/TurboLoop.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/lib/TurboLoop.cpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/lib/TurboLoop.cpp", "output": "LoopModels/CMakeFiles/LoopModels.dir/lib/TurboLoop.cpp.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/BumpMapSet.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/BumpMapSet.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/BumpMapSet.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/BumpVector.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/BumpVector.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/BumpVector.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Array.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Array.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Array.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/Storage.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/Storage.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/Storage.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/ArrayOps.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/ArrayOps.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/ArrayOps.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Indexing.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Indexing.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Indexing.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/AxisTypes.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/AxisTypes.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/AxisTypes.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Invariant.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Invariant.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Invariant.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Iterators.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Iterators.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Iterators.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/MatrixDimensions.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/MatrixDimensions.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/MatrixDimensions.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Matrix.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Matrix.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Matrix.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/TypePromotion.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/TypePromotion.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/TypePromotion.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/UniformScaling.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/UniformScaling.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/UniformScaling.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Vector.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Vector.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Vector.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Rational.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Rational.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Rational.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/GreatestCommonDivisor.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/GreatestCommonDivisor.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/GreatestCommonDivisor.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Allocators.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Allocators.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Allocators.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Valid.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Valid.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Valid.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Optional.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Optional.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Optional.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include/ankerl/unordered_dense.h", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include/ankerl/unordered_dense.h", "file": "/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include/ankerl/unordered_dense.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Comparators.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Comparators.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Comparators.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Constraints.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Constraints.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Constraints.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/BitSets.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/BitSets.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/BitSets.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Comparisons.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Comparisons.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Comparisons.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/EmptyArrays.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/EmptyArrays.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/EmptyArrays.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Math.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Math.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Math.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/NormalForm.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/NormalForm.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/NormalForm.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Constructors.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Constructors.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Constructors.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/VectorGreatestCommonDivisor.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/VectorGreatestCommonDivisor.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/VectorGreatestCommonDivisor.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Simplex.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Simplex.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Simplex.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/MatrixStringParse.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/MatrixStringParse.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/MatrixStringParse.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Loops.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Loops.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Loops.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Polyhedra.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Polyhedra.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Polyhedra.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/RemarkAnalysis.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/RemarkAnalysis.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/RemarkAnalysis.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/TestUtilities.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Support/OStream.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Support/OStream.hpp" +}, + +{ + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/TestUtilities.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/TestUtilities.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/ArrayReference.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/ArrayReference.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/ArrayReference.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Address.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Address.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Address.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/InstructionCost.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/InstructionCost.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/InstructionCost.hpp" }, { - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Node.hpp", + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Node.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Node.hpp" }, { - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/UnrolledList.hpp", + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/UnrolledList.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/UnrolledList.hpp" }, { - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Users.hpp", + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Users.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Users.hpp" }, { - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/ListRanges.hpp", + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/ListRanges.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/ListRanges.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Support/OStream.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Support/OStream.hpp" + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/CostModeling.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/CostModeling.hpp" +}, + +{ + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Graphs/Graphs.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Graphs/Graphs.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Orthogonalize.hpp", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/LoopBlock.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/LoopBlock.hpp" +}, + +{ + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Cache.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Cache.hpp" +}, + +{ + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/BBPredPath.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/BBPredPath.hpp" +}, + +{ + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/MapVector.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/MapVector.hpp" +}, + +{ + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", + "command": "/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Predicate.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Predicate.hpp" +}, + +{ + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", + "command": "/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/TinyVector.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/TinyVector.hpp" +}, + +{ + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", + "command": "/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Instruction.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Instruction.hpp" +}, + +{ + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/ScheduledNode.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/ScheduledNode.hpp" +}, + +{ + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Dependence.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Dependence.hpp" +}, + +{ + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/DependencyPolyhedra.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/DependencyPolyhedra.hpp" +}, + +{ + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Orthogonalize.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Orthogonalize.hpp" }, +{ + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Schedule.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Schedule.hpp" +}, + +{ + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Support/Iterators.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Support/Iterators.hpp" +}, + +{ + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/StaticArrays.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/StaticArrays.hpp" +}, + +{ + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", + "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Graphs/IndexGraphs.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Graphs/IndexGraphs.hpp" +}, + { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-assertion-result.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-assertion-result.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-assertion-result.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-message.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-message.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-message.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-port.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-port.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-port.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest-port.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest-port.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest-port.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-port-arch.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-port-arch.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-port-arch.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-death-test.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-death-test.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-death-test.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-death-test-internal.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-death-test-internal.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-death-test-internal.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-matchers.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-matchers.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-matchers.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-printers.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-printers.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-printers.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-internal.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-internal.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-internal.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-filepath.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-filepath.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-filepath.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-string.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-string.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-string.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-type-util.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-type-util.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-type-util.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest-printers.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest-printers.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest-printers.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-param-test.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-param-test.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-param-test.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-param-util.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-param-util.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-param-util.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-test-part.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-test-part.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-test-part.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-typed-test.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-typed-test.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-typed-test.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest_pred_impl.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest_pred_impl.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest_pred_impl.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest_prod.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest_prod.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest_prod.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-assertion-result.cc", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-assertion-result.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-assertion-result.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-death-test.cc", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-death-test.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-death-test.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-internal-inl.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-internal-inl.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-internal-inl.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-spi.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-spi.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-spi.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-filepath.cc", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-filepath.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-filepath.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-matchers.cc", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-matchers.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-matchers.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-port.cc", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-port.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-port.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-printers.cc", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-printers.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-printers.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-test-part.cc", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-test-part.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-test-part.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-typed-test.cc", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-typed-test.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-typed-test.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest.cc", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/TurboLoop.hpp", + "command": "/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/TurboLoop.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/TurboLoop.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Cache.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Cache.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/BBPredPath.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/BBPredPath.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/MapVector.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/MapVector.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Predicate.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Predicate.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/TinyVector.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/TinyVector.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Instruction.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Instruction.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/CostModeling.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/CostModeling.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Graphs/Graphs.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Graphs/Graphs.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/LoopBlock.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/LoopBlock.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/ScheduledNode.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/ScheduledNode.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Dependence.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Dependence.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/DependencyPolyhedra.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/DependencyPolyhedra.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Schedule.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Schedule.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/StaticArrays.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/StaticArrays.hpp" + "command": "/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/ControlFlowMerging.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/ControlFlowMerging.hpp" } ] diff --git a/include/IR/Address.hpp b/include/IR/Address.hpp index 6a07806a1..eabf38ca9 100644 --- a/include/IR/Address.hpp +++ b/include/IR/Address.hpp @@ -477,7 +477,9 @@ class Addr : public Instruction { invariant(offSym != nullptr || numDynSym == 0); return {offSym, DenseDims{getArrayDim(), numDynSym}}; } - [[nodiscard]] constexpr auto getLoop() -> NotNull { return loop; } + [[nodiscard]] constexpr auto getAffineLoop() -> NotNull { + return loop; + } [[nodiscard]] constexpr auto sizesMatch(NotNull x) const -> bool { auto thisSizes = getSizes(), xSizes = x->getSizes(); return std::equal(thisSizes.begin(), thisSizes.end(), xSizes.begin(), @@ -640,7 +642,7 @@ class AddrWrapper { return addr == other.addr; } [[nodiscard]] constexpr auto getLoop() const -> poly::Loop * { - return addr->getLoop(); + return addr->getAffineLoop(); } constexpr operator Addr *() { return addr; } }; diff --git a/include/IR/Cache.hpp b/include/IR/Cache.hpp index 4ca7d45c2..8fe95a2a7 100644 --- a/include/IR/Cache.hpp +++ b/include/IR/Cache.hpp @@ -156,7 +156,7 @@ struct TreeResult { } [[nodiscard]] constexpr auto getLoop() const -> poly::Loop * { - return (addr.addr) ? addr.addr->getLoop() : nullptr; + return (addr.addr) ? addr.addr->getAffineLoop() : nullptr; } [[nodiscard]] constexpr auto getMaxDepth() const -> unsigned { return maxDepth - rejectDepth; diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index 7f38643b7..64c47fd47 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -152,13 +152,13 @@ template using Vec = math::ResizeableView; class LoopTree { // The root of this subtree NotNull loop; - LoopTree *parent{nullptr}; // do we need this? + // LoopTree *parent{nullptr}; // do we need this? Vec children{}; unsigned depth{0}; // We do not need to know the previous loop, as dependencies between // the `Addr`s and instructions will determine the ordering. constexpr LoopTree(Arena<> *lalloc, LoopTree *parent_) - : loop{lalloc->create(parent_->depth + 1)}, parent(parent_), + : loop{lalloc->create(parent_->depth + 1)}, depth(parent_->depth + 1) { // allocate the root node, and connect it to parent's node, as well as // previous loop of the same level. @@ -376,6 +376,7 @@ inline auto buildGraph(IR::Dependencies deps, IR::Loop *root, unsigned depth) // We build the instruction graph, via traversing the tree, and then // top sorting as we recurse out for (IR::Loop *child : root->subLoops()) buildGraph(deps, child, depth + 1); + return topologicalSort(deps, root, depth); } @@ -398,7 +399,7 @@ inline void eliminateAddr(IR::Addr *a, IR::Addr *b) { // Without reads in between, it's safe. } else { // Write->Read // Can we replace the read with using the written value? - if (a->getLoop() != b->getLoop()) return; + if (a->getAffineLoop() != b->getAffineLoop()) return; } } else if (b->isLoad()) { // Read->Read // If they don't have the same parent, either... @@ -413,7 +414,7 @@ inline void eliminateAddr(IR::Addr *a, IR::Addr *b) { // } // } // or it is a subloop, but dependencies prevented us from hoisting. - if (a->getLoop() != b->getLoop()) return; + if (a->getAffineLoop() != b->getAffineLoop()) return; // Any writes in between them? } // Read->Write, can't delete either } @@ -479,12 +480,28 @@ inline void eliminateAddr(IR::Addr *a, IR::Addr *b) { // by `llvm::isRemovableAlloc`. inline void removeRedundantAddr(IR::Dependencies deps, IR::Addr *addr) { for (IR::Addr *a : addr->eachAddr()) { - for (poly::Dependence *d = a->getEdgeOut(); d; d = d->getNextOutput()) { - IR::Addr *b = d->output(); + for (poly::Dependence d : a->outputEdges(deps)) { + IR::Addr *b = d.output(); eliminateAddr(a, b); } } } +inline auto loopDepSats(Arena<> *alloc, IR::Dependencies deps, + lp::LoopBlock::OptimizationResult res) + -> MutPtrVector { + IR::MutPtrVector loopDeps{ + math::vector(alloc, unsigned(deps.size()))}; + // place deps at sat level for loops + for (IR::Addr *a : res.addr.getAddr()) { + IR::Loop *L = a->getLoop(); + for (int32_t id : a->inputEdgeIDs(deps)) { + uint8_t lvl = deps.satLevel(IR::Dependence::ID{id}); + L->getLoopAtDepth(lvl)->addEdge(loopDeps, id); + } + } + return loopDeps; +} + // // Considering reordering legality, example // for (int i = 0: i < I; ++i){ @@ -578,19 +595,18 @@ inline void removeRedundantAddr(IR::Dependencies deps, IR::Addr *addr) { // /// /// Optimize the schedule -inline void optimize(IR::Cache &instr, Arena<> *lalloc, +inline void optimize(IR::Dependencies deps, IR::Cache &instr, Arena<> *lalloc, lp::LoopBlock::OptimizationResult res) { /// we must build the IR::Loop /// Initially, to help, we use a nested vector, so that we can index into it /// using the fusion omegas. We allocate it with the longer lived `instr` /// alloc, so we can checkpoint it here, and use alloc for other IR nodes. Arena<> *salloc = instr.getAllocator(); - - IR::Node *N = buildGraph(addAddrToGraph(salloc, lalloc, res.nodes), 0); + IR::Node *N = buildGraph(deps, addAddrToGraph(salloc, lalloc, res.nodes), 0); // `N` is the head of the topologically sorted graph // We now try to remove redundant memory operations - removeRedundantAddr(res.addr.addr); + removeRedundantAddr(deps, res.addr.addr); } /* diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index c824b5f55..aa4175413 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -277,6 +277,7 @@ static_assert(sizeof(Node) == 4 * sizeof(Node *) + 8); /// exit is the associated exit block class Loop : public Node { poly::Loop *affineLoop{nullptr}; + int32_t edgeId{-1}; public: constexpr Loop(unsigned d) : Node(VK_Loop, d) {} @@ -332,6 +333,22 @@ class Loop : public Node { } return nullptr; } + [[nodiscard]] constexpr auto getEdge() const -> int32_t { return edgeId; } + constexpr void addEdge(math::MutPtrVector deps, int32_t d) { + invariant(d >= 0); + // [ -1, -1, -1, -1, -1 ] // d = 2, edgeId = -1 + // [ 2, -1, -1, -1, -1 ] // d = 0, edgeId = 2 + // [ 2, -1, -1, -1, 0 ] // d = 4, edgeId = 0 + // now edgeId = 4, and we can follow path 4->0->2 + deps[d] = edgeId; + edgeId = d; + } + constexpr auto getLoopAtDepth(uint8_t d) -> Loop * { + Loop *L = this; + for (uint8_t currDepth = this->currentDepth; currDepth > d; --currDepth) + L = L->getOuterLoop(); + return L; + } }; [[nodiscard]] inline constexpr auto Node::getLoop() const noexcept -> Loop * { if (!parent) return nullptr; diff --git a/include/LinearProgramming/LoopBlock.hpp b/include/LinearProgramming/LoopBlock.hpp index 3dc29e5d1..06bcb5a0f 100644 --- a/include/LinearProgramming/LoopBlock.hpp +++ b/include/LinearProgramming/LoopBlock.hpp @@ -288,7 +288,7 @@ class LoopBlock { Addr *load = deps.reload(&allocator, store); stow.insertAfter(load); // insert load after stow addr.addAddr(load); - return {load, load->getLoop(), addr}; + return {load, load->getAffineLoop(), addr}; } auto *C = llvm::cast(inst); // could not find a load, so now we recurse, searching operands diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 626b2aeb7..2e8e5ece3 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -978,16 +978,14 @@ class Dependencies { return satLevelsPtr()[i.id]; } [[nodiscard]] constexpr auto satLevelPair(ID i) const - -> const std::array & { + -> std::array { return satLevelsPtr()[i.id]; } - constexpr auto satLevel(ID i) -> uint8_t { - auto pair = satLevelPair(i); - return Dependence::satLevelMask(pair[0]); + [[nodiscard]] constexpr auto satLevel(ID i) const -> uint8_t { + return Dependence::satLevelMask(satLevelPair(i)[0]); } [[nodiscard]] constexpr auto isSat(ID i, unsigned depth) const -> uint8_t { - auto pair = satLevelPair(i); - return Dependence::satLevelMask(pair[0]) <= depth; + return Dependence::satLevelMask(satLevelPair(i)[0]) <= depth; } [[nodiscard]] constexpr auto isForward(ID i) const noexcept -> bool & { From e1660fac692873118ed4141271c7acba9d88d4b1 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Wed, 19 Jul 2023 01:09:42 -0400 Subject: [PATCH 002/112] negligible progress --- include/IR/Address.hpp | 3 +- include/IR/CostModeling.hpp | 1221 ++++++++++++++++++----------------- 2 files changed, 628 insertions(+), 596 deletions(-) diff --git a/include/IR/Address.hpp b/include/IR/Address.hpp index eabf38ca9..56e5e4f61 100644 --- a/include/IR/Address.hpp +++ b/include/IR/Address.hpp @@ -85,7 +85,8 @@ class Addr : public Instruction { const llvm::SCEV **syms; Value *predicate{nullptr}; Addr *origNext{nullptr}; - unsigned numDim{0}, numDynSym{0}; + uint16_t numDim{0}, numDynSym{0}; + uint32_t topologicalPosition; #if !defined(__clang__) && defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wpedantic" diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index 64c47fd47..f0abc165c 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -1,4 +1,4 @@ -#pragma once +br #pragma once // #include "./ControlFlowMerging.hpp" #include "Graphs/Graphs.hpp" @@ -32,643 +32,674 @@ #include #include -namespace poly::CostModeling { + namespace poly::CostModeling { -class CPURegisterFile { - [[no_unique_address]] uint8_t maximumVectorWidth; - [[no_unique_address]] uint8_t numVectorRegisters; - [[no_unique_address]] uint8_t numGeneralPurposeRegisters; - [[no_unique_address]] uint8_t numPredicateRegisters; + class CPURegisterFile { + [[no_unique_address]] uint8_t maximumVectorWidth; + [[no_unique_address]] uint8_t numVectorRegisters; + [[no_unique_address]] uint8_t numGeneralPurposeRegisters; + [[no_unique_address]] uint8_t numPredicateRegisters; - // hacky check for has AVX512 - static inline auto hasAVX512(llvm::LLVMContext &C, - const llvm::TargetTransformInfo &TTI) -> bool { - return TTI.isLegalMaskedExpandLoad( - llvm::FixedVectorType::get(llvm::Type::getDoubleTy(C), 8)); - } + // hacky check for has AVX512 + static inline auto hasAVX512(llvm::LLVMContext &C, + const llvm::TargetTransformInfo &TTI) -> bool { + return TTI.isLegalMaskedExpandLoad( + llvm::FixedVectorType::get(llvm::Type::getDoubleTy(C), 8)); + } - static auto estimateNumPredicateRegisters( - llvm::LLVMContext &C, const llvm::TargetTransformInfo &TTI) -> uint8_t { - if (TTI.supportsScalableVectors()) return 8; - // hacky check for AVX512 - if (hasAVX512(C, TTI)) return 7; // 7, because k0 is reserved for unmasked - return 0; - } - // returns vector width in bits, ignoring mprefer-vector-width - static auto estimateMaximumVectorWidth(llvm::LLVMContext &C, - const llvm::TargetTransformInfo &TTI) - -> uint8_t { - uint8_t twiceMaxVectorWidth = 2; - auto *f32 = llvm::Type::getFloatTy(C); - llvm::InstructionCost prevCost = TTI.getArithmeticInstrCost( - llvm::Instruction::FAdd, - llvm::FixedVectorType::get(f32, twiceMaxVectorWidth)); - while (true) { - llvm::InstructionCost nextCost = TTI.getArithmeticInstrCost( + static auto estimateNumPredicateRegisters( + llvm::LLVMContext &C, const llvm::TargetTransformInfo &TTI) -> uint8_t { + if (TTI.supportsScalableVectors()) return 8; + // hacky check for AVX512 + if (hasAVX512(C, TTI)) return 7; // 7, because k0 is reserved for unmasked + return 0; + } + // returns vector width in bits, ignoring mprefer-vector-width + static auto estimateMaximumVectorWidth(llvm::LLVMContext &C, + const llvm::TargetTransformInfo &TTI) + -> uint8_t { + uint8_t twiceMaxVectorWidth = 2; + auto *f32 = llvm::Type::getFloatTy(C); + llvm::InstructionCost prevCost = TTI.getArithmeticInstrCost( llvm::Instruction::FAdd, - llvm::FixedVectorType::get(f32, twiceMaxVectorWidth *= 2)); - if (nextCost > prevCost) break; - prevCost = nextCost; + llvm::FixedVectorType::get(f32, twiceMaxVectorWidth)); + while (true) { + llvm::InstructionCost nextCost = TTI.getArithmeticInstrCost( + llvm::Instruction::FAdd, + llvm::FixedVectorType::get(f32, twiceMaxVectorWidth *= 2)); + if (nextCost > prevCost) break; + prevCost = nextCost; + } + return 16 * twiceMaxVectorWidth; } - return 16 * twiceMaxVectorWidth; - } -public: - CPURegisterFile(llvm::LLVMContext &C, const llvm::TargetTransformInfo &TTI) { - maximumVectorWidth = estimateMaximumVectorWidth(C, TTI); - numVectorRegisters = TTI.getNumberOfRegisters(true); - numGeneralPurposeRegisters = TTI.getNumberOfRegisters(false); - numPredicateRegisters = estimateNumPredicateRegisters(C, TTI); - } - [[nodiscard]] constexpr auto getNumVectorBits() const -> uint8_t { - return maximumVectorWidth; - } - [[nodiscard]] constexpr auto getNumVector() const -> uint8_t { - return numVectorRegisters; - } - [[nodiscard]] constexpr auto getNumScalar() const -> uint8_t { - return numGeneralPurposeRegisters; - } - [[nodiscard]] constexpr auto getNumPredicate() const -> uint8_t { - return numPredicateRegisters; - } -}; -// struct CPUExecutionModel {}; + public: + CPURegisterFile(llvm::LLVMContext &C, + const llvm::TargetTransformInfo &TTI) { + maximumVectorWidth = estimateMaximumVectorWidth(C, TTI); + numVectorRegisters = TTI.getNumberOfRegisters(true); + numGeneralPurposeRegisters = TTI.getNumberOfRegisters(false); + numPredicateRegisters = estimateNumPredicateRegisters(C, TTI); + } + [[nodiscard]] constexpr auto getNumVectorBits() const -> uint8_t { + return maximumVectorWidth; + } + [[nodiscard]] constexpr auto getNumVector() const -> uint8_t { + return numVectorRegisters; + } + [[nodiscard]] constexpr auto getNumScalar() const -> uint8_t { + return numGeneralPurposeRegisters; + } + [[nodiscard]] constexpr auto getNumPredicate() const -> uint8_t { + return numPredicateRegisters; + } + }; + // struct CPUExecutionModel {}; -// Plan for cost modeling: -// 1. Build Instruction graph -// 2. Iterate over all PredicatedChains, merging instructions across branches -// where possible -// 3. Create a loop tree structure for optimization -// 4. Create InstructionBlocks at each level. + // Plan for cost modeling: + // 1. Build Instruction graph + // 2. Iterate over all PredicatedChains, merging instructions across branches + // where possible + // 3. Create a loop tree structure for optimization + // 4. Create InstructionBlocks at each level. -// void pushBlock(llvm::SmallPtrSet &trackInstr, -// llvm::SmallPtrSet &chainBBs, -// Predicates &pred, llvm::BasicBlock *BB) { -// assert(chainBBs.contains(block)); -// chainBBs.erase(BB); -// // we only want to extract relevant instructions, i.e. parents of -// stores for (llvm::Instruction &instr : *BB) { -// if (trackInstr.contains(&instr)) -// instructions.emplace_back(pred, instr); -// } -// llvm::Instruction *term = BB->getTerminator(); -// if (!term) -// return; -// switch (term->getNumSuccessors()) { -// case 0: -// return; -// case 1: -// BB = term->getSuccessor(0); -// if (chainBBs.contains(BB)) -// pushBlock(trackInstr, chainBBs, pred, BB); -// return; -// case 2: -// break; -// default: -// assert(false); -// } -// auto succ0 = term->getSuccessor(0); -// auto succ1 = term->getSuccessor(1); -// if (chainBBs.contains(succ0) && chainBBs.contains(succ1)) { -// // TODO: we need to fuse these blocks. + // void pushBlock(llvm::SmallPtrSet &trackInstr, + // llvm::SmallPtrSet &chainBBs, + // Predicates &pred, llvm::BasicBlock *BB) { + // assert(chainBBs.contains(block)); + // chainBBs.erase(BB); + // // we only want to extract relevant instructions, i.e. parents of + // stores for (llvm::Instruction &instr : *BB) { + // if (trackInstr.contains(&instr)) + // instructions.emplace_back(pred, instr); + // } + // llvm::Instruction *term = BB->getTerminator(); + // if (!term) + // return; + // switch (term->getNumSuccessors()) { + // case 0: + // return; + // case 1: + // BB = term->getSuccessor(0); + // if (chainBBs.contains(BB)) + // pushBlock(trackInstr, chainBBs, pred, BB); + // return; + // case 2: + // break; + // default: + // assert(false); + // } + // auto succ0 = term->getSuccessor(0); + // auto succ1 = term->getSuccessor(1); + // if (chainBBs.contains(succ0) && chainBBs.contains(succ1)) { + // // TODO: we need to fuse these blocks. -// } else if (chainBBs.contains(succ0)) { -// pushBlock(trackInstr, chainBBs, pred, succ0); -// } else if (chainBBs.contains(succ1)) { -// pushBlock(trackInstr, chainBBs, pred, succ1); -// } -// } -template using Vec = math::ResizeableView; + // } else if (chainBBs.contains(succ0)) { + // pushBlock(trackInstr, chainBBs, pred, succ0); + // } else if (chainBBs.contains(succ1)) { + // pushBlock(trackInstr, chainBBs, pred, succ1); + // } + // } + template using Vec = math::ResizeableView; -// TODO: instead of this, update in-place and ensure all Addr are over-allocated -// to correspond with max depth? -// Because we parse in reverse order, we have max possible depth of -// `ScheduledNode`s using it at time we create. + // TODO: instead of this, update in-place and ensure all Addr are + // over-allocated to correspond with max depth? Because we parse in reverse + // order, we have max possible depth of `ScheduledNode`s using it at time we + // create. -/// LoopTree -/// A tree of loops, with an indexable vector of IR::Loop*s, to facilitate -/// construction of the IR::Loop graph, from the fusion omegas -class LoopTree { - // The root of this subtree - NotNull loop; - // LoopTree *parent{nullptr}; // do we need this? - Vec children{}; - unsigned depth{0}; - // We do not need to know the previous loop, as dependencies between - // the `Addr`s and instructions will determine the ordering. - constexpr LoopTree(Arena<> *lalloc, LoopTree *parent_) - : loop{lalloc->create(parent_->depth + 1)}, - depth(parent_->depth + 1) { - // allocate the root node, and connect it to parent's node, as well as - // previous loop of the same level. - loop->setParent(parent_->loop); - } - constexpr LoopTree(Arena<> *lalloc) : loop{lalloc->create(0)} {} + /// LoopTree + /// A tree of loops, with an indexable vector of IR::Loop*s, to facilitate + /// construction of the IR::Loop graph, from the fusion omegas + class LoopTree { + // The root of this subtree + NotNull loop; + // LoopTree *parent{nullptr}; // do we need this? + Vec children{}; + unsigned depth{0}; + // We do not need to know the previous loop, as dependencies between + // the `Addr`s and instructions will determine the ordering. + constexpr LoopTree(Arena<> *lalloc, LoopTree *parent_) + : loop{lalloc->create(parent_->depth + 1)}, + depth(parent_->depth + 1) { + // allocate the root node, and connect it to parent's node, as well as + // previous loop of the same level. + loop->setParent(parent_->loop); + } + constexpr LoopTree(Arena<> *lalloc) : loop{lalloc->create(0)} {} -public: - static auto root(Arena<> *salloc, Arena<> *lalloc) -> LoopTree * { - return new (salloc) LoopTree(lalloc); - } - // salloc: Short lived allocator, for the indexable `Vec`s - // Longer lived allocator, for the IR::Loop nodes - // NOLINTNEXTLINE(misc-no-recursion) - void addNode(Arena<> *salloc, Arena<> *lalloc, lp::ScheduledNode *node) { - if (node->getNumLoops() == depth) { - // Then it belongs here, and we add loop's dependencies. - // We only need to add deps to support SCC/top sort now. - // We also apply the rotation here. - // For dependencies in SCC iteration, only indvar deps get iterated. - auto [Pinv, denom] = math::NormalForm::scaledInv(node->getPhi()); - NotNull affloop = - node->getLoopNest()->rotate(lalloc, Pinv, node->getOffset()); - for (IR::Addr *m : node->localAddr()) { - m->rotate(affloop, Pinv, denom, node->getOffsetOmega(), - node->getOffset()); - loop->insertAfter(m); - } - return; + public: + static auto root(Arena<> *salloc, Arena<> *lalloc) -> LoopTree * { + return new (salloc) LoopTree(lalloc); } - // we need to find the sub-loop tree to which we add `node` - ptrdiff_t idx = node->getFusionOmega(depth); - invariant(idx >= 0); - ptrdiff_t numChildren = children.size(); - if (idx >= children.size()) { - if (idx >= children.getCapacity()) { - // allocate extra capacity - children.reserve(salloc, 2 * (idx + 1)); + // salloc: Short lived allocator, for the indexable `Vec`s + // Longer lived allocator, for the IR::Loop nodes + // NOLINTNEXTLINE(misc-no-recursion) + void addNode(Arena<> *salloc, Arena<> *lalloc, lp::ScheduledNode *node) { + if (node->getNumLoops() == depth) { + // Then it belongs here, and we add loop's dependencies. + // We only need to add deps to support SCC/top sort now. + // We also apply the rotation here. + // For dependencies in SCC iteration, only indvar deps get iterated. + auto [Pinv, denom] = math::NormalForm::scaledInv(node->getPhi()); + NotNull affloop = + node->getLoopNest()->rotate(lalloc, Pinv, node->getOffset()); + for (IR::Addr *m : node->localAddr()) { + m->rotate(affloop, Pinv, denom, node->getOffsetOmega(), + node->getOffset()); + loop->insertAfter(m); + } + return; + } + // we need to find the sub-loop tree to which we add `node` + ptrdiff_t idx = node->getFusionOmega(depth); + invariant(idx >= 0); + ptrdiff_t numChildren = children.size(); + if (idx >= children.size()) { + if (idx >= children.getCapacity()) { + // allocate extra capacity + children.reserve(salloc, 2 * (idx + 1)); + } + // allocate new nodes and resize + children.resize(idx + 1); + for (ptrdiff_t i = numChildren; i < idx + 1; ++i) + children[i] = new (salloc) LoopTree{lalloc, this}; + numChildren = idx + 1; } - // allocate new nodes and resize - children.resize(idx + 1); - for (ptrdiff_t i = numChildren; i < idx + 1; ++i) - children[i] = new (salloc) LoopTree{lalloc, this}; - numChildren = idx + 1; + children[idx]->addNode(salloc, lalloc, node); } - children[idx]->addNode(salloc, lalloc, node); - } - constexpr auto getChildren() -> Vec { return children; } - constexpr auto getLoop() -> IR::Loop * { return loop; } -}; + constexpr auto getChildren() -> Vec { return children; } + constexpr auto getLoop() -> IR::Loop * { return loop; } + }; -struct LoopDepSummary { - IR::Node *afterExit{nullptr}; - IR::Addr *indexedByLoop{nullptr}; - IR::Addr *notIndexedByLoop{nullptr}; -}; -struct LoopIndependent { - LoopDepSummary summary; - bool independent; - constexpr auto operator*=(LoopIndependent other) -> LoopIndependent & { - summary = other.summary; - independent = independent && other.independent; - return *this; - } -}; -// + struct LoopDepSummary { + IR::Node *afterExit{nullptr}; + IR::Addr *indexedByLoop{nullptr}; + IR::Addr *notIndexedByLoop{nullptr}; + }; + struct LoopIndependent { + LoopDepSummary summary; + bool independent; + constexpr auto operator*=(LoopIndependent other) -> LoopIndependent & { + summary = other.summary; + independent = independent && other.independent; + return *this; + } + }; + // -// searches `N` and it's users for loop-independent users -// this exits early if it finds a dependent user; we search everything -// anyway, so we'll revist later anyway. -// We return a `IR::Node *, bool` pair, where the `bool` is true if -// `N` was loop independent. -// We do this rather than something like returning a `nullptr`, as -// we may have descended into instructions, found some users that are -// but then also found some that are not; we need to return `false` -// in this case, but we of course want to still return those we found. -// NOLINTNEXTLINE(misc-no-recursion) -inline auto searchLoopIndependentUsers(IR::Dependencies deps, IR::Loop *L, - IR::Node *N, uint8_t depth, - LoopDepSummary summary) - -> LoopIndependent { - if (N->dependsOnParentLoop()) return {summary, false}; - if (llvm::isa(N)) return {summary, false}; - if (IR::Loop *P = N->getLoop(); P != L) - return {summary, !(P && L->contains(P))}; - LoopIndependent ret{summary, true}; - auto *a = llvm::dyn_cast(N); - if (a) { - a->removeFromList(); - if (a->indexedByInnermostLoop()) { - a->insertAfter(ret.summary.indexedByLoop); - ret.summary.indexedByLoop = a; - return {summary, false}; + // searches `N` and it's users for loop-independent users + // this exits early if it finds a dependent user; we search everything + // anyway, so we'll revist later anyway. + // We return a `IR::Node *, bool` pair, where the `bool` is true if + // `N` was loop independent. + // We do this rather than something like returning a `nullptr`, as + // we may have descended into instructions, found some users that are + // but then also found some that are not; we need to return `false` + // in this case, but we of course want to still return those we found. + // NOLINTNEXTLINE(misc-no-recursion) + inline auto searchLoopIndependentUsers(IR::Dependencies deps, IR::Loop * L, + IR::Node * N, uint8_t depth, + LoopDepSummary summary) + ->LoopIndependent { + if (N->dependsOnParentLoop()) return {summary, false}; + if (llvm::isa(N)) return {summary, false}; + if (IR::Loop *P = N->getLoop(); P != L) + return {summary, !(P && L->contains(P))}; + LoopIndependent ret{summary, true}; + auto *a = llvm::dyn_cast(N); + if (a) { + a->removeFromList(); + if (a->indexedByInnermostLoop()) { + a->insertAfter(ret.summary.indexedByLoop); + ret.summary.indexedByLoop = a; + return {summary, false}; + } + a->insertAfter(ret.summary.notIndexedByLoop); + ret.summary.notIndexedByLoop = a; + for (IR::Addr *m : a->outputAddrs(deps, depth)) { + ret *= searchLoopIndependentUsers(deps, L, m, depth, summary); + if (ret.independent) continue; + a->setDependsOnParentLoop(); + return ret; + } } - a->insertAfter(ret.summary.notIndexedByLoop); - ret.summary.notIndexedByLoop = a; - for (IR::Addr *m : a->outputAddrs(deps, depth)) { - ret *= searchLoopIndependentUsers(deps, L, m, depth, summary); + // if it isn't a Loop, must be an `Instruction` + IR::Value *I = llvm::cast(N); + for (IR::Node *U : I->getUsers()) { + ret *= searchLoopIndependentUsers(deps, L, U, depth, summary); if (ret.independent) continue; - a->setDependsOnParentLoop(); + I->setDependsOnParentLoop(); return ret; } - } - // if it isn't a Loop, must be an `Instruction` - IR::Value *I = llvm::cast(N); - for (IR::Node *U : I->getUsers()) { - ret *= searchLoopIndependentUsers(deps, L, U, depth, summary); - if (ret.independent) continue; - I->setDependsOnParentLoop(); + // then we can push it to the front of the list, meaning it is hoisted out + if (a) { + if (ret.summary.notIndexedByLoop == a) + ret.summary.notIndexedByLoop = + llvm::cast_or_null(a->getNext()); + } + I->removeFromList(); + I->insertAfter(ret.summary.afterExit); + ret.summary.afterExit = I; + I->visit(depth); return ret; } - // then we can push it to the front of the list, meaning it is hoisted out - if (a) { - if (ret.summary.notIndexedByLoop == a) - ret.summary.notIndexedByLoop = llvm::cast_or_null(a->getNext()); - } - I->removeFromList(); - I->insertAfter(ret.summary.afterExit); - ret.summary.afterExit = I; - I->visit(depth); - return ret; -} -// NOLINTNEXTLINE(misc-no-recursion) -inline auto visitLoopDependent(IR::Dependencies deps, IR::Loop *L, IR::Node *N, - uint8_t depth, IR::Node *body) -> IR::Node * { - invariant(N->getVisitDepth() != 254); - // N may have been visited as a dependent of an inner loop, which is why - // `visited` accepts a depth argument - if (N->wasVisited(depth) || !(L->contains(N))) return body; + // NOLINTNEXTLINE(misc-no-recursion) + inline auto visitLoopDependent(IR::Dependencies deps, IR::Loop * L, + IR::Node * N, uint8_t depth, IR::Node * body) + ->IR::Node * { + invariant(N->getVisitDepth() != 254); + // N may have been visited as a dependent of an inner loop, which is why + // `visited` accepts a depth argument + if (N->wasVisited(depth) || !(L->contains(N))) return body; #ifndef NDEBUG - // Our goal here is to check for cycles in debug mode. - // Each level of our graph is acyclic, meaning that there are no cycles at - // that level when traversing only edges active at that given level. However, - // when considering edges active at level `I`, we may have cycles at level `J` - // if `J>I`. In otherwords, here we are travering all edges active at - // `I=depth`. Within subloops, which necessarilly have depth `J>I`, we may - // have cycles. - // - // Thus, we need to prevent getting stuck in a cycle for these deeper loops by - // setting `N->visit(depth)` here, so `wasVisited` will allow them to - // immediately return. But, in debug mode, we'll set nodes of the same depth - // to `254` to check for cycles. - if (N->getLoop() == L) N->visit(254); - else N->visit(depth); + // Our goal here is to check for cycles in debug mode. + // Each level of our graph is acyclic, meaning that there are no cycles at + // that level when traversing only edges active at that given level. + // However, when considering edges active at level `I`, we may have cycles + // at level `J` if `J>I`. In otherwords, here we are travering all edges + // active at `I=depth`. Within subloops, which necessarilly have depth + // `J>I`, we may have cycles. + // + // Thus, we need to prevent getting stuck in a cycle for these deeper loops + // by setting `N->visit(depth)` here, so `wasVisited` will allow them to + // immediately return. But, in debug mode, we'll set nodes of the same depth + // to `254` to check for cycles. + if (N->getLoop() == L) N->visit(254); + else N->visit(depth); #else - N->visit(depth); + N->visit(depth); #endif - // iterate over users - if (auto *A = llvm::dyn_cast(N)) { - for (IR::Addr *m : A->outputAddrs(deps, depth)) { - if (m->wasVisited(depth)) continue; - body = visitLoopDependent(deps, L, m, depth, body); - } - } - if (auto *I = llvm::dyn_cast(N)) { - for (IR::Node *U : I->getUsers()) { - if (U->wasVisited(depth)) continue; - body = visitLoopDependent(deps, L, U, depth, body); + // iterate over users + if (auto *A = llvm::dyn_cast(N)) { + for (IR::Addr *m : A->outputAddrs(deps, depth)) { + if (m->wasVisited(depth)) continue; + body = visitLoopDependent(deps, L, m, depth, body); + } } - } else if (auto *S = llvm::dyn_cast(N)) { - for (IR::Node *U : S->getChild()->nodes()) { - if (U->wasVisited(depth)) continue; - body = visitLoopDependent(deps, L, U, depth, body); + if (auto *I = llvm::dyn_cast(N)) { + for (IR::Node *U : I->getUsers()) { + if (U->wasVisited(depth)) continue; + body = visitLoopDependent(deps, L, U, depth, body); + } + } else if (auto *S = llvm::dyn_cast(N)) { + for (IR::Node *U : S->getChild()->nodes()) { + if (U->wasVisited(depth)) continue; + body = visitLoopDependent(deps, L, U, depth, body); + } } - } #ifndef NDEBUG - if (N->getLoop() == L) N->visit(depth); + if (N->getLoop() == L) N->visit(depth); #endif - if (N->getLoop() == L) body = N->setNext(body); - return body; -} -inline auto topologicalSort(IR::Dependencies deps, IR::Loop *root, - unsigned depth) -> IR::Node * { - // basic plan for the top sort: - // We iterate across all users, once all of node's users have been added, - // we push it to the front of the list. Thus, we get a top-sorted list. - // We're careful about the order, so that this top sort should LICM all the - // addresses that it can. - // - // We must push the exit before the root (as the exit depends on the loop, and - // we iterate users). - // The exit doesn't use any in this block, so we begin by trying to push any - // instructions that don't depend on the loop. If we fail to push them (i.e., - // because they have uses that do depend on the loop), then they get added to - // a revisit queue. Any instructions we are able to push-front before we push - // the exit, implicitly happen after the exit, i.e. they have been LICMed into - // the exit block. We unvisit the revisit-queue, and add them back to the main - // worklist. Then, we proceed with a depth-first topological sort normally - // (iterating over uses, pushing to the front), starting with the loop root, - // so that it gets pushed to the front as soon as possible. That is, so that - // it happens as late as possible Any instructions that get pushed to the - // front afterwards have been LICMed into the loop pre-header. - // - // In this first pass, we iterate over all nodes, pushing those - // that can be hoisted after the exit block. - IR::Node *C = root->getChild(); - LoopDepSummary summary; - for (IR::Node *N : C->nodes()) - summary = searchLoopIndependentUsers(deps, root, N, depth, summary).summary; - // summary.afterExit will be hoisted out; every member has been marked as - // `visited` So, now we search all of root's users, i.e. every addr that - // depends on it - IR::Node *body; - for (IR::Node *N : summary.indexedByLoop->nodes()) - body = visitLoopDependent(deps, root, N, depth, body); - body = root->setNext(body); // now we can place the loop - for (IR::Node *N : summary.notIndexedByLoop->nodes()) - body = visitLoopDependent(deps, root, N, depth, body); - // and any remaining edges - return body; -} -// NOLINTNEXTLINE(misc-no-recursion) -inline auto buildGraph(IR::Dependencies deps, IR::Loop *root, unsigned depth) - -> IR::Node * { - // We build the instruction graph, via traversing the tree, and then - // top sorting as we recurse out - for (IR::Loop *child : root->subLoops()) buildGraph(deps, child, depth + 1); + if (N->getLoop() == L) body = N->setNext(body); + return body; + } + inline auto topologicalSort(IR::Dependencies deps, IR::Loop * root, + unsigned depth) + ->IR::Node * { + // basic plan for the top sort: + // We iterate across all users, once all of node's users have been added, + // we push it to the front of the list. Thus, we get a top-sorted list. + // We're careful about the order, so that this top sort should LICM all the + // addresses that it can. + // + // We must push the exit before the root (as the exit depends on the loop, + // and we iterate users). The exit doesn't use any in this block, so we + // begin by trying to push any instructions that don't depend on the loop. + // If we fail to push them (i.e., because they have uses that do depend on + // the loop), then they get added to a revisit queue. Any instructions we + // are able to push-front before we push the exit, implicitly happen after + // the exit, i.e. they have been LICMed into the exit block. We unvisit the + // revisit-queue, and add them back to the main worklist. Then, we proceed + // with a depth-first topological sort normally (iterating over uses, + // pushing to the front), starting with the loop root, so that it gets + // pushed to the front as soon as possible. That is, so that it happens as + // late as possible Any instructions that get pushed to the front afterwards + // have been LICMed into the loop pre-header. + // + // In this first pass, we iterate over all nodes, pushing those + // that can be hoisted after the exit block. + IR::Node *C = root->getChild(); + LoopDepSummary summary; + for (IR::Node *N : C->nodes()) + summary = + searchLoopIndependentUsers(deps, root, N, depth, summary).summary; + // summary.afterExit will be hoisted out; every member has been marked as + // `visited` So, now we search all of root's users, i.e. every addr that + // depends on it + IR::Node *body; + for (IR::Node *N : summary.indexedByLoop->nodes()) + body = visitLoopDependent(deps, root, N, depth, body); + body = root->setNext(body); // now we can place the loop + for (IR::Node *N : summary.notIndexedByLoop->nodes()) + body = visitLoopDependent(deps, root, N, depth, body); + // and any remaining edges + return body; + } + // NOLINTNEXTLINE(misc-no-recursion) + inline auto buildGraph(IR::Dependencies deps, IR::Loop * root, unsigned depth) + ->IR::Node * { + // We build the instruction graph, via traversing the tree, and then + // top sorting as we recurse out + for (IR::Loop *child : root->subLoops()) buildGraph(deps, child, depth + 1); - return topologicalSort(deps, root, depth); -} + return topologicalSort(deps, root, depth); + } -inline auto addAddrToGraph(Arena<> *salloc, Arena<> *lalloc, - lp::ScheduledNode *nodes) -> IR::Loop * { - auto s = salloc->scope(); - LoopTree *root = LoopTree::root(salloc, lalloc); - for (lp::ScheduledNode *node : nodes->getAllVertices()) - root->addNode(salloc, lalloc, node); - return root->getLoop(); -} -inline void eliminateAddr(IR::Addr *a, IR::Addr *b) { - if (a->indexMatrix() != b->indexMatrix()) return; - /// are there any addr between them? - if (a->isStore()) { - if (b->isStore()) { // Write->Write - // Are there reads in between? If so, we must keep-- - // --unless we're storing the same value twice (???) - // without other intervening store-edges. - // Without reads in between, it's safe. - } else { // Write->Read - // Can we replace the read with using the written value? - if (a->getAffineLoop() != b->getAffineLoop()) return; + inline auto addAddrToGraph(Arena<> * salloc, Arena<> * lalloc, + lp::ScheduledNode * nodes) + ->IR::Loop * { + auto s = salloc->scope(); + LoopTree *root = LoopTree::root(salloc, lalloc); + for (lp::ScheduledNode *node : nodes->getAllVertices()) + root->addNode(salloc, lalloc, node); + return root->getLoop(); + } + + class IROptimizer { + IR::Dependencies deps; + IR::Node *nodes; + MutPtrVector loopDeps; + Arena<> *lalloc; + Arena<> *salloc; + + static auto loopDepSats(Arena<> *alloc, IR::Dependencies deps, + lp::LoopBlock::OptimizationResult res) + -> MutPtrVector { + IR::MutPtrVector loopDeps{ + math::vector(alloc, unsigned(deps.size()))}; + // place deps at sat level for loops + for (IR::Addr *a : res.addr.getAddr()) { + IR::Loop *L = a->getLoop(); + for (int32_t id : a->inputEdgeIDs(deps)) { + uint8_t lvl = deps.satLevel(IR::Dependence::ID{id}); + L->getLoopAtDepth(lvl)->addEdge(loopDeps, id); + } + } + return loopDeps; } - } else if (b->isLoad()) { // Read->Read - // If they don't have the same parent, either... - // They're in different branches of loops, and load can't live - // in between them + + // plan: SCC? Iterate over nodes in program order? + // then we can iterate in order. + // What to do about depth? + // We may have // for (i : I){ // for (j : J){ - // A[i,j]; + // A[j] = x; // store + // y = A[j]; // load // } + // } + // In this case, we do have a cycle: + // A[j]^s_i -> A[j]^l_i + // A[j]^l_i -> A[j]^s_{i+1} + // However, this cycle does not prohibit deleting the load, + // replacing it with `y = x`. + // This still holds true if the load were a second store: + // for (i : I){ // for (j : J){ - // A[i,j]; + // A[j] = x; // store + // A[j] = y; // load + // } + // } + // We could stick with the single `y` store. + // Thus, for eliminating memory operations at a depth of 2, + // we are only concerned with dependencies still valid at a depth of 2. + // for (int i = 0 : i < I; ++i){ + // x[i] /= U[i,i]; + // for (int j = i+1; j < I; ++j){ + // x[j] -= x[i]*U[i,j]; // } // } - // or it is a subloop, but dependencies prevented us from hoisting. - if (a->getAffineLoop() != b->getAffineLoop()) return; - // Any writes in between them? - } // Read->Write, can't delete either -} -// plan: SCC? Iterate over nodes in program order? -// then we can iterate in order. -// What to do about depth? -// We may have -// for (i : I){ -// for (j : J){ -// A[j] = x; // store -// y = A[j]; // load -// } -// } -// In this case, we do have a cycle: -// A[j]^s_i -> A[j]^l_i -// A[j]^l_i -> A[j]^s_{i+1} -// However, this cycle does not prohibit deleting the load, -// replacing it with `y = x`. -// This still holds true if the load were a second store: -// for (i : I){ -// for (j : J){ -// A[j] = x; // store -// A[j] = y; // load -// } -// } -// We could stick with the single `y` store. -// Thus, for eliminating memory operations at a depth of 2, -// we are only concerned with dependencies still valid at a depth of 2. -// for (int i = 0 : i < I; ++i){ -// x[i] /= U[i,i]; -// for (int j = i+1; j < I; ++j){ -// x[j] -= x[i]*U[i,j]; -// } -// } -// Maybe just do the dumb thing? -// Walk the graph for addr costs, and at the same time, -// check the addr for eliminability, checking against what we've stored thus -// far. -// We currently do not store load-load edges, which is why only checking -// edge relationships is not ideal. -// We may store load-load edges in the future, as these could be used as -// part of the cost function of the linear program, i.e. we'd want to -// minimize the distance between loads (but allow reordering them). -// -// I think a reasonable approach is: -// Have a map from array pointer to Addr. Addrs form a chain. -// as we walk the graph, add each newly encountered addr to the front of the -// chain and check if we can eliminate it, or any of its predecessors. -// -// Note (bracketed means we might be able to eliminate): -// Read->[Read] could eliminate read -// Read->Write no change -// Write->[Read] can forward written value -// [Write]->Write can eliminate first write -// Thus, we can fuse this pass with our address cost calculation. -// We check if we can eliminate before calculating the new cost. -// The only case where we may remove an old value, write->write, -// we could just take the old cost and assign it to the new write. -// TODO: if we have only writes to a non-escaping array, we should -// be able to eliminate these writes too, and then also potentially -// remove that array temporary (e.g., if it were malloc'd). -// E.g. check if the array is a `llvm::isNonEscapingLocalObject` and allocated -// by `llvm::isRemovableAlloc`. -inline void removeRedundantAddr(IR::Dependencies deps, IR::Addr *addr) { - for (IR::Addr *a : addr->eachAddr()) { - for (poly::Dependence d : a->outputEdges(deps)) { - IR::Addr *b = d.output(); - eliminateAddr(a, b); + // Maybe just do the dumb thing? + // Walk the graph for addr costs, and at the same time, + // check the addr for eliminability, checking against what we've stored thus + // far. + // We currently do not store load-load edges, which is why only checking + // edge relationships is not ideal. + // We may store load-load edges in the future, as these could be used as + // part of the cost function of the linear program, i.e. we'd want to + // minimize the distance between loads (but allow reordering them). + // + // I think a reasonable approach is: + // Have a map from array pointer to Addr. Addrs form a chain. + // as we walk the graph, add each newly encountered addr to the front of the + // chain and check if we can eliminate it, or any of its predecessors. + // + // Note (bracketed means we might be able to eliminate): + // Read->[Read] could eliminate read + // Read->Write no change + // Write->[Read] can forward written value + // [Write]->Write can eliminate first write + // Thus, we can fuse this pass with our address cost calculation. + // We check if we can eliminate before calculating the new cost. + // The only case where we may remove an old value, write->write, + // we could just take the old cost and assign it to the new write. + // TODO: if we have only writes to a non-escaping array, we should + // be able to eliminate these writes too, and then also potentially + // remove that array temporary (e.g., if it were malloc'd). + // E.g. check if the array is a `llvm::isNonEscapingLocalObject` and + // allocated by `llvm::isRemovableAlloc`. + void removeRedundantAddr() { + for (IR::Addr *a : addr->eachAddr()) { + for (poly::Dependence d : a->outputEdges(deps)) { + IR::Addr *b = d.output(); + eliminateAddr(a, b); + } + } } - } -} -inline auto loopDepSats(Arena<> *alloc, IR::Dependencies deps, - lp::LoopBlock::OptimizationResult res) - -> MutPtrVector { - IR::MutPtrVector loopDeps{ - math::vector(alloc, unsigned(deps.size()))}; - // place deps at sat level for loops - for (IR::Addr *a : res.addr.getAddr()) { - IR::Loop *L = a->getLoop(); - for (int32_t id : a->inputEdgeIDs(deps)) { - uint8_t lvl = deps.satLevel(IR::Dependence::ID{id}); - L->getLoopAtDepth(lvl)->addEdge(loopDeps, id); + // The plan here is to index all arrays by relative position, and then + // sort outputEdges based on first->last, so that we can try to eliminate in + // order. We break on first failure to eliminate. + // a is the input, b the output + void eliminateAddr(IR::Addr *a, IR::Addr *b) { + if (a->indexMatrix() != b->indexMatrix()) return; + /// are there any addr between them? + if (a->isStore()) { + if (b->isStore()) { // Write->Write + // Are there reads in between? If so, we must keep-- + // --unless we're storing the same value twice (???) + // without other intervening store-edges. + // Without reads in between, it's safe. + } else { // Write->Read + // Can we replace the read with using the written value? + if (a->getAffineLoop() != b->getAffineLoop()) return; + } + } else if (b->isLoad()) { // Read->Read + // If they don't have the same parent, either... + // They're in different branches of loops, and load can't live + // in between them + // for (i : I){ + // for (j : J){ + // A[i,j]; + // } + // for (j : J){ + // A[i,j]; + // } + // } + // or it is a subloop, but dependencies prevented us from hoisting. + if (a->getAffineLoop() != b->getAffineLoop()) return; + // Any writes in between them? + } // else Read->Write, can't delete either } - } - return loopDeps; -} -// -// Considering reordering legality, example -// for (int i = 0: i < I; ++i){ -// for (int j = 0 : j < i; ++j){ -// x[i] -= x[j]*U[j,i]; -// } -// x[i] /= U[i,i]; -// } -// We have an edge from the store `x[i] = x[i] / U[i,i]=` to the load of -// `x[j]`, when `j = ` the current `i`, on some future iteration. -// We want to unroll; -// for (int i = 0: i < I-3; i += 4){ -// for (int j = 0 : j < i; ++j){ -// x[i] -= x[j]*U[j,i]; -// x[i+1] -= x[j]*U[j,i+1]; -// x[i+2] -= x[j]*U[j,i+2]; -// x[i+3] -= x[j]*U[j,i+3]; -// } -// x[i] /= U[i,i]; // store 0 -// { // perform unrolled j = i iter -// int j = i; // these all depend on store 0 -// x[i+1] -= x[j]*U[j,i+1]; -// x[i+2] -= x[j]*U[j,i+2]; -// x[i+3] -= x[j]*U[j,i+3]; -// } -// x[i+1] /= U[i+1,i+1]; // store 1 -// { // perform unrolled j = i + 1 iter -// int j = i+1; // these all depend on store 1 -// x[i+2] -= x[j]*U[j,i+2]; -// x[i+3] -= x[j]*U[j,i+3]; -// } -// x[i+2] /= U[i+2,i+2]; // store 2 -// { // perform unrolled j = i + 2 iter -// int j = i+2; // this depends on store 2 -// x[i+3] -= x[j]*U[j,i+3]; -// } -// x[i+3] /= U[i+3,i+3]; -// } -// The key to legality here is that we peel off the dependence polyhedra -// from the loop's iteration space. -// We can then perform the dependent iterations in order. -// With masking, the above code can be vectorized in this manner. -// The basic approach is that we have the dependence polyhedra: -// -// 0 <= i_s < I -// 0 <= i_l < I -// 0 <= j_l < i_l -// i_s = j_l // dependence, yields same address in `x` -// -// Note that our schedule sets -// i_s = i_l -// Which gives: -// i_l = i_s = j_l < i_l -// a contradiction, meaning that the dependency is -// conditionally (on our schedule) independent. -// Excluding the `i_s = i_l` constraint from the -// polyhedra gives us the region of overlap. -// -// When unrolling by `U`, we get using `U=4` as an example: -// i^0_s + 1 = i^1_s -// i^0_s + 2 = i^2_s -// i^0_s + 3 = i^3_s -// 0 <= i^0_s < I -// 0 <= i^1_s < I -// 0 <= i^2_s < I -// 0 <= i^3_s < I -// 0 <= i^0_l < I -// 0 <= i^1_l < I -// 0 <= i^2_l < I -// 0 <= i^3_l < I -// 0 <= j_l < i^0_l -// 0 <= j_l < i^1_l -// 0 <= j_l < i^2_l -// 0 <= j_l < i^3_l -// i^0_s = j_l || i^1_s = j_l || i^2_s = j_l || i^3_s = j_l -// where the final union can be replaced with -// i^0_s = j_l || i^0_s+1 = j_l || i^0_s+2 = j_l || i^0_s+3 = j_l -// i^0_s <= j_1 <= i^0_s+3 -// -// Similarly, we can compress the other inequalities... -// 0 <= i^0_s < I - 3 -// 0 <= i^0_l < I - 3 -// 0 <= j_l < i^0_l -// i^0_s <= j_1 <= i^0_s+3 // dependence region -// -// So, the parallel region is the union -// i^0_s > j_1 || j_1 > i^0_s+3 -// -// In this example, note that the region `j_1 > i^0_s+3` is empty -// so we have one parallel region, and then one serial region. -// -/// -/// Optimize the schedule -inline void optimize(IR::Dependencies deps, IR::Cache &instr, Arena<> *lalloc, - lp::LoopBlock::OptimizationResult res) { - /// we must build the IR::Loop - /// Initially, to help, we use a nested vector, so that we can index into it - /// using the fusion omegas. We allocate it with the longer lived `instr` - /// alloc, so we can checkpoint it here, and use alloc for other IR nodes. - Arena<> *salloc = instr.getAllocator(); - IR::Node *N = buildGraph(deps, addAddrToGraph(salloc, lalloc, res.nodes), 0); - // `N` is the head of the topologically sorted graph - // We now try to remove redundant memory operations + public: + IROptimizer(IR::Dependencies deps, IR::Node *nodes, Arena<> *lalloc, + Arena<> *salloc) + : deps{deps}, nodes{nodes}, + loopDeps{loopDepSats(alloc, deps, nodes->getOptimizationResult())}, + lalloc{lalloc}, salloc{salloc} { + removeRedundantAddr(); + } + }; - removeRedundantAddr(deps, res.addr.addr); -} + // + // Considering reordering legality, example + // for (int i = 0: i < I; ++i){ + // for (int j = 0 : j < i; ++j){ + // x[i] -= x[j]*U[j,i]; + // } + // x[i] /= U[i,i]; + // } + // We have an edge from the store `x[i] = x[i] / U[i,i]=` to the load of + // `x[j]`, when `j = ` the current `i`, on some future iteration. + // We want to unroll; + // for (int i = 0: i < I-3; i += 4){ + // for (int j = 0 : j < i; ++j){ + // x[i] -= x[j]*U[j,i]; + // x[i+1] -= x[j]*U[j,i+1]; + // x[i+2] -= x[j]*U[j,i+2]; + // x[i+3] -= x[j]*U[j,i+3]; + // } + // x[i] /= U[i,i]; // store 0 + // { // perform unrolled j = i iter + // int j = i; // these all depend on store 0 + // x[i+1] -= x[j]*U[j,i+1]; + // x[i+2] -= x[j]*U[j,i+2]; + // x[i+3] -= x[j]*U[j,i+3]; + // } + // x[i+1] /= U[i+1,i+1]; // store 1 + // { // perform unrolled j = i + 1 iter + // int j = i+1; // these all depend on store 1 + // x[i+2] -= x[j]*U[j,i+2]; + // x[i+3] -= x[j]*U[j,i+3]; + // } + // x[i+2] /= U[i+2,i+2]; // store 2 + // { // perform unrolled j = i + 2 iter + // int j = i+2; // this depends on store 2 + // x[i+3] -= x[j]*U[j,i+3]; + // } + // x[i+3] /= U[i+3,i+3]; + // } + // The key to legality here is that we peel off the dependence polyhedra + // from the loop's iteration space. + // We can then perform the dependent iterations in order. + // With masking, the above code can be vectorized in this manner. + // The basic approach is that we have the dependence polyhedra: + // + // 0 <= i_s < I + // 0 <= i_l < I + // 0 <= j_l < i_l + // i_s = j_l // dependence, yields same address in `x` + // + // Note that our schedule sets + // i_s = i_l + // Which gives: + // i_l = i_s = j_l < i_l + // a contradiction, meaning that the dependency is + // conditionally (on our schedule) independent. + // Excluding the `i_s = i_l` constraint from the + // polyhedra gives us the region of overlap. + // + // When unrolling by `U`, we get using `U=4` as an example: + // i^0_s + 1 = i^1_s + // i^0_s + 2 = i^2_s + // i^0_s + 3 = i^3_s + // 0 <= i^0_s < I + // 0 <= i^1_s < I + // 0 <= i^2_s < I + // 0 <= i^3_s < I + // 0 <= i^0_l < I + // 0 <= i^1_l < I + // 0 <= i^2_l < I + // 0 <= i^3_l < I + // 0 <= j_l < i^0_l + // 0 <= j_l < i^1_l + // 0 <= j_l < i^2_l + // 0 <= j_l < i^3_l + // i^0_s = j_l || i^1_s = j_l || i^2_s = j_l || i^3_s = j_l + // where the final union can be replaced with + // i^0_s = j_l || i^0_s+1 = j_l || i^0_s+2 = j_l || i^0_s+3 = j_l + // i^0_s <= j_1 <= i^0_s+3 + // + // Similarly, we can compress the other inequalities... + // 0 <= i^0_s < I - 3 + // 0 <= i^0_l < I - 3 + // 0 <= j_l < i^0_l + // i^0_s <= j_1 <= i^0_s+3 // dependence region + // + // So, the parallel region is the union + // i^0_s > j_1 || j_1 > i^0_s+3 + // + // In this example, note that the region `j_1 > i^0_s+3` is empty + // so we have one parallel region, and then one serial region. + // + /// + /// Optimize the schedule + inline void optimize(IR::Dependencies deps, IR::Cache & instr, + Arena<> * lalloc, + lp::LoopBlock::OptimizationResult res) { + /// we must build the IR::Loop + /// Initially, to help, we use a nested vector, so that we can index into it + /// using the fusion omegas. We allocate it with the longer lived `instr` + /// alloc, so we can checkpoint it here, and use alloc for other IR nodes. + Arena<> *salloc = instr.getAllocator(); + IR::Node *N = + buildGraph(deps, addAddrToGraph(salloc, lalloc, res.nodes), 0); + // `N` is the head of the topologically sorted graph + // We now try to remove redundant memory operations -/* -// NOLINTNEXTLINE(misc-no-recursion) -inline auto printSubDotFile(Arena<> *alloc, llvm::raw_ostream &out, - map &names, - llvm::SmallVectorImpl &addrNames, - unsigned addrIndOffset, poly::Loop *lret) --> poly::Loop * { -poly::Loop *loop{nullptr}; -size_t j = 0; -for (auto *addr : header.getAddr()) loop = addr->getAffLoop(); -for (auto &subTree : subTrees) { - // `names` might realloc, relocating `names[this]` - if (getDepth()) - names[subTree.subTree] = names[this] + "SubLoop#" + std::to_string(j++); - else names[subTree.subTree] = "LoopNest#" + std::to_string(j++); - if (loop == nullptr) - for (auto *addr : subTree.exit.getAddr()) loop = addr->getAffLoop(); - loop = subTree.subTree->printSubDotFile(alloc, out, names, addrNames, - addrIndOffset, loop); -} -const std::string &name = names[this]; -out << "\"" << name - << "\" [shape=plain\nlabel = <\n"; -size_t i = header.printDotNodes(out, 0, addrNames, addrIndOffset, name); -j = 0; -std::string loopEdges; -for (auto &subTree : subTrees) { - std::string label = "f" + std::to_string(++i); - out << " \n"; - loopEdges += "\"" + name + "\":f" + std::to_string(i) + " -> \"" + - names[subTree.subTree] + "\":f0 [color=\"#ff0000\"];\n"; - i = subTree.exit.printDotNodes(out, i, addrNames, addrIndOffset, name); -} -out << "
"; -// assert(depth == 0 || (loop != nullptr)); -if (loop && (getDepth() > 0)) { - for (size_t i = loop->getNumLoops(), k = getDepth(); i > k;) - loop = loop->removeLoop(alloc, --i); - loop->pruneBounds(alloc); - loop->printBounds(out); -} else out << "Top Level"; -out << "
SubLoop#" << j++ - << "
>];\n" << loopEdges; -if (lret) return lret; -if ((loop == nullptr) || (getDepth() <= 1)) return nullptr; -return loop->removeLoop(alloc, getDepth() - 1); -} + IROptimizer(deps, N, lalloc, salloc); + } -inline void printDotFile(Arena<> *alloc, llvm::raw_ostream &out) { -map names; -llvm::SmallVector addrNames(numAddr_); -names[this] = "toplevel"; -out << "digraph LoopNest {\n"; -auto p = alloc.scope(); -printSubDotFile(alloc, out, names, addrNames, subTrees.size(), nullptr); -printDotEdges(out, addrNames); -out << "}\n"; -} -*/ -// class LoopForestSchedule : LoopTreeSchedule { -// [[no_unique_address]] Arena<> *allocator; -// }; + /* + // NOLINTNEXTLINE(misc-no-recursion) + inline auto printSubDotFile(Arena<> *alloc, llvm::raw_ostream &out, + map &names, + llvm::SmallVectorImpl &addrNames, + unsigned addrIndOffset, poly::Loop *lret) + -> poly::Loop * { + poly::Loop *loop{nullptr}; + size_t j = 0; + for (auto *addr : header.getAddr()) loop = addr->getAffLoop(); + for (auto &subTree : subTrees) { + // `names` might realloc, relocating `names[this]` + if (getDepth()) + names[subTree.subTree] = names[this] + "SubLoop#" + std::to_string(j++); + else names[subTree.subTree] = "LoopNest#" + std::to_string(j++); + if (loop == nullptr) + for (auto *addr : subTree.exit.getAddr()) loop = addr->getAffLoop(); + loop = subTree.subTree->printSubDotFile(alloc, out, names, addrNames, + addrIndOffset, loop); + } + const std::string &name = names[this]; + out << "\"" << name + << "\" [shape=plain\nlabel = <\n"; + size_t i = header.printDotNodes(out, 0, addrNames, addrIndOffset, name); + j = 0; + std::string loopEdges; + for (auto &subTree : subTrees) { + std::string label = "f" + std::to_string(++i); + out << " \n"; + loopEdges += "\"" + name + "\":f" + std::to_string(i) + " -> \"" + + names[subTree.subTree] + "\":f0 [color=\"#ff0000\"];\n"; + i = subTree.exit.printDotNodes(out, i, addrNames, addrIndOffset, name); + } + out << "
"; + // assert(depth == 0 || (loop != nullptr)); + if (loop && (getDepth() > 0)) { + for (size_t i = loop->getNumLoops(), k = getDepth(); i > k;) + loop = loop->removeLoop(alloc, --i); + loop->pruneBounds(alloc); + loop->printBounds(out); + } else out << "Top Level"; + out << "
SubLoop#" << j++ + << "
>];\n" << loopEdges; + if (lret) return lret; + if ((loop == nullptr) || (getDepth() <= 1)) return nullptr; + return loop->removeLoop(alloc, getDepth() - 1); + } + + inline void printDotFile(Arena<> *alloc, llvm::raw_ostream &out) { + map names; + llvm::SmallVector addrNames(numAddr_); + names[this] = "toplevel"; + out << "digraph LoopNest {\n"; + auto p = alloc.scope(); + printSubDotFile(alloc, out, names, addrNames, subTrees.size(), nullptr); + printDotEdges(out, addrNames); + out << "}\n"; + } + */ + // class LoopForestSchedule : LoopTreeSchedule { + // [[no_unique_address]] Arena<> *allocator; + // }; } // namespace poly::CostModeling From d826223a248e18e2f79951f813478f7e5b9e2fea Mon Sep 17 00:00:00 2001 From: chriselrod Date: Wed, 19 Jul 2023 19:12:02 -0400 Subject: [PATCH 003/112] A few updates and bug fixes --- include/Dicts/MapVector.hpp | 2 +- include/IR/Address.hpp | 21 +- include/IR/Cache.hpp | 2 +- include/IR/CostModeling.hpp | 1264 ++++++++++++++++++----------------- include/IR/Node.hpp | 15 + include/IR/Predicate.hpp | 5 +- 6 files changed, 677 insertions(+), 632 deletions(-) diff --git a/include/Dicts/MapVector.hpp b/include/Dicts/MapVector.hpp index 4dc6eec27..e5e1ce47d 100644 --- a/include/Dicts/MapVector.hpp +++ b/include/Dicts/MapVector.hpp @@ -64,7 +64,7 @@ template class OrderedMap { } constexpr void grow(unsigned i) { if (i == vector.getCapacity()) - vector.reserve(*(map.get_allocator().get_allocator()), + vector.reserve((map.get_allocator().get_allocator()), std::max(8, 2 * i)); } constexpr void insert(std::pair &&value) { diff --git a/include/IR/Address.hpp b/include/IR/Address.hpp index 56e5e4f61..89f35b75b 100644 --- a/include/IR/Address.hpp +++ b/include/IR/Address.hpp @@ -108,12 +108,6 @@ class Addr : public Instruction { numLoops, natDepth, maxNumLoops), basePointer(arrayPtr), instr(user), offSym(offsym), syms(s), numDim(dimOff[0]), numDynSym(dimOff[1]){}; - explicit Addr(const llvm::SCEVUnknown *arrayPtr, llvm::Instruction *user, - unsigned numLoops) - : Instruction(llvm::isa(user) ? VK_Stow : VK_Load, - numLoops), - basePointer(arrayPtr), instr(user){}; - /// Constructor for 0 dimensional memory access [[nodiscard]] constexpr auto getIntMemory() -> int64_t * { return mem; } [[nodiscard]] constexpr auto getIntMemory() const -> int64_t * { @@ -136,6 +130,15 @@ class Addr : public Instruction { } public: + /// Constructor for 0 dimensional memory access + /// public for use with `std::construct_at` + /// Perhaps it should use a passkey? + explicit Addr(const llvm::SCEVUnknown *arrayPtr, llvm::Instruction *user, + unsigned numLoops) + : Instruction(llvm::isa(user) ? VK_Stow : VK_Load, + numLoops), + basePointer(arrayPtr), instr(user){}; + constexpr void rotate(NotNull explicitLoop, SquarePtrMatrix Pinv, int64_t denom, PtrVector omega, int64_t *offsets) { @@ -257,6 +260,12 @@ class Addr : public Instruction { [[nodiscard]] inline auto inputEdgeIDs(Dependencies, unsigned depth) const; [[nodiscard]] inline auto outputEdgeIDs(Dependencies, unsigned depth) const; + [[nodiscard]] static auto zeroDim(Arena<> *alloc, + llvm::SCEVUnknown const *arrayPtr, + llvm::Instruction *loadOrStore, + unsigned numLoops) { + return alloc->create(arrayPtr, loadOrStore, numLoops); + } /// Constructor for regular indexing [[nodiscard]] static auto construct(Arena<> *alloc, const llvm::SCEVUnknown *arrayPtr, diff --git a/include/IR/Cache.hpp b/include/IR/Cache.hpp index 8fe95a2a7..5813f1f5e 100644 --- a/include/IR/Cache.hpp +++ b/include/IR/Cache.hpp @@ -483,7 +483,7 @@ class Cache { auto zeroDimRef(llvm::Instruction *loadOrStore, llvm::SCEVUnknown const *arrayPtr, unsigned numLoops) -> Addr * { - return Addr::construct(&alloc, arrayPtr, loadOrStore, numLoops); + return Addr::zeroDim(&alloc, arrayPtr, loadOrStore, numLoops); } // create Addr auto getArrayRef(llvm::Instruction *loadOrStore, llvm::Loop *L, diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index f0abc165c..204851a0c 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -1,4 +1,4 @@ -br #pragma once +#pragma once // #include "./ControlFlowMerging.hpp" #include "Graphs/Graphs.hpp" @@ -32,674 +32,694 @@ br #pragma once #include #include - namespace poly::CostModeling { +namespace poly::CostModeling { - class CPURegisterFile { - [[no_unique_address]] uint8_t maximumVectorWidth; - [[no_unique_address]] uint8_t numVectorRegisters; - [[no_unique_address]] uint8_t numGeneralPurposeRegisters; - [[no_unique_address]] uint8_t numPredicateRegisters; +class CPURegisterFile { + [[no_unique_address]] uint8_t maximumVectorWidth; + [[no_unique_address]] uint8_t numVectorRegisters; + [[no_unique_address]] uint8_t numGeneralPurposeRegisters; + [[no_unique_address]] uint8_t numPredicateRegisters; - // hacky check for has AVX512 - static inline auto hasAVX512(llvm::LLVMContext &C, - const llvm::TargetTransformInfo &TTI) -> bool { - return TTI.isLegalMaskedExpandLoad( - llvm::FixedVectorType::get(llvm::Type::getDoubleTy(C), 8)); - } + // hacky check for has AVX512 + static inline auto hasAVX512(llvm::LLVMContext &C, + const llvm::TargetTransformInfo &TTI) -> bool { + return TTI.isLegalMaskedExpandLoad( + llvm::FixedVectorType::get(llvm::Type::getDoubleTy(C), 8)); + } - static auto estimateNumPredicateRegisters( - llvm::LLVMContext &C, const llvm::TargetTransformInfo &TTI) -> uint8_t { - if (TTI.supportsScalableVectors()) return 8; - // hacky check for AVX512 - if (hasAVX512(C, TTI)) return 7; // 7, because k0 is reserved for unmasked - return 0; - } - // returns vector width in bits, ignoring mprefer-vector-width - static auto estimateMaximumVectorWidth(llvm::LLVMContext &C, - const llvm::TargetTransformInfo &TTI) - -> uint8_t { - uint8_t twiceMaxVectorWidth = 2; - auto *f32 = llvm::Type::getFloatTy(C); - llvm::InstructionCost prevCost = TTI.getArithmeticInstrCost( + static auto estimateNumPredicateRegisters( + llvm::LLVMContext &C, const llvm::TargetTransformInfo &TTI) -> uint8_t { + if (TTI.supportsScalableVectors()) return 8; + // hacky check for AVX512 + if (hasAVX512(C, TTI)) return 7; // 7, because k0 is reserved for unmasked + return 0; + } + // returns vector width in bits, ignoring mprefer-vector-width + static auto estimateMaximumVectorWidth(llvm::LLVMContext &C, + const llvm::TargetTransformInfo &TTI) + -> uint8_t { + uint8_t twiceMaxVectorWidth = 2; + auto *f32 = llvm::Type::getFloatTy(C); + llvm::InstructionCost prevCost = TTI.getArithmeticInstrCost( + llvm::Instruction::FAdd, + llvm::FixedVectorType::get(f32, twiceMaxVectorWidth)); + while (true) { + llvm::InstructionCost nextCost = TTI.getArithmeticInstrCost( llvm::Instruction::FAdd, - llvm::FixedVectorType::get(f32, twiceMaxVectorWidth)); - while (true) { - llvm::InstructionCost nextCost = TTI.getArithmeticInstrCost( - llvm::Instruction::FAdd, - llvm::FixedVectorType::get(f32, twiceMaxVectorWidth *= 2)); - if (nextCost > prevCost) break; - prevCost = nextCost; - } - return 16 * twiceMaxVectorWidth; + llvm::FixedVectorType::get(f32, twiceMaxVectorWidth *= 2)); + if (nextCost > prevCost) break; + prevCost = nextCost; } + return 16 * twiceMaxVectorWidth; + } - public: - CPURegisterFile(llvm::LLVMContext &C, - const llvm::TargetTransformInfo &TTI) { - maximumVectorWidth = estimateMaximumVectorWidth(C, TTI); - numVectorRegisters = TTI.getNumberOfRegisters(true); - numGeneralPurposeRegisters = TTI.getNumberOfRegisters(false); - numPredicateRegisters = estimateNumPredicateRegisters(C, TTI); - } - [[nodiscard]] constexpr auto getNumVectorBits() const -> uint8_t { - return maximumVectorWidth; - } - [[nodiscard]] constexpr auto getNumVector() const -> uint8_t { - return numVectorRegisters; - } - [[nodiscard]] constexpr auto getNumScalar() const -> uint8_t { - return numGeneralPurposeRegisters; - } - [[nodiscard]] constexpr auto getNumPredicate() const -> uint8_t { - return numPredicateRegisters; - } - }; - // struct CPUExecutionModel {}; +public: + CPURegisterFile(llvm::LLVMContext &C, const llvm::TargetTransformInfo &TTI) { + maximumVectorWidth = estimateMaximumVectorWidth(C, TTI); + numVectorRegisters = TTI.getNumberOfRegisters(true); + numGeneralPurposeRegisters = TTI.getNumberOfRegisters(false); + numPredicateRegisters = estimateNumPredicateRegisters(C, TTI); + } + [[nodiscard]] constexpr auto getNumVectorBits() const -> uint8_t { + return maximumVectorWidth; + } + [[nodiscard]] constexpr auto getNumVector() const -> uint8_t { + return numVectorRegisters; + } + [[nodiscard]] constexpr auto getNumScalar() const -> uint8_t { + return numGeneralPurposeRegisters; + } + [[nodiscard]] constexpr auto getNumPredicate() const -> uint8_t { + return numPredicateRegisters; + } +}; +// struct CPUExecutionModel {}; - // Plan for cost modeling: - // 1. Build Instruction graph - // 2. Iterate over all PredicatedChains, merging instructions across branches - // where possible - // 3. Create a loop tree structure for optimization - // 4. Create InstructionBlocks at each level. +// Plan for cost modeling: +// 1. Build Instruction graph +// 2. Iterate over all PredicatedChains, merging instructions across branches +// where possible +// 3. Create a loop tree structure for optimization +// 4. Create InstructionBlocks at each level. - // void pushBlock(llvm::SmallPtrSet &trackInstr, - // llvm::SmallPtrSet &chainBBs, - // Predicates &pred, llvm::BasicBlock *BB) { - // assert(chainBBs.contains(block)); - // chainBBs.erase(BB); - // // we only want to extract relevant instructions, i.e. parents of - // stores for (llvm::Instruction &instr : *BB) { - // if (trackInstr.contains(&instr)) - // instructions.emplace_back(pred, instr); - // } - // llvm::Instruction *term = BB->getTerminator(); - // if (!term) - // return; - // switch (term->getNumSuccessors()) { - // case 0: - // return; - // case 1: - // BB = term->getSuccessor(0); - // if (chainBBs.contains(BB)) - // pushBlock(trackInstr, chainBBs, pred, BB); - // return; - // case 2: - // break; - // default: - // assert(false); - // } - // auto succ0 = term->getSuccessor(0); - // auto succ1 = term->getSuccessor(1); - // if (chainBBs.contains(succ0) && chainBBs.contains(succ1)) { - // // TODO: we need to fuse these blocks. +// void pushBlock(llvm::SmallPtrSet &trackInstr, +// llvm::SmallPtrSet &chainBBs, +// Predicates &pred, llvm::BasicBlock *BB) { +// assert(chainBBs.contains(block)); +// chainBBs.erase(BB); +// // we only want to extract relevant instructions, i.e. parents of +// stores for (llvm::Instruction &instr : *BB) { +// if (trackInstr.contains(&instr)) +// instructions.emplace_back(pred, instr); +// } +// llvm::Instruction *term = BB->getTerminator(); +// if (!term) +// return; +// switch (term->getNumSuccessors()) { +// case 0: +// return; +// case 1: +// BB = term->getSuccessor(0); +// if (chainBBs.contains(BB)) +// pushBlock(trackInstr, chainBBs, pred, BB); +// return; +// case 2: +// break; +// default: +// assert(false); +// } +// auto succ0 = term->getSuccessor(0); +// auto succ1 = term->getSuccessor(1); +// if (chainBBs.contains(succ0) && chainBBs.contains(succ1)) { +// // TODO: we need to fuse these blocks. - // } else if (chainBBs.contains(succ0)) { - // pushBlock(trackInstr, chainBBs, pred, succ0); - // } else if (chainBBs.contains(succ1)) { - // pushBlock(trackInstr, chainBBs, pred, succ1); - // } - // } - template using Vec = math::ResizeableView; +// } else if (chainBBs.contains(succ0)) { +// pushBlock(trackInstr, chainBBs, pred, succ0); +// } else if (chainBBs.contains(succ1)) { +// pushBlock(trackInstr, chainBBs, pred, succ1); +// } +// } +template using Vec = math::ResizeableView; - // TODO: instead of this, update in-place and ensure all Addr are - // over-allocated to correspond with max depth? Because we parse in reverse - // order, we have max possible depth of `ScheduledNode`s using it at time we - // create. +// TODO: instead of this, update in-place and ensure all Addr are +// over-allocated to correspond with max depth? Because we parse in reverse +// order, we have max possible depth of `ScheduledNode`s using it at time we +// create. - /// LoopTree - /// A tree of loops, with an indexable vector of IR::Loop*s, to facilitate - /// construction of the IR::Loop graph, from the fusion omegas - class LoopTree { - // The root of this subtree - NotNull loop; - // LoopTree *parent{nullptr}; // do we need this? - Vec children{}; - unsigned depth{0}; - // We do not need to know the previous loop, as dependencies between - // the `Addr`s and instructions will determine the ordering. - constexpr LoopTree(Arena<> *lalloc, LoopTree *parent_) - : loop{lalloc->create(parent_->depth + 1)}, - depth(parent_->depth + 1) { - // allocate the root node, and connect it to parent's node, as well as - // previous loop of the same level. - loop->setParent(parent_->loop); - } - constexpr LoopTree(Arena<> *lalloc) : loop{lalloc->create(0)} {} +/// LoopTree +/// A tree of loops, with an indexable vector of IR::Loop*s, to facilitate +/// construction of the IR::Loop graph, from the fusion omegas +class LoopTree { + // The root of this subtree + NotNull loop; + // LoopTree *parent{nullptr}; // do we need this? + Vec children{}; + unsigned depth{0}; + // We do not need to know the previous loop, as dependencies between + // the `Addr`s and instructions will determine the ordering. + constexpr LoopTree(Arena<> *lalloc, LoopTree *parent_) + : loop{lalloc->create(parent_->depth + 1)}, + depth(parent_->depth + 1) { + // allocate the root node, and connect it to parent's node, as well as + // previous loop of the same level. + loop->setParent(parent_->loop); + } + constexpr LoopTree(Arena<> *lalloc) : loop{lalloc->create(0)} {} - public: - static auto root(Arena<> *salloc, Arena<> *lalloc) -> LoopTree * { - return new (salloc) LoopTree(lalloc); - } - // salloc: Short lived allocator, for the indexable `Vec`s - // Longer lived allocator, for the IR::Loop nodes - // NOLINTNEXTLINE(misc-no-recursion) - void addNode(Arena<> *salloc, Arena<> *lalloc, lp::ScheduledNode *node) { - if (node->getNumLoops() == depth) { - // Then it belongs here, and we add loop's dependencies. - // We only need to add deps to support SCC/top sort now. - // We also apply the rotation here. - // For dependencies in SCC iteration, only indvar deps get iterated. - auto [Pinv, denom] = math::NormalForm::scaledInv(node->getPhi()); - NotNull affloop = - node->getLoopNest()->rotate(lalloc, Pinv, node->getOffset()); - for (IR::Addr *m : node->localAddr()) { - m->rotate(affloop, Pinv, denom, node->getOffsetOmega(), - node->getOffset()); - loop->insertAfter(m); - } - return; +public: + static auto root(Arena<> *salloc, Arena<> *lalloc) -> LoopTree * { + return new (salloc) LoopTree(lalloc); + } + // salloc: Short lived allocator, for the indexable `Vec`s + // Longer lived allocator, for the IR::Loop nodes + // NOLINTNEXTLINE(misc-no-recursion) + void addNode(Arena<> *salloc, Arena<> *lalloc, lp::ScheduledNode *node) { + if (node->getNumLoops() == depth) { + // Then it belongs here, and we add loop's dependencies. + // We only need to add deps to support SCC/top sort now. + // We also apply the rotation here. + // For dependencies in SCC iteration, only indvar deps get iterated. + auto [Pinv, denom] = math::NormalForm::scaledInv(node->getPhi()); + NotNull affloop = + node->getLoopNest()->rotate(lalloc, Pinv, node->getOffset()); + for (IR::Addr *m : node->localAddr()) { + m->rotate(affloop, Pinv, denom, node->getOffsetOmega(), + node->getOffset()); + loop->insertAfter(m); } - // we need to find the sub-loop tree to which we add `node` - ptrdiff_t idx = node->getFusionOmega(depth); - invariant(idx >= 0); - ptrdiff_t numChildren = children.size(); - if (idx >= children.size()) { - if (idx >= children.getCapacity()) { - // allocate extra capacity - children.reserve(salloc, 2 * (idx + 1)); - } - // allocate new nodes and resize - children.resize(idx + 1); - for (ptrdiff_t i = numChildren; i < idx + 1; ++i) - children[i] = new (salloc) LoopTree{lalloc, this}; - numChildren = idx + 1; + return; + } + // we need to find the sub-loop tree to which we add `node` + ptrdiff_t idx = node->getFusionOmega(depth); + invariant(idx >= 0); + ptrdiff_t numChildren = children.size(); + if (idx >= children.size()) { + if (idx >= children.getCapacity()) { + // allocate extra capacity + children.reserve(salloc, 2 * (idx + 1)); } - children[idx]->addNode(salloc, lalloc, node); + // allocate new nodes and resize + children.resize(idx + 1); + for (ptrdiff_t i = numChildren; i < idx + 1; ++i) + children[i] = new (salloc) LoopTree{lalloc, this}; + numChildren = idx + 1; } - constexpr auto getChildren() -> Vec { return children; } - constexpr auto getLoop() -> IR::Loop * { return loop; } - }; + children[idx]->addNode(salloc, lalloc, node); + } + constexpr auto getChildren() -> Vec { return children; } + constexpr auto getLoop() -> IR::Loop * { return loop; } +}; - struct LoopDepSummary { - IR::Node *afterExit{nullptr}; - IR::Addr *indexedByLoop{nullptr}; - IR::Addr *notIndexedByLoop{nullptr}; - }; - struct LoopIndependent { - LoopDepSummary summary; - bool independent; - constexpr auto operator*=(LoopIndependent other) -> LoopIndependent & { - summary = other.summary; - independent = independent && other.independent; - return *this; - } - }; - // +struct LoopDepSummary { + IR::Node *afterExit{nullptr}; + IR::Addr *indexedByLoop{nullptr}; + IR::Addr *notIndexedByLoop{nullptr}; +}; +struct LoopIndependent { + LoopDepSummary summary; + bool independent; + constexpr auto operator*=(LoopIndependent other) -> LoopIndependent & { + summary = other.summary; + independent = independent && other.independent; + return *this; + } +}; +// - // searches `N` and it's users for loop-independent users - // this exits early if it finds a dependent user; we search everything - // anyway, so we'll revist later anyway. - // We return a `IR::Node *, bool` pair, where the `bool` is true if - // `N` was loop independent. - // We do this rather than something like returning a `nullptr`, as - // we may have descended into instructions, found some users that are - // but then also found some that are not; we need to return `false` - // in this case, but we of course want to still return those we found. - // NOLINTNEXTLINE(misc-no-recursion) - inline auto searchLoopIndependentUsers(IR::Dependencies deps, IR::Loop * L, - IR::Node * N, uint8_t depth, - LoopDepSummary summary) - ->LoopIndependent { - if (N->dependsOnParentLoop()) return {summary, false}; - if (llvm::isa(N)) return {summary, false}; - if (IR::Loop *P = N->getLoop(); P != L) - return {summary, !(P && L->contains(P))}; - LoopIndependent ret{summary, true}; - auto *a = llvm::dyn_cast(N); - if (a) { - a->removeFromList(); - if (a->indexedByInnermostLoop()) { - a->insertAfter(ret.summary.indexedByLoop); - ret.summary.indexedByLoop = a; - return {summary, false}; - } - a->insertAfter(ret.summary.notIndexedByLoop); - ret.summary.notIndexedByLoop = a; - for (IR::Addr *m : a->outputAddrs(deps, depth)) { - ret *= searchLoopIndependentUsers(deps, L, m, depth, summary); - if (ret.independent) continue; - a->setDependsOnParentLoop(); - return ret; - } +// searches `N` and it's users for loop-independent users +// this exits early if it finds a dependent user; we search everything +// anyway, so we'll revist later anyway. +// We return a `IR::Node *, bool` pair, where the `bool` is true if +// `N` was loop independent. +// We do this rather than something like returning a `nullptr`, as +// we may have descended into instructions, found some users that are +// but then also found some that are not; we need to return `false` +// in this case, but we of course want to still return those we found. +// NOLINTNEXTLINE(misc-no-recursion) +inline auto searchLoopIndependentUsers(IR::Dependencies deps, IR::Loop *L, + IR::Node *N, uint8_t depth, + LoopDepSummary summary) + -> LoopIndependent { + if (N->dependsOnParentLoop()) return {summary, false}; + if (llvm::isa(N)) return {summary, false}; + if (IR::Loop *P = N->getLoop(); P != L) + return {summary, !(P && L->contains(P))}; + LoopIndependent ret{summary, true}; + auto *a = llvm::dyn_cast(N); + if (a) { + a->removeFromList(); + if (a->indexedByInnermostLoop()) { + a->insertAfter(ret.summary.indexedByLoop); + ret.summary.indexedByLoop = a; + return {summary, false}; } - // if it isn't a Loop, must be an `Instruction` - IR::Value *I = llvm::cast(N); - for (IR::Node *U : I->getUsers()) { - ret *= searchLoopIndependentUsers(deps, L, U, depth, summary); + a->insertAfter(ret.summary.notIndexedByLoop); + ret.summary.notIndexedByLoop = a; + for (IR::Addr *m : a->outputAddrs(deps, depth)) { + ret *= searchLoopIndependentUsers(deps, L, m, depth, summary); if (ret.independent) continue; - I->setDependsOnParentLoop(); + a->setDependsOnParentLoop(); return ret; } - // then we can push it to the front of the list, meaning it is hoisted out - if (a) { - if (ret.summary.notIndexedByLoop == a) - ret.summary.notIndexedByLoop = - llvm::cast_or_null(a->getNext()); - } - I->removeFromList(); - I->insertAfter(ret.summary.afterExit); - ret.summary.afterExit = I; - I->visit(depth); + } + // if it isn't a Loop, must be an `Instruction` + IR::Value *I = llvm::cast(N); + for (IR::Node *U : I->getUsers()) { + ret *= searchLoopIndependentUsers(deps, L, U, depth, summary); + if (ret.independent) continue; + I->setDependsOnParentLoop(); return ret; } - // NOLINTNEXTLINE(misc-no-recursion) - inline auto visitLoopDependent(IR::Dependencies deps, IR::Loop * L, - IR::Node * N, uint8_t depth, IR::Node * body) - ->IR::Node * { - invariant(N->getVisitDepth() != 254); - // N may have been visited as a dependent of an inner loop, which is why - // `visited` accepts a depth argument - if (N->wasVisited(depth) || !(L->contains(N))) return body; + // then we can push it to the front of the list, meaning it is hoisted out + if (a) { + if (ret.summary.notIndexedByLoop == a) + ret.summary.notIndexedByLoop = llvm::cast_or_null(a->getNext()); + } + I->removeFromList(); + I->insertAfter(ret.summary.afterExit); + ret.summary.afterExit = I; + I->visit(depth); + return ret; +} +// NOLINTNEXTLINE(misc-no-recursion) +inline auto visitLoopDependent(IR::Dependencies deps, IR::Loop *L, IR::Node *N, + uint8_t depth, IR::Node *body) -> IR::Node * { + invariant(N->getVisitDepth() != 254); + // N may have been visited as a dependent of an inner loop, which is why + // `visited` accepts a depth argument + if (N->wasVisited(depth) || !(L->contains(N))) return body; #ifndef NDEBUG - // Our goal here is to check for cycles in debug mode. - // Each level of our graph is acyclic, meaning that there are no cycles at - // that level when traversing only edges active at that given level. - // However, when considering edges active at level `I`, we may have cycles - // at level `J` if `J>I`. In otherwords, here we are travering all edges - // active at `I=depth`. Within subloops, which necessarilly have depth - // `J>I`, we may have cycles. - // - // Thus, we need to prevent getting stuck in a cycle for these deeper loops - // by setting `N->visit(depth)` here, so `wasVisited` will allow them to - // immediately return. But, in debug mode, we'll set nodes of the same depth - // to `254` to check for cycles. - if (N->getLoop() == L) N->visit(254); - else N->visit(depth); + // Our goal here is to check for cycles in debug mode. + // Each level of our graph is acyclic, meaning that there are no cycles at + // that level when traversing only edges active at that given level. + // However, when considering edges active at level `I`, we may have cycles + // at level `J` if `J>I`. In otherwords, here we are travering all edges + // active at `I=depth`. Within subloops, which necessarilly have depth + // `J>I`, we may have cycles. + // + // Thus, we need to prevent getting stuck in a cycle for these deeper loops + // by setting `N->visit(depth)` here, so `wasVisited` will allow them to + // immediately return. But, in debug mode, we'll set nodes of the same depth + // to `254` to check for cycles. + if (N->getLoop() == L) N->visit(254); + else N->visit(depth); #else - N->visit(depth); + N->visit(depth); #endif - // iterate over users - if (auto *A = llvm::dyn_cast(N)) { - for (IR::Addr *m : A->outputAddrs(deps, depth)) { - if (m->wasVisited(depth)) continue; - body = visitLoopDependent(deps, L, m, depth, body); - } + // iterate over users + if (auto *A = llvm::dyn_cast(N)) { + for (IR::Addr *m : A->outputAddrs(deps, depth)) { + if (m->wasVisited(depth)) continue; + body = visitLoopDependent(deps, L, m, depth, body); } - if (auto *I = llvm::dyn_cast(N)) { - for (IR::Node *U : I->getUsers()) { - if (U->wasVisited(depth)) continue; - body = visitLoopDependent(deps, L, U, depth, body); - } - } else if (auto *S = llvm::dyn_cast(N)) { - for (IR::Node *U : S->getChild()->nodes()) { - if (U->wasVisited(depth)) continue; - body = visitLoopDependent(deps, L, U, depth, body); - } + } + if (auto *I = llvm::dyn_cast(N)) { + for (IR::Node *U : I->getUsers()) { + if (U->wasVisited(depth)) continue; + body = visitLoopDependent(deps, L, U, depth, body); + } + } else if (auto *S = llvm::dyn_cast(N)) { + for (IR::Node *U : S->getChild()->nodes()) { + if (U->wasVisited(depth)) continue; + body = visitLoopDependent(deps, L, U, depth, body); } + } #ifndef NDEBUG - if (N->getLoop() == L) N->visit(depth); + if (N->getLoop() == L) N->visit(depth); #endif - if (N->getLoop() == L) body = N->setNext(body); - return body; - } - inline auto topologicalSort(IR::Dependencies deps, IR::Loop * root, - unsigned depth) - ->IR::Node * { - // basic plan for the top sort: - // We iterate across all users, once all of node's users have been added, - // we push it to the front of the list. Thus, we get a top-sorted list. - // We're careful about the order, so that this top sort should LICM all the - // addresses that it can. - // - // We must push the exit before the root (as the exit depends on the loop, - // and we iterate users). The exit doesn't use any in this block, so we - // begin by trying to push any instructions that don't depend on the loop. - // If we fail to push them (i.e., because they have uses that do depend on - // the loop), then they get added to a revisit queue. Any instructions we - // are able to push-front before we push the exit, implicitly happen after - // the exit, i.e. they have been LICMed into the exit block. We unvisit the - // revisit-queue, and add them back to the main worklist. Then, we proceed - // with a depth-first topological sort normally (iterating over uses, - // pushing to the front), starting with the loop root, so that it gets - // pushed to the front as soon as possible. That is, so that it happens as - // late as possible Any instructions that get pushed to the front afterwards - // have been LICMed into the loop pre-header. - // - // In this first pass, we iterate over all nodes, pushing those - // that can be hoisted after the exit block. - IR::Node *C = root->getChild(); - LoopDepSummary summary; - for (IR::Node *N : C->nodes()) - summary = - searchLoopIndependentUsers(deps, root, N, depth, summary).summary; - // summary.afterExit will be hoisted out; every member has been marked as - // `visited` So, now we search all of root's users, i.e. every addr that - // depends on it - IR::Node *body; - for (IR::Node *N : summary.indexedByLoop->nodes()) - body = visitLoopDependent(deps, root, N, depth, body); - body = root->setNext(body); // now we can place the loop - for (IR::Node *N : summary.notIndexedByLoop->nodes()) - body = visitLoopDependent(deps, root, N, depth, body); - // and any remaining edges - return body; - } - // NOLINTNEXTLINE(misc-no-recursion) - inline auto buildGraph(IR::Dependencies deps, IR::Loop * root, unsigned depth) - ->IR::Node * { - // We build the instruction graph, via traversing the tree, and then - // top sorting as we recurse out - for (IR::Loop *child : root->subLoops()) buildGraph(deps, child, depth + 1); + if (N->getLoop() == L) body = N->setNext(body); + return body; +} +inline void addBody(IR::Dependencies deps, IR::Loop *root, unsigned depth, + IR::Node *nodes) { + IR::Exit exit{}; // use to capture last node + IR::Node *body{&exit}; + for (IR::Node *N : nodes->nodes()) + body = visitLoopDependent(deps, root, N, depth, body); + body = root->setChild(body); // now we can place the loop + IR::Node *last = exit.getPrev(); + if (last) last->setNext(nullptr); + root->setLast(last); +} +inline auto topologicalSort(IR::Dependencies deps, IR::Loop *root, + unsigned depth) -> IR::Node * { + // basic plan for the top sort: + // We iterate across all users, once all of node's users have been added, + // we push it to the front of the list. Thus, we get a top-sorted list. + // We're careful about the order, so that this top sort should LICM all the + // addresses that it can. + // + // We must push the exit before the root (as the exit depends on the loop, + // and we iterate users). The exit doesn't use any in this block, so we + // begin by trying to push any instructions that don't depend on the loop. + // If we fail to push them (i.e., because they have uses that do depend on + // the loop), then they get added to a revisit queue. Any instructions we + // are able to push-front before we push the exit, implicitly happen after + // the exit, i.e. they have been LICMed into the exit block. We unvisit the + // revisit-queue, and add them back to the main worklist. Then, we proceed + // with a depth-first topological sort normally (iterating over uses, + // pushing to the front), starting with the loop root, so that it gets + // pushed to the front as soon as possible. That is, so that it happens as + // late as possible Any instructions that get pushed to the front afterwards + // have been LICMed into the loop pre-header. + // + // In this first pass, we iterate over all nodes, pushing those + // that can be hoisted after the exit block. + IR::Node *C = root->getChild(); + LoopDepSummary summary{}; + for (IR::Node *N : C->nodes()) + summary = searchLoopIndependentUsers(deps, root, N, depth, summary).summary; + // summary.afterExit will be hoisted out; every member has been marked as + // `visited` So, now we search all of root's users, i.e. every addr that + // depends on it + root->setNext(summary.afterExit); + addBody(deps, root, depth, summary.indexedByLoop); + IR::Node *body{root}; + for (IR::Node *N : summary.notIndexedByLoop->nodes()) + body = visitLoopDependent(deps, root, N, depth, body); + // and any remaining edges + return body; +} +// NOLINTNEXTLINE(misc-no-recursion) +inline auto buildSubGraph(IR::Dependencies deps, IR::Loop *root, unsigned depth) + -> IR::Node * { + // We build the instruction graph, via traversing the tree, and then + // top sorting as we recurse out + for (IR::Loop *child : root->subLoops()) + buildSubGraph(deps, child, depth + 1); - return topologicalSort(deps, root, depth); - } + // The very outer `root` needs to have all instr constituents + // we also need to add the last instruction of each loop as `last` + return topologicalSort(deps, root, depth); +} +inline auto buildGraph(IR::Dependencies deps, IR::Loop *root) -> IR::Node * { + // We build the instruction graph, via traversing the tree, and then + // top sorting as we recurse out + for (IR::Loop *child : root->subLoops()) buildSubGraph(deps, child, 1); - inline auto addAddrToGraph(Arena<> * salloc, Arena<> * lalloc, - lp::ScheduledNode * nodes) - ->IR::Loop * { - auto s = salloc->scope(); - LoopTree *root = LoopTree::root(salloc, lalloc); - for (lp::ScheduledNode *node : nodes->getAllVertices()) - root->addNode(salloc, lalloc, node); - return root->getLoop(); - } + // The very outer `root` needs to have all instr constituents + // we also need to add the last instruction of each loop as `last` + addBody(deps, root, 0, root->getChild()); + return root; +} - class IROptimizer { - IR::Dependencies deps; - IR::Node *nodes; - MutPtrVector loopDeps; - Arena<> *lalloc; - Arena<> *salloc; +inline auto addAddrToGraph(Arena<> *salloc, Arena<> *lalloc, + lp::ScheduledNode *nodes) -> IR::Loop * { + auto s = salloc->scope(); + // `root` is top level loop + LoopTree *root = LoopTree::root(salloc, lalloc); + for (lp::ScheduledNode *node : nodes->getAllVertices()) + root->addNode(salloc, lalloc, node); + return root->getLoop(); +} - static auto loopDepSats(Arena<> *alloc, IR::Dependencies deps, - lp::LoopBlock::OptimizationResult res) - -> MutPtrVector { - IR::MutPtrVector loopDeps{ - math::vector(alloc, unsigned(deps.size()))}; - // place deps at sat level for loops - for (IR::Addr *a : res.addr.getAddr()) { - IR::Loop *L = a->getLoop(); - for (int32_t id : a->inputEdgeIDs(deps)) { - uint8_t lvl = deps.satLevel(IR::Dependence::ID{id}); - L->getLoopAtDepth(lvl)->addEdge(loopDeps, id); - } - } - return loopDeps; - } +class IROptimizer { + IR::Dependencies deps; + IR::Node *nodes; + MutPtrVector loopDeps; + Arena<> *lalloc; + Arena<> *salloc; - // plan: SCC? Iterate over nodes in program order? - // then we can iterate in order. - // What to do about depth? - // We may have - // for (i : I){ - // for (j : J){ - // A[j] = x; // store - // y = A[j]; // load - // } - // } - // In this case, we do have a cycle: - // A[j]^s_i -> A[j]^l_i - // A[j]^l_i -> A[j]^s_{i+1} - // However, this cycle does not prohibit deleting the load, - // replacing it with `y = x`. - // This still holds true if the load were a second store: - // for (i : I){ - // for (j : J){ - // A[j] = x; // store - // A[j] = y; // load - // } - // } - // We could stick with the single `y` store. - // Thus, for eliminating memory operations at a depth of 2, - // we are only concerned with dependencies still valid at a depth of 2. - // for (int i = 0 : i < I; ++i){ - // x[i] /= U[i,i]; - // for (int j = i+1; j < I; ++j){ - // x[j] -= x[i]*U[i,j]; - // } - // } - // Maybe just do the dumb thing? - // Walk the graph for addr costs, and at the same time, - // check the addr for eliminability, checking against what we've stored thus - // far. - // We currently do not store load-load edges, which is why only checking - // edge relationships is not ideal. - // We may store load-load edges in the future, as these could be used as - // part of the cost function of the linear program, i.e. we'd want to - // minimize the distance between loads (but allow reordering them). - // - // I think a reasonable approach is: - // Have a map from array pointer to Addr. Addrs form a chain. - // as we walk the graph, add each newly encountered addr to the front of the - // chain and check if we can eliminate it, or any of its predecessors. - // - // Note (bracketed means we might be able to eliminate): - // Read->[Read] could eliminate read - // Read->Write no change - // Write->[Read] can forward written value - // [Write]->Write can eliminate first write - // Thus, we can fuse this pass with our address cost calculation. - // We check if we can eliminate before calculating the new cost. - // The only case where we may remove an old value, write->write, - // we could just take the old cost and assign it to the new write. - // TODO: if we have only writes to a non-escaping array, we should - // be able to eliminate these writes too, and then also potentially - // remove that array temporary (e.g., if it were malloc'd). - // E.g. check if the array is a `llvm::isNonEscapingLocalObject` and - // allocated by `llvm::isRemovableAlloc`. - void removeRedundantAddr() { - for (IR::Addr *a : addr->eachAddr()) { - for (poly::Dependence d : a->outputEdges(deps)) { - IR::Addr *b = d.output(); - eliminateAddr(a, b); - } + static auto loopDepSats(Arena<> *alloc, IR::Dependencies deps, + lp::LoopBlock::OptimizationResult res) + -> MutPtrVector { + IR::MutPtrVector loopDeps{ + math::vector(alloc, unsigned(deps.size()))}; + // place deps at sat level for loops + for (IR::Addr *a : res.addr.getAddr()) { + IR::Loop *L = a->getLoop(); + for (int32_t id : a->inputEdgeIDs(deps)) { + uint8_t lvl = deps.satLevel(IR::Dependence::ID{id}); + L->getLoopAtDepth(lvl)->addEdge(loopDeps, id); } } - // The plan here is to index all arrays by relative position, and then - // sort outputEdges based on first->last, so that we can try to eliminate in - // order. We break on first failure to eliminate. - // a is the input, b the output - void eliminateAddr(IR::Addr *a, IR::Addr *b) { - if (a->indexMatrix() != b->indexMatrix()) return; - /// are there any addr between them? - if (a->isStore()) { - if (b->isStore()) { // Write->Write - // Are there reads in between? If so, we must keep-- - // --unless we're storing the same value twice (???) - // without other intervening store-edges. - // Without reads in between, it's safe. - } else { // Write->Read - // Can we replace the read with using the written value? - if (a->getAffineLoop() != b->getAffineLoop()) return; - } - } else if (b->isLoad()) { // Read->Read - // If they don't have the same parent, either... - // They're in different branches of loops, and load can't live - // in between them - // for (i : I){ - // for (j : J){ - // A[i,j]; - // } - // for (j : J){ - // A[i,j]; - // } - // } - // or it is a subloop, but dependencies prevented us from hoisting. - if (a->getAffineLoop() != b->getAffineLoop()) return; - // Any writes in between them? - } // else Read->Write, can't delete either - } - - public: - IROptimizer(IR::Dependencies deps, IR::Node *nodes, Arena<> *lalloc, - Arena<> *salloc) - : deps{deps}, nodes{nodes}, - loopDeps{loopDepSats(alloc, deps, nodes->getOptimizationResult())}, - lalloc{lalloc}, salloc{salloc} { - removeRedundantAddr(); - } - }; + return loopDeps; + } - // - // Considering reordering legality, example - // for (int i = 0: i < I; ++i){ - // for (int j = 0 : j < i; ++j){ - // x[i] -= x[j]*U[j,i]; + // plan: SCC? Iterate over nodes in program order? + // then we can iterate in order. + // What to do about depth? + // We may have + // for (i : I){ + // for (j : J){ + // A[j] = x; // store + // y = A[j]; // load // } - // x[i] /= U[i,i]; // } - // We have an edge from the store `x[i] = x[i] / U[i,i]=` to the load of - // `x[j]`, when `j = ` the current `i`, on some future iteration. - // We want to unroll; - // for (int i = 0: i < I-3; i += 4){ - // for (int j = 0 : j < i; ++j){ - // x[i] -= x[j]*U[j,i]; - // x[i+1] -= x[j]*U[j,i+1]; - // x[i+2] -= x[j]*U[j,i+2]; - // x[i+3] -= x[j]*U[j,i+3]; - // } - // x[i] /= U[i,i]; // store 0 - // { // perform unrolled j = i iter - // int j = i; // these all depend on store 0 - // x[i+1] -= x[j]*U[j,i+1]; - // x[i+2] -= x[j]*U[j,i+2]; - // x[i+3] -= x[j]*U[j,i+3]; - // } - // x[i+1] /= U[i+1,i+1]; // store 1 - // { // perform unrolled j = i + 1 iter - // int j = i+1; // these all depend on store 1 - // x[i+2] -= x[j]*U[j,i+2]; - // x[i+3] -= x[j]*U[j,i+3]; + // In this case, we do have a cycle: + // A[j]^s_i -> A[j]^l_i + // A[j]^l_i -> A[j]^s_{i+1} + // However, this cycle does not prohibit deleting the load, + // replacing it with `y = x`. + // This still holds true if the load were a second store: + // for (i : I){ + // for (j : J){ + // A[j] = x; // store + // A[j] = y; // load // } - // x[i+2] /= U[i+2,i+2]; // store 2 - // { // perform unrolled j = i + 2 iter - // int j = i+2; // this depends on store 2 - // x[i+3] -= x[j]*U[j,i+3]; + // } + // We could stick with the single `y` store. + // Thus, for eliminating memory operations at a depth of 2, + // we are only concerned with dependencies still valid at a depth of 2. + // for (int i = 0 : i < I; ++i){ + // x[i] /= U[i,i]; + // for (int j = i+1; j < I; ++j){ + // x[j] -= x[i]*U[i,j]; // } - // x[i+3] /= U[i+3,i+3]; // } - // The key to legality here is that we peel off the dependence polyhedra - // from the loop's iteration space. - // We can then perform the dependent iterations in order. - // With masking, the above code can be vectorized in this manner. - // The basic approach is that we have the dependence polyhedra: - // - // 0 <= i_s < I - // 0 <= i_l < I - // 0 <= j_l < i_l - // i_s = j_l // dependence, yields same address in `x` - // - // Note that our schedule sets - // i_s = i_l - // Which gives: - // i_l = i_s = j_l < i_l - // a contradiction, meaning that the dependency is - // conditionally (on our schedule) independent. - // Excluding the `i_s = i_l` constraint from the - // polyhedra gives us the region of overlap. - // - // When unrolling by `U`, we get using `U=4` as an example: - // i^0_s + 1 = i^1_s - // i^0_s + 2 = i^2_s - // i^0_s + 3 = i^3_s - // 0 <= i^0_s < I - // 0 <= i^1_s < I - // 0 <= i^2_s < I - // 0 <= i^3_s < I - // 0 <= i^0_l < I - // 0 <= i^1_l < I - // 0 <= i^2_l < I - // 0 <= i^3_l < I - // 0 <= j_l < i^0_l - // 0 <= j_l < i^1_l - // 0 <= j_l < i^2_l - // 0 <= j_l < i^3_l - // i^0_s = j_l || i^1_s = j_l || i^2_s = j_l || i^3_s = j_l - // where the final union can be replaced with - // i^0_s = j_l || i^0_s+1 = j_l || i^0_s+2 = j_l || i^0_s+3 = j_l - // i^0_s <= j_1 <= i^0_s+3 + // Maybe just do the dumb thing? + // Walk the graph for addr costs, and at the same time, + // check the addr for eliminability, checking against what we've stored thus + // far. + // We currently do not store load-load edges, which is why only checking + // edge relationships is not ideal. + // We may store load-load edges in the future, as these could be used as + // part of the cost function of the linear program, i.e. we'd want to + // minimize the distance between loads (but allow reordering them). // - // Similarly, we can compress the other inequalities... - // 0 <= i^0_s < I - 3 - // 0 <= i^0_l < I - 3 - // 0 <= j_l < i^0_l - // i^0_s <= j_1 <= i^0_s+3 // dependence region + // I think a reasonable approach is: + // Have a map from array pointer to Addr. Addrs form a chain. + // as we walk the graph, add each newly encountered addr to the front of the + // chain and check if we can eliminate it, or any of its predecessors. // - // So, the parallel region is the union - // i^0_s > j_1 || j_1 > i^0_s+3 - // - // In this example, note that the region `j_1 > i^0_s+3` is empty - // so we have one parallel region, and then one serial region. - // - /// - /// Optimize the schedule - inline void optimize(IR::Dependencies deps, IR::Cache & instr, - Arena<> * lalloc, - lp::LoopBlock::OptimizationResult res) { - /// we must build the IR::Loop - /// Initially, to help, we use a nested vector, so that we can index into it - /// using the fusion omegas. We allocate it with the longer lived `instr` - /// alloc, so we can checkpoint it here, and use alloc for other IR nodes. - Arena<> *salloc = instr.getAllocator(); - IR::Node *N = - buildGraph(deps, addAddrToGraph(salloc, lalloc, res.nodes), 0); - // `N` is the head of the topologically sorted graph - // We now try to remove redundant memory operations - - IROptimizer(deps, N, lalloc, salloc); - } - - /* - // NOLINTNEXTLINE(misc-no-recursion) - inline auto printSubDotFile(Arena<> *alloc, llvm::raw_ostream &out, - map &names, - llvm::SmallVectorImpl &addrNames, - unsigned addrIndOffset, poly::Loop *lret) - -> poly::Loop * { - poly::Loop *loop{nullptr}; - size_t j = 0; - for (auto *addr : header.getAddr()) loop = addr->getAffLoop(); - for (auto &subTree : subTrees) { - // `names` might realloc, relocating `names[this]` - if (getDepth()) - names[subTree.subTree] = names[this] + "SubLoop#" + std::to_string(j++); - else names[subTree.subTree] = "LoopNest#" + std::to_string(j++); - if (loop == nullptr) - for (auto *addr : subTree.exit.getAddr()) loop = addr->getAffLoop(); - loop = subTree.subTree->printSubDotFile(alloc, out, names, addrNames, - addrIndOffset, loop); - } - const std::string &name = names[this]; - out << "\"" << name - << "\" [shape=plain\nlabel = <\n"; - size_t i = header.printDotNodes(out, 0, addrNames, addrIndOffset, name); - j = 0; - std::string loopEdges; - for (auto &subTree : subTrees) { - std::string label = "f" + std::to_string(++i); - out << " \n"; - loopEdges += "\"" + name + "\":f" + std::to_string(i) + " -> \"" + - names[subTree.subTree] + "\":f0 [color=\"#ff0000\"];\n"; - i = subTree.exit.printDotNodes(out, i, addrNames, addrIndOffset, name); + // Note (bracketed means we might be able to eliminate): + // Read->[Read] could eliminate read + // Read->Write no change + // Write->[Read] can forward written value + // [Write]->Write can eliminate first write + // Thus, we can fuse this pass with our address cost calculation. + // We check if we can eliminate before calculating the new cost. + // The only case where we may remove an old value, write->write, + // we could just take the old cost and assign it to the new write. + // TODO: if we have only writes to a non-escaping array, we should + // be able to eliminate these writes too, and then also potentially + // remove that array temporary (e.g., if it were malloc'd). + // E.g. check if the array is a `llvm::isNonEscapingLocalObject` and + // allocated by `llvm::isRemovableAlloc`. + void removeRedundantAddr(IR::AddrChain addr) { + for (IR::Addr *a : addr.getAddr()) { + for (poly::Dependence d : a->outputEdges(deps)) { + IR::Addr *b = d.output(); + eliminateAddr(a, b); + } + } } - out << "
"; - // assert(depth == 0 || (loop != nullptr)); - if (loop && (getDepth() > 0)) { - for (size_t i = loop->getNumLoops(), k = getDepth(); i > k;) - loop = loop->removeLoop(alloc, --i); - loop->pruneBounds(alloc); - loop->printBounds(out); - } else out << "Top Level"; - out << "
SubLoop#" << j++ - << "
>];\n" << loopEdges; - if (lret) return lret; - if ((loop == nullptr) || (getDepth() <= 1)) return nullptr; - return loop->removeLoop(alloc, getDepth() - 1); + // The plan here is to index all arrays by relative position, and then + // sort outputEdges based on first->last, so that we can try to eliminate in + // order. We break on first failure to eliminate. + // a is the input, b the output + void eliminateAddr(IR::Addr *a, IR::Addr *b) { + if (a->indexMatrix() != b->indexMatrix()) return; + /// are there any addr between them? + if (a->isStore()) { + if (b->isStore()) { // Write->Write + // Are there reads in between? If so, we must keep-- + // --unless we're storing the same value twice (???) + // without other intervening store-edges. + // Without reads in between, it's safe. + } else { // Write->Read + // Can we replace the read with using the written value? + if (a->getLoop() != b->getLoop()) return; + } + } else if (b->isLoad()) { // Read->Read + // If they don't have the same parent, either... + // They're in different branches of loops, and load can't live + // in between them + // for (i : I){ + // for (j : J){ + // A[i,j]; + // } + // for (j : J){ + // A[i,j]; + // } + // } + // or it is a subloop, but dependencies prevented us from hoisting. + if (a->getAffineLoop() != b->getAffineLoop()) return; + // Any writes in between them? + } // else Read->Write, can't delete either } + // the approach to sorting edges is to iterate through nodes backwards + void sortEdges() {} - inline void printDotFile(Arena<> *alloc, llvm::raw_ostream &out) { - map names; - llvm::SmallVector addrNames(numAddr_); - names[this] = "toplevel"; - out << "digraph LoopNest {\n"; - auto p = alloc.scope(); - printSubDotFile(alloc, out, names, addrNames, subTrees.size(), nullptr); - printDotEdges(out, addrNames); - out << "}\n"; +public: + IROptimizer(IR::Dependencies deps, IR::Node *nodes, Arena<> *lalloc, + Arena<> *salloc, lp::LoopBlock::OptimizationResult res) + : deps{deps}, nodes{nodes}, loopDeps{loopDepSats(lalloc, deps, res)}, + lalloc{lalloc}, salloc{salloc} { + removeRedundantAddr(res.addr); } - */ - // class LoopForestSchedule : LoopTreeSchedule { - // [[no_unique_address]] Arena<> *allocator; - // }; +}; + +// +// Considering reordering legality, example +// for (int i = 0: i < I; ++i){ +// for (int j = 0 : j < i; ++j){ +// x[i] -= x[j]*U[j,i]; +// } +// x[i] /= U[i,i]; +// } +// We have an edge from the store `x[i] = x[i] / U[i,i]=` to the load of +// `x[j]`, when `j = ` the current `i`, on some future iteration. +// We want to unroll; +// for (int i = 0: i < I-3; i += 4){ +// for (int j = 0 : j < i; ++j){ +// x[i] -= x[j]*U[j,i]; +// x[i+1] -= x[j]*U[j,i+1]; +// x[i+2] -= x[j]*U[j,i+2]; +// x[i+3] -= x[j]*U[j,i+3]; +// } +// x[i] /= U[i,i]; // store 0 +// { // perform unrolled j = i iter +// int j = i; // these all depend on store 0 +// x[i+1] -= x[j]*U[j,i+1]; +// x[i+2] -= x[j]*U[j,i+2]; +// x[i+3] -= x[j]*U[j,i+3]; +// } +// x[i+1] /= U[i+1,i+1]; // store 1 +// { // perform unrolled j = i + 1 iter +// int j = i+1; // these all depend on store 1 +// x[i+2] -= x[j]*U[j,i+2]; +// x[i+3] -= x[j]*U[j,i+3]; +// } +// x[i+2] /= U[i+2,i+2]; // store 2 +// { // perform unrolled j = i + 2 iter +// int j = i+2; // this depends on store 2 +// x[i+3] -= x[j]*U[j,i+3]; +// } +// x[i+3] /= U[i+3,i+3]; +// } +// The key to legality here is that we peel off the dependence polyhedra +// from the loop's iteration space. +// We can then perform the dependent iterations in order. +// With masking, the above code can be vectorized in this manner. +// The basic approach is that we have the dependence polyhedra: +// +// 0 <= i_s < I +// 0 <= i_l < I +// 0 <= j_l < i_l +// i_s = j_l // dependence, yields same address in `x` +// +// Note that our schedule sets +// i_s = i_l +// Which gives: +// i_l = i_s = j_l < i_l +// a contradiction, meaning that the dependency is +// conditionally (on our schedule) independent. +// Excluding the `i_s = i_l` constraint from the +// polyhedra gives us the region of overlap. +// +// When unrolling by `U`, we get using `U=4` as an example: +// i^0_s + 1 = i^1_s +// i^0_s + 2 = i^2_s +// i^0_s + 3 = i^3_s +// 0 <= i^0_s < I +// 0 <= i^1_s < I +// 0 <= i^2_s < I +// 0 <= i^3_s < I +// 0 <= i^0_l < I +// 0 <= i^1_l < I +// 0 <= i^2_l < I +// 0 <= i^3_l < I +// 0 <= j_l < i^0_l +// 0 <= j_l < i^1_l +// 0 <= j_l < i^2_l +// 0 <= j_l < i^3_l +// i^0_s = j_l || i^1_s = j_l || i^2_s = j_l || i^3_s = j_l +// where the final union can be replaced with +// i^0_s = j_l || i^0_s+1 = j_l || i^0_s+2 = j_l || i^0_s+3 = j_l +// i^0_s <= j_1 <= i^0_s+3 +// +// Similarly, we can compress the other inequalities... +// 0 <= i^0_s < I - 3 +// 0 <= i^0_l < I - 3 +// 0 <= j_l < i^0_l +// i^0_s <= j_1 <= i^0_s+3 // dependence region +// +// So, the parallel region is the union +// i^0_s > j_1 || j_1 > i^0_s+3 +// +// In this example, note that the region `j_1 > i^0_s+3` is empty +// so we have one parallel region, and then one serial region. +// +/// +/// Optimize the schedule +inline void optimize(IR::Dependencies deps, IR::Cache &instr, Arena<> *lalloc, + lp::LoopBlock::OptimizationResult res) { + // we must build the IR::Loop + // Initially, to help, we use a nested vector, so that we can index into it + // using the fusion omegas. We allocate it with the longer lived `instr` + // alloc, so we can checkpoint it here, and use alloc for other IR nodes. + // The `instr` allocator is more generally the longer lived allocator, + // as it allocates the actual nodes. + Arena<> *salloc = instr.getAllocator(); + IR::Loop *root = addAddrToGraph(salloc, lalloc, res.nodes); + buildGraph(deps, root); + // `N` is the head of the topologically sorted graph + // We now try to remove redundant memory operations + + IROptimizer(deps, root, lalloc, salloc, res); +} + +/* +// NOLINTNEXTLINE(misc-no-recursion) +inline auto printSubDotFile(Arena<> *alloc, llvm::raw_ostream &out, + map &names, + llvm::SmallVectorImpl &addrNames, + unsigned addrIndOffset, poly::Loop *lret) +-> poly::Loop * { +poly::Loop *loop{nullptr}; +size_t j = 0; +for (auto *addr : header.getAddr()) loop = addr->getAffLoop(); +for (auto &subTree : subTrees) { + // `names` might realloc, relocating `names[this]` + if (getDepth()) + names[subTree.subTree] = names[this] + "SubLoop#" + std::to_string(j++); + else names[subTree.subTree] = "LoopNest#" + std::to_string(j++); + if (loop == nullptr) + for (auto *addr : subTree.exit.getAddr()) loop = addr->getAffLoop(); + loop = subTree.subTree->printSubDotFile(alloc, out, names, addrNames, + addrIndOffset, loop); +} +const std::string &name = names[this]; +out << "\"" << name + << "\" [shape=plain\nlabel = <\n"; +size_t i = header.printDotNodes(out, 0, addrNames, addrIndOffset, name); +j = 0; +std::string loopEdges; +for (auto &subTree : subTrees) { + std::string label = "f" + std::to_string(++i); + out << " \n"; + loopEdges += "\"" + name + "\":f" + std::to_string(i) + " -> \"" + + names[subTree.subTree] + "\":f0 [color=\"#ff0000\"];\n"; + i = subTree.exit.printDotNodes(out, i, addrNames, addrIndOffset, name); +} +out << "
"; +// assert(depth == 0 || (loop != nullptr)); +if (loop && (getDepth() > 0)) { + for (size_t i = loop->getNumLoops(), k = getDepth(); i > k;) + loop = loop->removeLoop(alloc, --i); + loop->pruneBounds(alloc); + loop->printBounds(out); +} else out << "Top Level"; +out << "
SubLoop#" << j++ + << "
>];\n" << loopEdges; +if (lret) return lret; +if ((loop == nullptr) || (getDepth() <= 1)) return nullptr; +return loop->removeLoop(alloc, getDepth() - 1); +} + +inline void printDotFile(Arena<> *alloc, llvm::raw_ostream &out) { +map names; +llvm::SmallVector addrNames(numAddr_); +names[this] = "toplevel"; +out << "digraph LoopNest {\n"; +auto p = alloc.scope(); +printSubDotFile(alloc, out, names, addrNames, subTrees.size(), nullptr); +printDotEdges(out, addrNames); +out << "}\n"; +} +*/ +// class LoopForestSchedule : LoopTreeSchedule { +// [[no_unique_address]] Arena<> *allocator; +// }; } // namespace poly::CostModeling diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index aa4175413..4f493f2df 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -87,6 +87,7 @@ class Node { VK_Load, VK_Stow, // used for ordered comparisons; all `Addr` types <= Stow VK_Loop, + VK_Exit, VK_CVal, VK_Cint, VK_Bint, @@ -277,8 +278,13 @@ static_assert(sizeof(Node) == 4 * sizeof(Node *) + 8); /// exit is the associated exit block class Loop : public Node { poly::Loop *affineLoop{nullptr}; + Node *last{nullptr}; int32_t edgeId{-1}; + // while `child` points to the first contained instruction, + // `last` points to the last contained instruction, + // and can be used for backwards iteration over the graph. + public: constexpr Loop(unsigned d) : Node(VK_Loop, d) {} constexpr Loop(unsigned d, poly::Loop *AL) @@ -307,6 +313,8 @@ class Loop : public Node { return utils::ListRange{getSubLoop(), [](Loop *L) { return L->getNextLoop(); }}; } + [[nodiscard]] constexpr auto getLast() const -> Node * { return last; } + constexpr void setLast(Node *n) { last = n; } static constexpr auto create(Arena<> *alloc, poly::Loop *AL, size_t depth) -> Loop * { return alloc->create(depth, AL); @@ -356,6 +364,13 @@ class Loop : public Node { return static_cast(parent); } +struct Exit : Node { + Exit() : Node(VK_Exit) {} + static constexpr auto classof(const Node *v) -> bool { + return v->getKind() == VK_Exit; + } +}; + class Instruction; class Value : public Node { diff --git a/include/IR/Predicate.hpp b/include/IR/Predicate.hpp index 2c176e657..2702dcba7 100644 --- a/include/IR/Predicate.hpp +++ b/include/IR/Predicate.hpp @@ -1,5 +1,6 @@ #pragma once +#include "Containers/UnrolledList.hpp" #include "Dicts/BumpVector.hpp" #include #include @@ -153,7 +154,7 @@ struct Intersection { uint64_t mask = emptyMask(bitUnion); if (std::popcount(mask) == 1) { // a single b & !b case uint64_t remUnionMask = - ~(mask | (mask << 1)); // 0s `b`, meaning b can be either. + ~(mask | (mask << 1)); // 0s `b`, meaning b can be either. uint64_t w = remUnionMask & x; uint64_t z = remUnionMask & y; if (w == z) return {Intersection{w}}; @@ -281,7 +282,7 @@ struct Set { } else { allocated = true; intersectUnion.intersects = - alloc.create>(); + alloc->create>(); if (u.size() == 2) { intersectUnion.intersects->pushHasCapacity(u[0]); intersectUnion.intersects->pushHasCapacity(u[1]); From 5a49880b58d4e1518eae6d1ef1ddfd562a50114b Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Thu, 20 Jul 2023 01:25:20 -0400 Subject: [PATCH 004/112] Sort deps --- include/IR/CostModeling.hpp | 45 ++++++- include/Polyhedra/Dependence.hpp | 213 ++++++++++++++++++------------- 2 files changed, 159 insertions(+), 99 deletions(-) diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index 204851a0c..27810bd0a 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -33,7 +33,7 @@ #include namespace poly::CostModeling { - +using poly::Dependence; class CPURegisterFile { [[no_unique_address]] uint8_t maximumVectorWidth; [[no_unique_address]] uint8_t numVectorRegisters; @@ -415,7 +415,7 @@ inline auto addAddrToGraph(Arena<> *salloc, Arena<> *lalloc, class IROptimizer { IR::Dependencies deps; - IR::Node *nodes; + IR::Loop *root; MutPtrVector loopDeps; Arena<> *lalloc; Arena<> *salloc; @@ -498,7 +498,7 @@ class IROptimizer { // allocated by `llvm::isRemovableAlloc`. void removeRedundantAddr(IR::AddrChain addr) { for (IR::Addr *a : addr.getAddr()) { - for (poly::Dependence d : a->outputEdges(deps)) { + for (Dependence d : a->outputEdges(deps)) { IR::Addr *b = d.output(); eliminateAddr(a, b); } @@ -538,14 +538,45 @@ class IROptimizer { // Any writes in between them? } // else Read->Write, can't delete either } - // the approach to sorting edges is to iterate through nodes backwards - void sortEdges() {} + /// The approach to sorting edges is to iterate through nodes backwards + /// whenever we encounter an `Addr`, we push it to the front of each + /// output edge list to which it belongs. + /// We can consider also assigning each `Addr` an order by, + /// decrementing an integer each time we encounter one. + /// However, that isn't necessary for the elimination of redundant `Addr`s, + /// because if their `indexMatrix` are equal, we aren't going to have + /// a dependency `A -> B`, in which `B` appears before `A`, meaning that we do + /// not need to actually check the relative positioning of `A` and `B` when + /// considering eliminating one of the `Addr`s. + // NOLINTNEXTLINE(misc-no-recursion) + void sortEdges(IR::Loop *R) { + for (IR::Node *n = R->getLast(); n != R; n = n->getPrev()) { + if (auto *L = llvm::dyn_cast(n)) { + sortEdges(L); + continue; + } + auto *a = llvm::dyn_cast(n); + if (!a) continue; + // for each input edge, we push `a` to the front of the output list + for (int32_t id : a->inputEdgeIDs(deps)) { + if (deps.prevOut(Dependence::ID{id}) < 0) continue; + deps.removeOutEdge(id); + IR::Addr *b = deps.input(Dependence::ID{id}); + int32_t oldFirst = b->getEdgeOut(); + deps.prevOut(Dependence::ID{oldFirst}) = id; + deps.prevOut(Dependence::ID{id}) = -1; + deps.nextOut(Dependence::ID{id}) = oldFirst; + b->setEdgeOut(id); + } + } + } public: - IROptimizer(IR::Dependencies deps, IR::Node *nodes, Arena<> *lalloc, + IROptimizer(IR::Dependencies deps, IR::Loop *root_, Arena<> *lalloc, Arena<> *salloc, lp::LoopBlock::OptimizationResult res) - : deps{deps}, nodes{nodes}, loopDeps{loopDepSats(lalloc, deps, res)}, + : deps{deps}, root{root_}, loopDeps{loopDepSats(lalloc, deps, res)}, lalloc{lalloc}, salloc{salloc} { + sortEdges(root); removeRedundantAddr(res.addr); } }; diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 2e8e5ece3..8479a7f9a 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -1,5 +1,6 @@ #pragma once #include "IR/Address.hpp" +#include "Math/Simplex.hpp" #include "Polyhedra/DependencyPolyhedra.hpp" #include "Polyhedra/Loops.hpp" #include "Polyhedra/Schedule.hpp" @@ -569,16 +570,37 @@ class Dependencies { } private: - void addEdge(Arena<> *alloc, Dependence d) { - int32_t id = size(); - push_pack(alloc, d); - d.input()->setEdgeOut(id); - d.output()->setEdgeIn(id); + constexpr void set(ID i, Dependence d) { + auto out = d.output(); + auto in = d.input(); + output(i) = out; + nextOut(i) = out->getEdgeOut(); + if (out->getEdgeOut() >= 0) prevOut(ID{out->getEdgeOut()}) = i.id; + prevOut(i) = -1; + input(i) = in; + nextIn(i) = in->getEdgeIn(); + depSatBnd(i) = d.getSimplexPair(); + depPoly(i) = d.getDepPoly(); + satLevelPair(i) = d.satLvl; + isForward(i) = d.isForward(); + in->setEdgeOut(i.id); + out->setEdgeIn(i.id); + } + auto addEdge(Arena<> *alloc, Dependence d) -> void * { + void *ret = nullptr; + if (numData == getCapacity()) { + auto newCapacity = getCapacity() * 2; + auto *newData = alloc->allocate(memNeeded(newCapacity)); + std::memcpy(newData, data, memNeeded(numData)); + ret = std::exchange(data, newData); + } + set(ID{numData++}, d); + return ret; } static constexpr auto memNeeded(size_t N) -> size_t { constexpr size_t memPer = sizeof(int32_t) * 2 + sizeof(DepPoly *) + - sizeof(math::Simplex *) * 2 + sizeof(bool) + - sizeof(uint8_t); + sizeof(NotNull) * 2 + + sizeof(bool) + sizeof(uint8_t); return N * memPer; } @@ -820,32 +842,44 @@ class Dependencies { }; } - constexpr void set(ID i, Dependence d) { - auto out = d.output(); - auto in = d.input(); - output(i) = out; - nextOut(i) = out->getEdgeOut(); - input(i) = in; - nextIn(i) = in->getEdgeIn(); - depSatBnd(i) = d.getSimplexPair(); - depPoly(i) = d.getDepPoly(); - satLevelPair(i) = d.satLvl; - isForward(i) = d.isForward(); + [[nodiscard]] constexpr auto getCapacity() const noexcept -> int32_t { + return int32_t(std::bit_ceil(uint32_t(numData))); } - auto push_pack(Arena<> *alloc, Dependence d) -> void * { - void *ret = nullptr; - if (numData == getCapacity()) { - auto newCapacity = getCapacity() * 2; - auto *newData = alloc->allocate(memNeeded(newCapacity)); - std::memcpy(newData, data, memNeeded(numData)); - ret = std::exchange(data, newData); - } - set(ID{numData++}, d); - return ret; + // field order: + // AddrOut + // AddrIn + // nextOut + // prevOut + // nextIn + // dependenceSatisfaction + // dependenceBounding + // depPoly + // satLevel + // isForward + [[nodiscard]] static constexpr auto inAddrOffset() -> size_t { + return sizeof(IR::Addr *); } - [[nodiscard]] constexpr auto getCapacity() const noexcept -> int32_t { - return int32_t(std::bit_ceil(uint32_t(numData))); + [[nodiscard]] static constexpr auto nextEdgeOutOffset() -> size_t { + return inAddrOffset() + sizeof(IR::Addr *); + } + [[nodiscard]] static constexpr auto prevEdgeOutOffset() -> size_t { + return nextEdgeOutOffset() + sizeof(int32_t); + } + [[nodiscard]] static constexpr auto inEdgeOffset() -> size_t { + return prevEdgeOutOffset() + sizeof(int32_t); + } + [[nodiscard]] static constexpr auto depSatBndOffset() -> size_t { + return inEdgeOffset() + sizeof(int32_t); + } + [[nodiscard]] static constexpr auto depPolyOffset() -> size_t { + return depSatBndOffset() + sizeof(std::array, 2>); + } + [[nodiscard]] static constexpr auto satLevelsOffset() -> size_t { + return depPolyOffset() + sizeof(DepPoly *); + } + [[nodiscard]] static constexpr auto isForwardOffset() -> size_t { + return satLevelsOffset() + sizeof(std::array); } constexpr auto outAddrPtr() -> IR::Addr ** { @@ -857,64 +891,79 @@ class Dependencies { return static_cast(p); } constexpr auto inAddrPtr() -> IR::Addr ** { - void *p = data + sizeof(IR::Addr *) * getCapacity(); + void *p = data + inAddrOffset() * getCapacity(); return static_cast(p); } [[nodiscard]] constexpr auto inAddrPtr() const -> IR::Addr *const * { - const void *p = data + sizeof(IR::Addr *) * getCapacity(); + const void *p = data + inAddrOffset() * getCapacity(); return static_cast(p); } constexpr auto outEdgePtr() -> int32_t * { - unsigned cap = getCapacity(); - void *p = data + sizeof(IR::Addr *) * 2 * cap; + void *p = data + nextEdgeOutOffset() * getCapacity(); return static_cast(p); } [[nodiscard]] constexpr auto outEdgePtr() const -> const int32_t * { - unsigned cap = getCapacity(); - const void *p = data + sizeof(IR::Addr *) * 2 * cap; + const void *p = data + nextEdgeOutOffset() * getCapacity(); + return static_cast(p); + } + constexpr auto prevOutEdgePtr() -> int32_t * { + void *p = data + prevEdgeOutOffset() * getCapacity(); + return static_cast(p); + } + [[nodiscard]] constexpr auto prevOutEdgePtr() const -> const int32_t * { + const void *p = data + prevEdgeOutOffset() * getCapacity(); return static_cast(p); } constexpr auto inEdgePtr() -> int32_t * { - unsigned cap = getCapacity(); - void *p = data + (sizeof(IR::Addr *) * 2 + sizeof(int32_t)) * cap; + void *p = data + inEdgeOffset() * getCapacity(); return static_cast(p); } [[nodiscard]] constexpr auto inEdgePtr() const -> const int32_t * { - unsigned cap = getCapacity(); - const void *p = data + (sizeof(IR::Addr *) * 2 + sizeof(int32_t)) * cap; + const void *p = data + inEdgeOffset() * getCapacity(); return static_cast(p); } + constexpr auto depSatBndPtr() -> std::array, 2> * { + void *p = data + depSatBndOffset() * getCapacity(); + return static_cast, 2> *>(p); + } + [[nodiscard]] constexpr auto depSatBndPtr() const + -> const std::array, 2> * { + const void *p = data + depSatBndOffset() * getCapacity(); + return static_cast, 2> *>(p); + } + constexpr auto depPolyPtr() -> DepPoly ** { + void *p = data + depPolyOffset() * getCapacity(); + return static_cast(p); + } + [[nodiscard]] constexpr auto depPolyPtr() const -> DepPoly *const * { + const void *p = data + depPolyOffset() * getCapacity(); + return static_cast(p); + } constexpr auto satLevelsPtr() -> std::array * { - unsigned cap = getCapacity(); - void *p = - data + - ((sizeof(IR::Addr *) + sizeof(int32_t) + sizeof(math::Simplex *)) * 2 + - sizeof(DepPoly *)) * - cap; + void *p = data + satLevelsOffset() * getCapacity(); return static_cast *>(p); } [[nodiscard]] constexpr auto satLevelsPtr() const -> const std::array * { - unsigned cap = getCapacity(); - const void *p = - data + - ((sizeof(IR::Addr *) + sizeof(int32_t) + sizeof(math::Simplex *)) * 2 + - sizeof(DepPoly *)) * - cap; + const void *p = data + satLevelsOffset() * getCapacity(); return static_cast *>(p); } + constexpr auto isForwardPtr() -> bool * { + void *p = data + isForwardOffset() * getCapacity(); + return static_cast(p); + } + [[nodiscard]] constexpr auto isForwardPtr() const -> const bool * { + const void *p = data + isForwardOffset() * getCapacity(); + return static_cast(p); + } public: - // field order: - // AddrOut - // AddrIn - // nextOut - // nextIn - // dependenceSatisfaction - // dependenceBounding - // depPoly - // satLevel - // isForward + constexpr void removeOutEdge(int32_t id) { + int32_t prev = prevOut(poly::Dependence::ID{id}); + int32_t next = nextOut(poly::Dependence::ID{id}); + if (prev >= 0) nextOut(poly::Dependence::ID{prev}) = next; + if (next >= 0) prevOut(poly::Dependence::ID{next}) = prev; + } constexpr auto get(ID i) -> Dependence { return get(i, input(i), output(i)); } constexpr auto outAddrs() -> MutPtrVector { return {outAddrPtr(), numData}; @@ -950,30 +999,13 @@ class Dependencies { [[nodiscard]] constexpr auto input(ID i) const -> const IR::Addr * { return inAddrPtr()[i.id]; } - constexpr auto nextOut(ID i) -> int32_t & { - unsigned cap = getCapacity(); - void *p = data + sizeof(int32_t) * i.id + sizeof(IR::Addr *) * 2 * cap; - return *static_cast(p); - } - constexpr auto nextIn(ID i) -> int32_t & { - unsigned cap = getCapacity(); - void *p = data + sizeof(int32_t) * i.id + - (sizeof(IR::Addr *) * 2 + sizeof(int32_t)) * cap; - return *static_cast(p); - } + constexpr auto nextOut(ID i) -> int32_t & { return outEdgePtr()[i.id]; } + constexpr auto prevOut(ID i) -> int32_t & { return prevOutEdgePtr()[i.id]; } + constexpr auto nextIn(ID i) -> int32_t & { return inEdgePtr()[i.id]; } constexpr auto depSatBnd(ID i) -> std::array, 2> & { - unsigned cap = getCapacity(); - void *p = data + 2 * sizeof(math::Simplex *) * i.id + - (sizeof(IR::Addr *) + sizeof(int32_t)) * 2 * cap; - return *static_cast, 2> *>(p); - } - constexpr auto depPoly(ID i) -> DepPoly *& { - unsigned cap = getCapacity(); - void *p = data + sizeof(DepPoly *) * i.id + - (sizeof(IR::Addr *) + sizeof(int32_t) + sizeof(math::Simplex *)) * - 2 * cap; - return *static_cast(p); + return depSatBndPtr()[i.id]; } + constexpr auto depPoly(ID i) -> DepPoly *& { return depPolyPtr()[i.id]; } constexpr auto satLevelPair(ID i) -> std::array & { return satLevelsPtr()[i.id]; } @@ -988,14 +1020,11 @@ class Dependencies { return Dependence::satLevelMask(satLevelPair(i)[0]) <= depth; } - [[nodiscard]] constexpr auto isForward(ID i) const noexcept -> bool & { - unsigned cap = getCapacity(); - void *p = - data + sizeof(bool) * i.id + - ((sizeof(IR::Addr *) + sizeof(int32_t) + sizeof(math::Simplex *)) * 2 + - sizeof(std::array) + sizeof(DepPoly *)) * - cap; - return *static_cast(p); + [[nodiscard]] constexpr auto isForward(ID i) noexcept -> bool & { + return isForwardPtr()[i.id]; + } + [[nodiscard]] constexpr auto isForward(ID i) const noexcept -> bool { + return isForwardPtr()[i.id]; } class Ref { From 5997a4d88dbd9277e8a15aac814bf1f8ae2d79e1 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Thu, 20 Jul 2023 01:51:13 -0400 Subject: [PATCH 005/112] count addr top position --- include/IR/Address.hpp | 7 ++++++- include/IR/CostModeling.hpp | 17 +++++++---------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/include/IR/Address.hpp b/include/IR/Address.hpp index 89f35b75b..4fca7d5cb 100644 --- a/include/IR/Address.hpp +++ b/include/IR/Address.hpp @@ -86,7 +86,7 @@ class Addr : public Instruction { Value *predicate{nullptr}; Addr *origNext{nullptr}; uint16_t numDim{0}, numDynSym{0}; - uint32_t topologicalPosition; + int32_t topologicalPosition; #if !defined(__clang__) && defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wpedantic" @@ -130,6 +130,11 @@ class Addr : public Instruction { } public: + constexpr void setTopPosition(int32_t pos) { topologicalPosition = pos; } + [[nodiscard]] constexpr auto getTopPosition() const -> int32_t { + return topologicalPosition; + } + /// Constructor for 0 dimensional memory access /// public for use with `std::construct_at` /// Perhaps it should use a passkey? diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index 27810bd0a..99d4f4c6a 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -541,22 +541,19 @@ class IROptimizer { /// The approach to sorting edges is to iterate through nodes backwards /// whenever we encounter an `Addr`, we push it to the front of each /// output edge list to which it belongs. - /// We can consider also assigning each `Addr` an order by, - /// decrementing an integer each time we encounter one. - /// However, that isn't necessary for the elimination of redundant `Addr`s, - /// because if their `indexMatrix` are equal, we aren't going to have - /// a dependency `A -> B`, in which `B` appears before `A`, meaning that we do - /// not need to actually check the relative positioning of `A` and `B` when - /// considering eliminating one of the `Addr`s. + /// We also assigning each `Addr` an order by decrementing an integer each + /// time we encounter one. This is also necessary for Addr elimination, as we + /// want to find the first topologically greater Addr. // NOLINTNEXTLINE(misc-no-recursion) - void sortEdges(IR::Loop *R) { + auto sortEdges(IR::Loop *R, int32_t pos) -> int32_t { for (IR::Node *n = R->getLast(); n != R; n = n->getPrev()) { if (auto *L = llvm::dyn_cast(n)) { - sortEdges(L); + pos = sortEdges(L, pos); continue; } auto *a = llvm::dyn_cast(n); if (!a) continue; + a->setTopPosition(pos--); // for each input edge, we push `a` to the front of the output list for (int32_t id : a->inputEdgeIDs(deps)) { if (deps.prevOut(Dependence::ID{id}) < 0) continue; @@ -576,7 +573,7 @@ class IROptimizer { Arena<> *salloc, lp::LoopBlock::OptimizationResult res) : deps{deps}, root{root_}, loopDeps{loopDepSats(lalloc, deps, res)}, lalloc{lalloc}, salloc{salloc} { - sortEdges(root); + sortEdges(root, 0); removeRedundantAddr(res.addr); } }; From f35fcffacce73b25a80b5b0672feb7993d745e77 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Thu, 20 Jul 2023 02:11:14 -0400 Subject: [PATCH 006/112] Add example comment --- include/IR/CostModeling.hpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index 99d4f4c6a..d403dd3e7 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -498,6 +498,23 @@ class IROptimizer { // allocated by `llvm::isRemovableAlloc`. void removeRedundantAddr(IR::AddrChain addr) { for (IR::Addr *a : addr.getAddr()) { + // outputEdges are sorted topologically from first to last. + // Example: + // for (int i = 0 : i < I; ++i){ + // acc = x[i]; // Statement: 0 + // for (int j = 0; j < i; ++j){ + // acc -= x[j]*U[j,i]; // Statement: 1 + // } + // x[i] = acc; // Statement: 2 + // x[i] = x[i] / U[i,i]; // Statement: 3 + // } + // Here, we have a lot of redundant edges connecting the various `x[i]`s. + // We also have output edges between the `x[i]` and the `x[j]` load in + // statement 1. It is, however, satisfied at `x[i]`'s depth, and ignored. + // So, what would happen here: + // S0R->S2W, no change; break. + // S2W->S3R, replace read with stored value forwarding. + // S2W->S3W, remove S2W as it is shadowed by S3W. for (Dependence d : a->outputEdges(deps)) { IR::Addr *b = d.output(); eliminateAddr(a, b); @@ -566,6 +583,7 @@ class IROptimizer { b->setEdgeOut(id); } } + return pos; } public: From dc99393767eee3b164c7ed3f29bd7029b1b54c44 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Thu, 20 Jul 2023 11:42:10 -0400 Subject: [PATCH 007/112] Make `VForwardIterator` be safe with respect to removing current For use with `eliminateAddr`, so we can iterate over addresses in a chain and possibly remove them. --- include/IR/CostModeling.hpp | 19 +++++++++---- include/Polyhedra/Dependence.hpp | 49 ++++++++++++++++++++------------ include/Support/Iterators.hpp | 9 ++++-- 3 files changed, 52 insertions(+), 25 deletions(-) diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index d403dd3e7..6ce33f8f9 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -515,6 +515,10 @@ class IROptimizer { // S0R->S2W, no change; break. // S2W->S3R, replace read with stored value forwarding. // S2W->S3W, remove S2W as it is shadowed by S3W. + for (int32_t id : a->outputEdgeIDs(deps, a->getCurrentDepth())) { + IR::Addr *b = deps.output(Dependence::ID{id}); + if (!eliminateAddr(a, b)) break; + } for (Dependence d : a->outputEdges(deps)) { IR::Addr *b = d.output(); eliminateAddr(a, b); @@ -525,8 +529,9 @@ class IROptimizer { // sort outputEdges based on first->last, so that we can try to eliminate in // order. We break on first failure to eliminate. // a is the input, b the output - void eliminateAddr(IR::Addr *a, IR::Addr *b) { - if (a->indexMatrix() != b->indexMatrix()) return; + auto eliminateAddr(IR::Addr *a, IR::Addr *b) -> bool { + // TODO: check a's and b's loops have same extants! + if (a->indexMatrix() != b->indexMatrix()) return false; /// are there any addr between them? if (a->isStore()) { if (b->isStore()) { // Write->Write @@ -534,9 +539,12 @@ class IROptimizer { // --unless we're storing the same value twice (???) // without other intervening store-edges. // Without reads in between, it's safe. + return true; } else { // Write->Read // Can we replace the read with using the written value? - if (a->getLoop() != b->getLoop()) return; + if (a->getLoop() != b->getLoop()) return false; + // TODO: forward + return true; } } else if (b->isLoad()) { // Read->Read // If they don't have the same parent, either... @@ -551,9 +559,10 @@ class IROptimizer { // } // } // or it is a subloop, but dependencies prevented us from hoisting. - if (a->getAffineLoop() != b->getAffineLoop()) return; + if (a->getLoop() != b->getLoop()) return false; + return true; // Any writes in between them? - } // else Read->Write, can't delete either + } else return false; // Read->Write, can't delete either } /// The approach to sorting edges is to iterate through nodes backwards /// whenever we encounter an `Addr`, we push it to the front of each diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 8479a7f9a..d75bd30c4 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -835,7 +835,7 @@ class Dependencies { invariant(false); return false; } - constexpr auto get(ID i, IR::Addr *in, IR::Addr *out) -> Dependence { + constexpr auto get(ID i, IR::Addr *in, IR::Addr *out) const -> Dependence { return Dependence{depPoly(i), depSatBnd(i), in, out, satLevelPair(i), isForward(i) @@ -964,7 +964,9 @@ class Dependencies { if (prev >= 0) nextOut(poly::Dependence::ID{prev}) = next; if (next >= 0) prevOut(poly::Dependence::ID{next}) = prev; } - constexpr auto get(ID i) -> Dependence { return get(i, input(i), output(i)); } + [[nodiscard]] constexpr auto get(ID i) const -> Dependence { + return get(i, input(i), output(i)); + } constexpr auto outAddrs() -> MutPtrVector { return {outAddrPtr(), numData}; } @@ -990,13 +992,13 @@ class Dependencies { [[nodiscard]] constexpr auto output(ID i) -> IR::Addr *& { return outAddrPtr()[i.id]; } - [[nodiscard]] constexpr auto output(ID i) const -> const IR::Addr * { + [[nodiscard]] constexpr auto output(ID i) const -> IR::Addr * { return outAddrPtr()[i.id]; } [[nodiscard]] constexpr auto input(ID i) -> IR::Addr *& { return inAddrPtr()[i.id]; } - [[nodiscard]] constexpr auto input(ID i) const -> const IR::Addr * { + [[nodiscard]] constexpr auto input(ID i) const -> IR::Addr * { return inAddrPtr()[i.id]; } constexpr auto nextOut(ID i) -> int32_t & { return outEdgePtr()[i.id]; } @@ -1006,6 +1008,13 @@ class Dependencies { return depSatBndPtr()[i.id]; } constexpr auto depPoly(ID i) -> DepPoly *& { return depPolyPtr()[i.id]; } + [[nodiscard]] constexpr auto depSatBnd(ID i) const + -> std::array, 2> { + return depSatBndPtr()[i.id]; + } + [[nodiscard]] constexpr auto depPoly(ID i) const -> DepPoly * { + return depPolyPtr()[i.id]; + } constexpr auto satLevelPair(ID i) -> std::array & { return satLevelsPtr()[i.id]; } @@ -1073,19 +1082,15 @@ class Dependencies { [[nodiscard]] constexpr auto outputEdgeIDs(int32_t id) const { return utils::VForwardRange{outEdges(), id}; } + [[nodiscard]] constexpr auto getEdgeTransform() const { + auto f = [=](int32_t id) { return get(Dependence::ID{id}); }; + return std::views::transform(f); + } [[nodiscard]] constexpr auto inputEdges(int32_t id) const { - auto f = [this](int32_t id) { - Dependencies d = *this; - return d.get(ID{id}); - }; - return inputEdgeIDs(id) | std::views::transform(f); + return inputEdgeIDs(id) | getEdgeTransform(); } [[nodiscard]] constexpr auto outputEdges(int32_t id) const { - auto f = [this](int32_t id) { - Dependencies d = *this; - return d.get(Dependence::ID{id}); - }; - return outputEdgeIDs(id) | std::views::transform(f); + return outputEdgeIDs(id) | getEdgeTransform(); } [[nodiscard]] constexpr auto activeFilter(unsigned depth) const { @@ -1122,6 +1127,12 @@ inline auto Addr::inputEdgeIDs(Dependencies deps) const { inline auto Addr::outputEdgeIDs(Dependencies deps) const { return deps.outputEdgeIDs(getEdgeOut()); } +inline auto Addr::inputEdgeIDs(Dependencies deps, unsigned depth) const { + return inputEdgeIDs(deps) | deps.activeFilter(depth); +} +inline auto Addr::outputEdgeIDs(Dependencies deps, unsigned depth) const { + return outputEdgeIDs(deps) | deps.activeFilter(depth); +} inline auto IR::Addr::inputAddrs(Dependencies deps) const { return inputEdgeIDs(deps) | deps.inputAddrTransform(); @@ -1131,17 +1142,19 @@ inline auto IR::Addr::outputAddrs(Dependencies deps) const { } inline auto Addr::inputEdges(Dependencies deps, unsigned depth) const { - return inputEdgeIDs(deps) | deps.activeFilter(depth); + return inputEdgeIDs(deps) | deps.activeFilter(depth) | + deps.getEdgeTransform(); } inline auto Addr::outputEdges(Dependencies deps, unsigned depth) const { - return outputEdgeIDs(deps) | deps.activeFilter(depth); + return outputEdgeIDs(deps) | deps.activeFilter(depth) | + deps.getEdgeTransform(); } inline auto IR::Addr::inputAddrs(Dependencies deps, unsigned depth) const { - return inputEdges(deps, depth) | deps.inputAddrTransform(); + return inputEdgeIDs(deps, depth) | deps.inputAddrTransform(); } inline auto IR::Addr::outputAddrs(Dependencies deps, unsigned depth) const { - return outputEdges(deps, depth) | deps.outputAddrTransform(); + return outputEdgeIDs(deps, depth) | deps.outputAddrTransform(); } } // namespace IR diff --git a/include/Support/Iterators.hpp b/include/Support/Iterators.hpp index f4d9b4878..fa1bc42e4 100644 --- a/include/Support/Iterators.hpp +++ b/include/Support/Iterators.hpp @@ -76,19 +76,24 @@ class VCycleRange : public std::ranges::view_interface { }; static_assert(std::ranges::forward_range); +/// VForwardIterator is safe with respect to removing the current iteration from +/// the list. However, behavior is undefined if you remove or move the next +/// element. class VForwardIterator { const int32_t *data{nullptr}; int32_t state{-1}; + int32_t next{-1}; public: using value_type = int32_t; constexpr VForwardIterator() noexcept = default; constexpr VForwardIterator(const int32_t *data, int32_t start) noexcept - : data(data), state(start) {} + : data{data}, state{start}, next{start < 0 ? start : data[start]} {} constexpr auto operator*() const noexcept -> int32_t { return state; } constexpr auto operator++() noexcept -> VForwardIterator & { - state = data[state]; + state = next; + if (next >= 0) next = data[next]; return *this; } constexpr auto operator++(int) noexcept -> VForwardIterator { From 62ff70ae22d7ff28eaf4c8e42c3fa9b43fdd1da8 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Thu, 20 Jul 2023 14:32:52 -0400 Subject: [PATCH 008/112] minor progress --- include/IR/CostModeling.hpp | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index 6ce33f8f9..98c10361a 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -435,6 +435,27 @@ class IROptimizer { } return loopDeps; } + inline auto eliminateAddr(IR::Addr *a) -> bool { + for (int32_t id : a->outputEdgeIDs(deps, a->getCurrentDepth())) { + IR::Addr *b = deps.output(Dependence::ID{id}); + // TODO: also check loop extants + if (a->indexMatrix() != b->indexMatrix()) return false; + if (a->isStore()) { + // On a Write->Write, we remove the first write. + if (b->isStore()) return true; + // Write->Load, we will remove the load if it's in the same block as the + // write, and we can forward the stored value. + if (a->getLoop() != b->getLoop()) return false; + // TODO: delete `b`, replacing with val stored in `a` + } else if (b->isLoad()) { // Read->Read + // If they're not in the same loop, we need to reload anyway + if (a->getLoop() != b->getLoop()) return false; + // If they're in the same loop, we can delete the second read + // TODO: delete `b`, replacing with `a` + } else return false; // Read->Write, can't delete either + } + return false; + } // plan: SCC? Iterate over nodes in program order? // then we can iterate in order. @@ -515,13 +536,8 @@ class IROptimizer { // S0R->S2W, no change; break. // S2W->S3R, replace read with stored value forwarding. // S2W->S3W, remove S2W as it is shadowed by S3W. - for (int32_t id : a->outputEdgeIDs(deps, a->getCurrentDepth())) { - IR::Addr *b = deps.output(Dependence::ID{id}); - if (!eliminateAddr(a, b)) break; - } - for (Dependence d : a->outputEdges(deps)) { - IR::Addr *b = d.output(); - eliminateAddr(a, b); + if (eliminateAddr(a)) { + // TODO: we remove `a` without replacement } } } From 2cd181a73d1827b1fe95cf576cb611e4ac201dcb Mon Sep 17 00:00:00 2001 From: chriselrod Date: Thu, 20 Jul 2023 21:07:54 -0400 Subject: [PATCH 009/112] Use `/usr/bin/clang++` explicitly to avoid recompile bug https://gitlab.kitware.com/cmake/cmake/-/issues/17330 --- configure.benchmark | 4 ++-- configure.debug | 2 +- configure.nosan | 2 +- configure.reldeb | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/configure.benchmark b/configure.benchmark index 615e7d7b7..df0652ce6 100755 --- a/configure.benchmark +++ b/configure.benchmark @@ -1,9 +1,9 @@ #!/bin/sh CXXFLAGS="" CXX=g++ cmake -S benchmark buildgcc/benchmark -DCMAKE_BUILD_TYPE=Release -CXXFLAGS="" CXX=clang++ cmake -S benchmark buildclang/benchmark -DCMAKE_BUILD_TYPE=Release +CXXFLAGS="" CXX=/usr/bin/clang++ cmake -S benchmark buildclang/benchmark -DCMAKE_BUILD_TYPE=Release CXXFLAGS="" CXX=g++ cmake -S test buildgcc/testrelease -DCMAKE_BUILD_TYPE=Release -CXXFLAGS="" CXX=clang++ cmake -S test buildclang/testrelease -DCMAKE_BUILD_TYPE=Release +CXXFLAGS="" CXX=/usr/bin/clang++ cmake -S test buildclang/testrelease -DCMAKE_BUILD_TYPE=Release if ! test -z "$icpx" then CXXFLAGS="" CXX=icpx cmake -S benchmark buildintel/benchmark -DCMAKE_BUILD_TYPE=Release diff --git a/configure.debug b/configure.debug index 456f4a378..2d3bda4fa 100755 --- a/configure.debug +++ b/configure.debug @@ -3,4 +3,4 @@ # sanitizers='Undefined' sanitizers='Address;Undefined' CXXFLAGS="" CXX=g++ cmake -S test -B buildgcc/test -DCMAKE_BUILD_TYPE=Debug -DUSE_SANITIZER=$sanitizers -DENABLE_TEST_COVERAGE=1 "$@" -CXXFLAGS="" CXX=clang++ cmake -S test -B buildclang/test -DCMAKE_BUILD_TYPE=Debug -DUSE_SANITIZER=$sanitizers "$@" +CXXFLAGS="" CXX=/usr/bin/clang++ cmake -S test -B buildclang/test -DCMAKE_BUILD_TYPE=Debug -DUSE_SANITIZER=$sanitizers "$@" diff --git a/configure.nosan b/configure.nosan index 217217f30..0a230216f 100755 --- a/configure.nosan +++ b/configure.nosan @@ -1,4 +1,4 @@ #!/bin/sh CXXFLAGS="" CXX=g++ cmake -S test -B buildgcc/nosan -DCMAKE_BUILD_TYPE=Debug "$@" -CXXFLAGS="" CXX=clang++ cmake -S test -B buildclang/nosan -DCMAKE_BUILD_TYPE=Debug "$@" +CXXFLAGS="" CXX=/usr/bin/clang++ cmake -S test -B buildclang/nosan -DCMAKE_BUILD_TYPE=Debug "$@" diff --git a/configure.reldeb b/configure.reldeb index 91499a7a3..07c7a499e 100755 --- a/configure.reldeb +++ b/configure.reldeb @@ -4,4 +4,4 @@ # CXXFLAGS="" CXX=g++ cmake -S test -B buildgcc/testreldeb -DCMAKE_BUILD_TYPE=RelWithDebInfo -DUSE_SANITIZER=$sanitizers "$@" # CXXFLAGS="" CXX=clang++ cmake -S test -B buildclang/testreldeb -DCMAKE_BUILD_TYPE=RelWithDebInfo -DUSE_SANITIZER=$ CXXFLAGS="" CXX=g++ cmake -S test -B buildgcc/testreldeb -DCMAKE_BUILD_TYPE=RelWithDebInfo "$@" -CXXFLAGS="" CXX=clang++ cmake -S test -B buildclang/testreldeb -DCMAKE_BUILD_TYPE=RelWithDebInfo "$@" +CXXFLAGS="" CXX=/usr/bin/clang++ cmake -S test -B buildclang/testreldeb -DCMAKE_BUILD_TYPE=RelWithDebInfo "$@" From 5a06996af5e697f503cce4b9dfd9715e531edc54 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Thu, 20 Jul 2023 23:52:37 -0400 Subject: [PATCH 010/112] Remove redundant `Addr` --- include/IR/Address.hpp | 2 + include/IR/Cache.hpp | 6 ++ include/IR/CostModeling.hpp | 112 ++++++++++--------------------- include/Polyhedra/Dependence.hpp | 43 ++++++++++-- 4 files changed, 82 insertions(+), 81 deletions(-) diff --git a/include/IR/Address.hpp b/include/IR/Address.hpp index 4fca7d5cb..d17dfb502 100644 --- a/include/IR/Address.hpp +++ b/include/IR/Address.hpp @@ -529,6 +529,8 @@ class Addr : public Instruction { // TODO: cache? return calculateCostContiguousLoadStore(TTI, W.getWidth()); } + /// drop `this` and remove it from `Dependencies` + inline void drop(Dependencies); void printDotName(llvm::raw_ostream &os) const { if (isLoad()) os << "... = "; diff --git a/include/IR/Cache.hpp b/include/IR/Cache.hpp index 5813f1f5e..3a271f395 100644 --- a/include/IR/Cache.hpp +++ b/include/IR/Cache.hpp @@ -205,6 +205,12 @@ class Cache { return {createConstant(c, n), tr}; return {createConstantVal(v, n), tr}; } + /// void replaceUsesByUsers(Value *oldNode, Value *newNode) + /// The name is confusing. This iterates through oldNode's users + /// (i.e. things using oldNode), and swaps the `oldNode` for `newNode`. + /// It checks if those users are `newNode` itself, if so, it does not modify. + /// This allows replacing `x` with `f(x)`, for example. That feature is used + /// for control flow merging. // NOLINTNEXTLINE(misc-no-recursion) constexpr void replaceUsesByUsers(Value *oldNode, Value *newNode) { invariant(oldNode->getKind() == Node::VK_Load || diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index 98c10361a..cb90dba3c 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -417,8 +417,8 @@ class IROptimizer { IR::Dependencies deps; IR::Loop *root; MutPtrVector loopDeps; + IR::Cache &instructions; Arena<> *lalloc; - Arena<> *salloc; static auto loopDepSats(Arena<> *alloc, IR::Dependencies deps, lp::LoopBlock::OptimizationResult res) @@ -435,26 +435,27 @@ class IROptimizer { } return loopDeps; } - inline auto eliminateAddr(IR::Addr *a) -> bool { + inline void eliminateAddr(IR::Addr *a) { for (int32_t id : a->outputEdgeIDs(deps, a->getCurrentDepth())) { IR::Addr *b = deps.output(Dependence::ID{id}); // TODO: also check loop extants - if (a->indexMatrix() != b->indexMatrix()) return false; + if (a->indexMatrix() != b->indexMatrix()) return; if (a->isStore()) { // On a Write->Write, we remove the first write. - if (b->isStore()) return true; + if (b->isStore()) return a->drop(deps); // Write->Load, we will remove the load if it's in the same block as the // write, and we can forward the stored value. - if (a->getLoop() != b->getLoop()) return false; - // TODO: delete `b`, replacing with val stored in `a` + if (a->getLoop() != b->getLoop()) return; + instructions.replaceAllUsesWith(b, a->getStoredVal()); + b->drop(deps); } else if (b->isLoad()) { // Read->Read // If they're not in the same loop, we need to reload anyway - if (a->getLoop() != b->getLoop()) return false; + if (a->getLoop() != b->getLoop()) return; // If they're in the same loop, we can delete the second read - // TODO: delete `b`, replacing with `a` - } else return false; // Read->Write, can't delete either + instructions.replaceAllUsesWith(b, a); + b->drop(deps); + } else return; // Read->Write, can't delete either } - return false; } // plan: SCC? Iterate over nodes in program order? @@ -518,67 +519,26 @@ class IROptimizer { // E.g. check if the array is a `llvm::isNonEscapingLocalObject` and // allocated by `llvm::isRemovableAlloc`. void removeRedundantAddr(IR::AddrChain addr) { - for (IR::Addr *a : addr.getAddr()) { - // outputEdges are sorted topologically from first to last. - // Example: - // for (int i = 0 : i < I; ++i){ - // acc = x[i]; // Statement: 0 - // for (int j = 0; j < i; ++j){ - // acc -= x[j]*U[j,i]; // Statement: 1 - // } - // x[i] = acc; // Statement: 2 - // x[i] = x[i] / U[i,i]; // Statement: 3 - // } - // Here, we have a lot of redundant edges connecting the various `x[i]`s. - // We also have output edges between the `x[i]` and the `x[j]` load in - // statement 1. It is, however, satisfied at `x[i]`'s depth, and ignored. - // So, what would happen here: - // S0R->S2W, no change; break. - // S2W->S3R, replace read with stored value forwarding. - // S2W->S3W, remove S2W as it is shadowed by S3W. - if (eliminateAddr(a)) { - // TODO: we remove `a` without replacement - } - } - } - // The plan here is to index all arrays by relative position, and then - // sort outputEdges based on first->last, so that we can try to eliminate in - // order. We break on first failure to eliminate. - // a is the input, b the output - auto eliminateAddr(IR::Addr *a, IR::Addr *b) -> bool { - // TODO: check a's and b's loops have same extants! - if (a->indexMatrix() != b->indexMatrix()) return false; - /// are there any addr between them? - if (a->isStore()) { - if (b->isStore()) { // Write->Write - // Are there reads in between? If so, we must keep-- - // --unless we're storing the same value twice (???) - // without other intervening store-edges. - // Without reads in between, it's safe. - return true; - } else { // Write->Read - // Can we replace the read with using the written value? - if (a->getLoop() != b->getLoop()) return false; - // TODO: forward - return true; - } - } else if (b->isLoad()) { // Read->Read - // If they don't have the same parent, either... - // They're in different branches of loops, and load can't live - // in between them - // for (i : I){ - // for (j : J){ - // A[i,j]; - // } - // for (j : J){ - // A[i,j]; - // } - // } - // or it is a subloop, but dependencies prevented us from hoisting. - if (a->getLoop() != b->getLoop()) return false; - return true; - // Any writes in between them? - } else return false; // Read->Write, can't delete either + // outputEdges are sorted topologically from first to last. + // Example: + // for (int i = 0 : i < I; ++i){ + // acc = x[i]; // Statement: 0 + // for (int j = 0; j < i; ++j){ + // acc -= x[j]*U[j,i]; // Statement: 1 + // } + // x[i] = acc; // Statement: 2 + // x[i] = x[i] / U[i,i]; // Statement: 3 + // } + // Here, we have a lot of redundant edges connecting the various `x[i]`s. + // We also have output edges between the `x[i]` and the `x[j]` load in + // statement 1. It is, however, satisfied at `x[i]`'s depth, and ignored. + // So, what would happen here: + // S0R->S2W, no change; break. + // S2W->S3R, replace read with stored value forwarding. + // S2W->S3W, remove S2W as it is shadowed by S3W. + // NOTE: we rely on the `ListRange` iterator supporting safely removing the + // current iter from the list. + for (IR::Addr *a : addr.getAddr()) eliminateAddr(a); } /// The approach to sorting edges is to iterate through nodes backwards /// whenever we encounter an `Addr`, we push it to the front of each @@ -613,9 +573,9 @@ class IROptimizer { public: IROptimizer(IR::Dependencies deps, IR::Loop *root_, Arena<> *lalloc, - Arena<> *salloc, lp::LoopBlock::OptimizationResult res) + IR::Cache &instr, lp::LoopBlock::OptimizationResult res) : deps{deps}, root{root_}, loopDeps{loopDepSats(lalloc, deps, res)}, - lalloc{lalloc}, salloc{salloc} { + instructions{instr}, lalloc{lalloc} { sortEdges(root, 0); removeRedundantAddr(res.addr); } @@ -722,13 +682,13 @@ inline void optimize(IR::Dependencies deps, IR::Cache &instr, Arena<> *lalloc, // alloc, so we can checkpoint it here, and use alloc for other IR nodes. // The `instr` allocator is more generally the longer lived allocator, // as it allocates the actual nodes. - Arena<> *salloc = instr.getAllocator(); - IR::Loop *root = addAddrToGraph(salloc, lalloc, res.nodes); + + IR::Loop *root = addAddrToGraph(instr.getAllocator(), lalloc, res.nodes); buildGraph(deps, root); // `N` is the head of the topologically sorted graph // We now try to remove redundant memory operations - IROptimizer(deps, root, lalloc, salloc, res); + IROptimizer(deps, root, lalloc, instr, res); } /* diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index d75bd30c4..ce53c6105 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -574,11 +574,13 @@ class Dependencies { auto out = d.output(); auto in = d.input(); output(i) = out; + input(i) = in; nextOut(i) = out->getEdgeOut(); if (out->getEdgeOut() >= 0) prevOut(ID{out->getEdgeOut()}) = i.id; prevOut(i) = -1; - input(i) = in; nextIn(i) = in->getEdgeIn(); + if (in->getEdgeIn() >= 0) prevIn(ID{in->getEdgeIn()}) = i.id; + prevIn(i) = -1; depSatBnd(i) = d.getSimplexPair(); depPoly(i) = d.getDepPoly(); satLevelPair(i) = d.satLvl; @@ -852,6 +854,7 @@ class Dependencies { // nextOut // prevOut // nextIn + // prevIn // dependenceSatisfaction // dependenceBounding // depPoly @@ -866,11 +869,14 @@ class Dependencies { [[nodiscard]] static constexpr auto prevEdgeOutOffset() -> size_t { return nextEdgeOutOffset() + sizeof(int32_t); } - [[nodiscard]] static constexpr auto inEdgeOffset() -> size_t { + [[nodiscard]] static constexpr auto nextEdgeInOffset() -> size_t { return prevEdgeOutOffset() + sizeof(int32_t); } + [[nodiscard]] static constexpr auto prevEdgeInOffset() -> size_t { + return nextEdgeInOffset() + sizeof(int32_t); + } [[nodiscard]] static constexpr auto depSatBndOffset() -> size_t { - return inEdgeOffset() + sizeof(int32_t); + return prevEdgeInOffset() + sizeof(int32_t); } [[nodiscard]] static constexpr auto depPolyOffset() -> size_t { return depSatBndOffset() + sizeof(std::array, 2>); @@ -915,11 +921,19 @@ class Dependencies { return static_cast(p); } constexpr auto inEdgePtr() -> int32_t * { - void *p = data + inEdgeOffset() * getCapacity(); + void *p = data + nextEdgeInOffset() * getCapacity(); return static_cast(p); } [[nodiscard]] constexpr auto inEdgePtr() const -> const int32_t * { - const void *p = data + inEdgeOffset() * getCapacity(); + const void *p = data + nextEdgeInOffset() * getCapacity(); + return static_cast(p); + } + constexpr auto prevInEdgePtr() -> int32_t * { + void *p = data + prevEdgeInOffset() * getCapacity(); + return static_cast(p); + } + [[nodiscard]] constexpr auto prevEdgePtr() const -> const int32_t * { + const void *p = data + prevEdgeInOffset() * getCapacity(); return static_cast(p); } constexpr auto depSatBndPtr() -> std::array, 2> * { @@ -958,12 +972,22 @@ class Dependencies { } public: + constexpr void removeEdge(ID id) { + removeOutEdge(id.id); + removeInEdge(id.id); + } constexpr void removeOutEdge(int32_t id) { int32_t prev = prevOut(poly::Dependence::ID{id}); int32_t next = nextOut(poly::Dependence::ID{id}); if (prev >= 0) nextOut(poly::Dependence::ID{prev}) = next; if (next >= 0) prevOut(poly::Dependence::ID{next}) = prev; } + constexpr void removeInEdge(int32_t id) { + int32_t prev = prevIn(poly::Dependence::ID{id}); + int32_t next = nextIn(poly::Dependence::ID{id}); + if (prev >= 0) nextIn(poly::Dependence::ID{prev}) = next; + if (next >= 0) prevIn(poly::Dependence::ID{next}) = prev; + } [[nodiscard]] constexpr auto get(ID i) const -> Dependence { return get(i, input(i), output(i)); } @@ -1004,6 +1028,7 @@ class Dependencies { constexpr auto nextOut(ID i) -> int32_t & { return outEdgePtr()[i.id]; } constexpr auto prevOut(ID i) -> int32_t & { return prevOutEdgePtr()[i.id]; } constexpr auto nextIn(ID i) -> int32_t & { return inEdgePtr()[i.id]; } + constexpr auto prevIn(ID i) -> int32_t & { return prevInEdgePtr()[i.id]; } constexpr auto depSatBnd(ID i) -> std::array, 2> & { return depSatBndPtr()[i.id]; } @@ -1157,6 +1182,14 @@ inline auto IR::Addr::outputAddrs(Dependencies deps, unsigned depth) const { return outputEdgeIDs(deps, depth) | deps.outputAddrTransform(); } +inline void IR::Addr::drop(Dependencies deps) { + // NOTE: this doesn't get removed from the `origAddr` list/the addrChain + if (IR::Loop *L = getLoop(); L->getChild() == this) L->setChild(getNext()); + removeFromList(); + for (int32_t id : inputEdgeIDs(deps)) deps.removeEdge(Dependence::ID{id}); + for (int32_t id : outputEdgeIDs(deps)) deps.removeEdge(Dependence::ID{id}); +} + } // namespace IR namespace poly { From 8449da05c04806f15c9ba45399c91c3c4a678f94 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Fri, 21 Jul 2023 00:33:13 -0400 Subject: [PATCH 011/112] Delete temporaries --- include/IR/Address.hpp | 3 +++ include/IR/CostModeling.hpp | 35 ++++++++++++++++++++++++++++++-- include/Polyhedra/Dependence.hpp | 1 + include/TurboLoop.hpp | 5 +++-- 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/include/IR/Address.hpp b/include/IR/Address.hpp index d17dfb502..7807988f4 100644 --- a/include/IR/Address.hpp +++ b/include/IR/Address.hpp @@ -130,6 +130,9 @@ class Addr : public Instruction { } public: + [[nodiscard]] constexpr auto isDropped() const -> bool { + return (getNext() == nullptr) && (getPrev() == nullptr); + } constexpr void setTopPosition(int32_t pos) { topologicalPosition = pos; } [[nodiscard]] constexpr auto getTopPosition() const -> int32_t { return topologicalPosition; diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index cb90dba3c..9c76ba11b 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -18,6 +18,8 @@ #include #include #include +#include +#include #include #include #include @@ -419,7 +421,12 @@ class IROptimizer { MutPtrVector loopDeps; IR::Cache &instructions; Arena<> *lalloc; + llvm::TargetLibraryInfo *TLI; + /// `loopDepSats` places the dependencies at the correct loop level so that + /// we can more easily check all dependencies carried by a particular loop. + /// We use these for checks w/ respect to unrolling and vectorization + /// legality. static auto loopDepSats(Arena<> *alloc, IR::Dependencies deps, lp::LoopBlock::OptimizationResult res) -> MutPtrVector { @@ -435,6 +442,7 @@ class IROptimizer { } return loopDeps; } + // this compares `a` with each of its active outputs. inline void eliminateAddr(IR::Addr *a) { for (int32_t id : a->outputEdgeIDs(deps, a->getCurrentDepth())) { IR::Addr *b = deps.output(Dependence::ID{id}); @@ -457,6 +465,28 @@ class IROptimizer { } else return; // Read->Write, can't delete either } } + // we eliminate temporaries that meet these conditions: + // 1. are only ever stored to (this can be achieved via + // load-elimination/stored-val forwarding in `removeRedundantAddr`) + // 2. are non-escaping, i.e. `llvm::isNonEscapingLocalObject` + // 3. returned by `llvm::isRemovableAlloc` + inline void eliminateTemporaries(IR::AddrChain addr) { + auto s = lalloc->scope(); + dict::aset loaded{lalloc}; + for (IR::Addr *a : addr.getAddr()) + if (a->isLoad()) loaded.insert(a); + + for (IR::Addr *a : addr.getAddr()) { + if (a->isDropped()) continue; + if (loaded.contains(a)) continue; + const llvm::SCEVUnknown *ptr = a->getArrayPointer(); + auto *call = llvm::dyn_cast(ptr->getValue()); + if (!call) continue; + if (llvm::isNonEscapingLocalObject(call, nullptr) && + llvm::isRemovableAlloc(call, TLI)) + a->drop(deps); + } + } // plan: SCC? Iterate over nodes in program order? // then we can iterate in order. @@ -574,10 +604,11 @@ class IROptimizer { public: IROptimizer(IR::Dependencies deps, IR::Loop *root_, Arena<> *lalloc, IR::Cache &instr, lp::LoopBlock::OptimizationResult res) - : deps{deps}, root{root_}, loopDeps{loopDepSats(lalloc, deps, res)}, - instructions{instr}, lalloc{lalloc} { + : deps{deps}, root{root_}, instructions{instr}, lalloc{lalloc} { sortEdges(root, 0); removeRedundantAddr(res.addr); + eliminateTemporaries(res.addr); + loopDeps = loopDepSats(lalloc, deps, res); } }; diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index ce53c6105..b29fbbc99 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -1188,6 +1188,7 @@ inline void IR::Addr::drop(Dependencies deps) { removeFromList(); for (int32_t id : inputEdgeIDs(deps)) deps.removeEdge(Dependence::ID{id}); for (int32_t id : outputEdgeIDs(deps)) deps.removeEdge(Dependence::ID{id}); + arrayP } } // namespace IR diff --git a/include/TurboLoop.hpp b/include/TurboLoop.hpp index 9ca9ed33f..c7accfab6 100644 --- a/include/TurboLoop.hpp +++ b/include/TurboLoop.hpp @@ -68,7 +68,7 @@ concept LoadOrStoreInst = class TurboLoop { dict::map loopMap; - // const llvm::TargetLibraryInfo *TLI; + const llvm::TargetLibraryInfo *TLI; const llvm::TargetTransformInfo *TTI; llvm::LoopInfo *LI; llvm::ScalarEvolution *SE; @@ -367,7 +367,8 @@ class TurboLoop { // } public: TurboLoop(llvm::Function &F, llvm::FunctionAnalysisManager &FAM) - : TTI{&FAM.getResult(F)}, + : TLI{&FAM.getResult(F)}, + TTI{&FAM.getResult(F)}, LI{&FAM.getResult(F)}, SE{&FAM.getResult(F)}, ORE{&FAM.getResult(F)}, From cf34288a88e10c70c5549bfa282782dc82ba5b93 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Fri, 21 Jul 2023 21:23:36 -0400 Subject: [PATCH 012/112] minor progress on temp array deletion --- include/IR/CostModeling.hpp | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index 9c76ba11b..4d1259a8f 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -415,6 +416,19 @@ inline auto addAddrToGraph(Arena<> *salloc, Arena<> *lalloc, return root->getLoop(); } +inline auto hasFutureReads(Arena<> *alloc, dict::set &LBBs, + llvm::Instruction *I) -> bool { + auto s = alloc->scope(); + dict::aset successors{alloc}; + for (llvm::BasicBlock *S : llvm::successors(I->getParent())) + if (!LBBs.count(S)) successors.insert(S); + for (auto *U : I->users()) + if (auto *UI = llvm::dyn_cast(U); + UI->mayReadFromMemory() && successors.count(UI->getParent())) + return true; + return false; +} + class IROptimizer { IR::Dependencies deps; IR::Loop *root; @@ -482,9 +496,13 @@ class IROptimizer { const llvm::SCEVUnknown *ptr = a->getArrayPointer(); auto *call = llvm::dyn_cast(ptr->getValue()); if (!call) continue; - if (llvm::isNonEscapingLocalObject(call, nullptr) && - llvm::isRemovableAlloc(call, TLI)) - a->drop(deps); + if (!llvm::isNonEscapingLocalObject(call, nullptr)) continue; + if (!llvm::isRemovableAlloc(call, TLI)) continue; + if (hasFutureReads(lalloc, LBBs, call)) continue; + // TODO: find associated free, and confirm a lack of other uses + // check if we can eliminate the malloc/new and free/delete + // FIXME: check for reads after this... + a->drop(deps); } } From fdbaa9e3187cccf66898b9690a22f847515f979d Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Sat, 22 Jul 2023 02:41:13 -0400 Subject: [PATCH 013/112] Some progress on alloc elim, constify the TTI Next up is checking unroll/vectorization legality --- include/Dicts/BumpMapSet.hpp | 4 +- include/IR/Address.hpp | 4 +- include/IR/ControlFlowMerging.hpp | 13 +++--- include/IR/CostModeling.hpp | 56 ++++++++++++++++------- include/IR/Instruction.hpp | 60 ++++++++++++++----------- include/IR/Node.hpp | 11 ++++- include/LinearProgramming/LoopBlock.hpp | 4 +- include/Polyhedra/Dependence.hpp | 7 ++- include/TurboLoop.hpp | 13 ++++-- 9 files changed, 111 insertions(+), 61 deletions(-) diff --git a/include/Dicts/BumpMapSet.hpp b/include/Dicts/BumpMapSet.hpp index 0a2b836e9..0254a518b 100644 --- a/include/Dicts/BumpMapSet.hpp +++ b/include/Dicts/BumpMapSet.hpp @@ -10,7 +10,7 @@ template using map = ankerl::unordered_dense::map; template -struct amap +struct amap // NOLINT(readability-identifier-naming) : ankerl::unordered_dense::map, std::equal_to, math::BumpPtrVector>> { @@ -21,7 +21,7 @@ struct amap amap(Arena<> *alloc) : Base{WArena>(alloc)} {} }; template -struct aset +struct aset // NOLINT(readability-identifier-naming) : ankerl::unordered_dense::set, std::equal_to, math::BumpPtrVector> { using Base = diff --git a/include/IR/Address.hpp b/include/IR/Address.hpp index 7807988f4..b8da8a2d5 100644 --- a/include/IR/Address.hpp +++ b/include/IR/Address.hpp @@ -503,7 +503,7 @@ class Addr : public Instruction { return std::equal(thisSizes.begin(), thisSizes.end(), xSizes.begin(), xSizes.end()); } - auto calculateCostContiguousLoadStore(llvm::TargetTransformInfo &TTI, + auto calculateCostContiguousLoadStore(const llvm::TargetTransformInfo &TTI, unsigned int vectorWidth) -> cost::RecipThroughputLatency { constexpr unsigned int addrSpace = 0; @@ -527,7 +527,7 @@ class Addr : public Instruction { llvm::TargetTransformInfo::TCK_Latency)}; } - auto getCost(llvm::TargetTransformInfo &TTI, cost::VectorWidth W) + auto getCost(const llvm::TargetTransformInfo &TTI, cost::VectorWidth W) -> cost::RecipThroughputLatency { // TODO: cache? return calculateCostContiguousLoadStore(TTI, W.getWidth()); diff --git a/include/IR/ControlFlowMerging.hpp b/include/IR/ControlFlowMerging.hpp index a0f8e73de..c67cd9592 100644 --- a/include/IR/ControlFlowMerging.hpp +++ b/include/IR/ControlFlowMerging.hpp @@ -284,7 +284,7 @@ struct MergingCost { return unsigned(selector); } - void merge(Arena<> *alloc, llvm::TargetTransformInfo &TTI, + void merge(Arena<> *alloc, const llvm::TargetTransformInfo &TTI, unsigned int vectorBits, Instruction *A, Instruction *B) { mergeList.emplace_back(A, B); auto *aA = ancestorMap.find(B); @@ -369,7 +369,7 @@ struct MergingCost { // NOLINTNEXTLINE(misc-no-recursion) inline void mergeInstructions( Arena<> *alloc, IR::Cache &cache, Predicate::Map &predMap, - llvm::TargetTransformInfo &TTI, unsigned int vectorBits, + const llvm::TargetTransformInfo &TTI, unsigned int vectorBits, amap> opMap, amap &valToPred, @@ -445,11 +445,10 @@ inline void mergeInstructions( /// merging as it allocates a lot of memory that it can free when it is done. /// TODO: this algorithm is exponential in time and memory. /// Odds are that there's way smarter things we can do. -[[nodiscard]] inline auto mergeInstructions(IR::Cache &cache, - Predicate::Map &predMap, - llvm::TargetTransformInfo &TTI, - Arena<> tAlloc, unsigned vectorBits, - TreeResult tr) -> TreeResult { +[[nodiscard]] inline auto +mergeInstructions(IR::Cache &cache, Predicate::Map &predMap, + const llvm::TargetTransformInfo &TTI, Arena<> tAlloc, + unsigned vectorBits, TreeResult tr) -> TreeResult { auto [completed, trret] = cache.completeInstructions(&predMap, tr); tr = trret; if (!predMap.isDivergent()) return tr; diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index 4d1259a8f..f278d73b0 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -1,6 +1,7 @@ #pragma once // #include "./ControlFlowMerging.hpp" +#include "Dicts/BumpMapSet.hpp" #include "Graphs/Graphs.hpp" #include "IR/Address.hpp" #include "LinearProgramming/LoopBlock.hpp" @@ -27,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -415,25 +417,39 @@ inline auto addAddrToGraph(Arena<> *salloc, Arena<> *lalloc, root->addNode(salloc, lalloc, node); return root->getLoop(); } - +// NOLINTNEXTLINE(misc-no-recursion) +inline auto hasFutureReadsCore(dict::aset &successors, + llvm::Instruction *I) -> bool { + for (auto *U : I->users()) { + auto *UI = llvm::dyn_cast(U); + if (!UI) continue; + if (UI->mayReadFromMemory() && successors.count(UI->getParent())) + return true; + if (llvm::isa(UI) && + hasFutureReadsCore(successors, UI)) + return true; + // TODO: don't just give up if we cast to int? + if (llvm::isa(UI) || llvm::isa(UI)) + return true; + } + return false; +} inline auto hasFutureReads(Arena<> *alloc, dict::set &LBBs, llvm::Instruction *I) -> bool { auto s = alloc->scope(); dict::aset successors{alloc}; for (llvm::BasicBlock *S : llvm::successors(I->getParent())) if (!LBBs.count(S)) successors.insert(S); - for (auto *U : I->users()) - if (auto *UI = llvm::dyn_cast(U); - UI->mayReadFromMemory() && successors.count(UI->getParent())) - return true; - return false; + return hasFutureReadsCore(successors, I); } class IROptimizer { IR::Dependencies deps; + IR::Cache &instructions; + dict::set &LBBs; + dict::set &eraseCandidates; IR::Loop *root; MutPtrVector loopDeps; - IR::Cache &instructions; Arena<> *lalloc; llvm::TargetLibraryInfo *TLI; @@ -499,10 +515,13 @@ class IROptimizer { if (!llvm::isNonEscapingLocalObject(call, nullptr)) continue; if (!llvm::isRemovableAlloc(call, TLI)) continue; if (hasFutureReads(lalloc, LBBs, call)) continue; - // TODO: find associated free, and confirm a lack of other uses - // check if we can eliminate the malloc/new and free/delete - // FIXME: check for reads after this... a->drop(deps); + // we later check if any uses remain other than the associated free + // if not, we can delete them. + // We may want to go ahead and do this here. We don't for now, + // because we have live `llvm::Instruction`s that we haven't removed yet. + // TODO: revisit when handling code generation (and deleting old code) + eraseCandidates.insert(call); } } @@ -620,9 +639,12 @@ class IROptimizer { } public: - IROptimizer(IR::Dependencies deps, IR::Loop *root_, Arena<> *lalloc, - IR::Cache &instr, lp::LoopBlock::OptimizationResult res) - : deps{deps}, root{root_}, instructions{instr}, lalloc{lalloc} { + IROptimizer(IR::Dependencies deps, IR::Cache &instr, + dict::set &loopBBs, + dict::set &eraseCandidates_, IR::Loop *root_, + Arena<> *lalloc, lp::LoopBlock::OptimizationResult res) + : deps{deps}, instructions{instr}, LBBs{loopBBs}, + eraseCandidates{eraseCandidates_}, root{root_}, lalloc{lalloc} { sortEdges(root, 0); removeRedundantAddr(res.addr); eliminateTemporaries(res.addr); @@ -723,8 +745,10 @@ class IROptimizer { // /// /// Optimize the schedule -inline void optimize(IR::Dependencies deps, IR::Cache &instr, Arena<> *lalloc, - lp::LoopBlock::OptimizationResult res) { +inline void optimize(IR::Dependencies deps, IR::Cache &instr, + dict::set &loopBBs, + dict::set &eraseCandidates, + Arena<> *lalloc, lp::LoopBlock::OptimizationResult res) { // we must build the IR::Loop // Initially, to help, we use a nested vector, so that we can index into it // using the fusion omegas. We allocate it with the longer lived `instr` @@ -737,7 +761,7 @@ inline void optimize(IR::Dependencies deps, IR::Cache &instr, Arena<> *lalloc, // `N` is the head of the topologically sorted graph // We now try to remove redundant memory operations - IROptimizer(deps, root, lalloc, instr, res); + IROptimizer(deps, instr, loopBBs, eraseCandidates, root, lalloc, res); } /* diff --git a/include/IR/Instruction.hpp b/include/IR/Instruction.hpp index d23c78e21..3d1482641 100644 --- a/include/IR/Instruction.hpp +++ b/include/IR/Instruction.hpp @@ -227,13 +227,13 @@ class Compute : public Instruction { /// fall back in case we need value operand // [[nodiscard]] auto isValue() const -> bool { return id.isValue(); } - auto getCost(llvm::TargetTransformInfo &TTI, VectorWidth W) + auto getCost(const llvm::TargetTransformInfo &TTI, VectorWidth W) -> RecipThroughputLatency { RecipThroughputLatency c = costs[W]; if (c.notYetComputed()) costs[W] = c = calcCost(TTI, W.getWidth()); return c; } - [[nodiscard]] inline auto calcCost(llvm::TargetTransformInfo &TTI, + [[nodiscard]] inline auto calcCost(const llvm::TargetTransformInfo &TTI, unsigned vectorWidth) -> RecipThroughputLatency; [[nodiscard]] auto getType(unsigned int vectorWidth) const -> llvm::Type * { @@ -284,8 +284,8 @@ class OpaqueFunc { auto getFunction() -> llvm::Function * { return ins->getLLVMInstruction()->getFunction(); } - auto calcCallCost(llvm::TargetTransformInfo &TTI, unsigned int vectorWidth) - -> RecipThroughputLatency { + auto calcCallCost(const llvm::TargetTransformInfo &TTI, + unsigned int vectorWidth) -> RecipThroughputLatency { llvm::Type *T = ins->getType(vectorWidth); llvm::SmallVector argTypes; for (auto *op : getOperands()) argTypes.push_back(op->getType(vectorWidth)); @@ -296,7 +296,7 @@ class OpaqueFunc { TTI.getCallInstrCost(getFunction(), T, argTypes, llvm::TargetTransformInfo::TCK_Latency)}; } - auto calcCallCost(llvm::TargetTransformInfo &TTI, llvm::Function *F, + auto calcCallCost(const llvm::TargetTransformInfo &TTI, llvm::Function *F, unsigned int vectorWidth) -> RecipThroughputLatency { llvm::Type *T = ins->getType(vectorWidth); llvm::SmallVector argTypes; @@ -440,8 +440,9 @@ class Operation { [[nodiscard]] auto getType(unsigned w) const -> llvm::Type * { return ins->getType(w); } - auto calcUnaryArithmeticCost(llvm::TargetTransformInfo &TTI, - unsigned int vectorWidth) const + [[nodiscard]] auto + calcUnaryArithmeticCost(const llvm::TargetTransformInfo &TTI, + unsigned int vectorWidth) const -> RecipThroughputLatency { auto op0info = ins->getOperandInfo(0); llvm::Type *T = getType(vectorWidth); @@ -454,8 +455,9 @@ class Operation { [[nodiscard]] auto getInstruction() const -> llvm::Instruction * { return ins->getLLVMInstruction(); } - auto calcBinaryArithmeticCost(llvm::TargetTransformInfo &TTI, - unsigned int vectorWidth) const + [[nodiscard]] auto + calcBinaryArithmeticCost(const llvm::TargetTransformInfo &TTI, + unsigned int vectorWidth) const -> RecipThroughputLatency { auto op0info = ins->getOperandInfo(0); auto op1info = ins->getOperandInfo(1); @@ -477,8 +479,8 @@ class Operation { return isFcmp() ? llvm::CmpInst::BAD_FCMP_PREDICATE : llvm::CmpInst::BAD_ICMP_PREDICATE; } - auto calcCmpSelectCost(llvm::TargetTransformInfo &TTI, - unsigned int vectorWidth) const + [[nodiscard]] auto calcCmpSelectCost(const llvm::TargetTransformInfo &TTI, + unsigned int vectorWidth) const -> RecipThroughputLatency { llvm::Type *T = getType(vectorWidth), *cmpT = llvm::CmpInst::makeCmpResultType(T); @@ -493,11 +495,12 @@ class Operation { /// for calculating the cost of a select when merging this instruction with /// another one. - auto selectCost(llvm::TargetTransformInfo &TTI, - unsigned int vectorWidth) const -> llvm::InstructionCost { + [[nodiscard]] auto selectCost(const llvm::TargetTransformInfo &TTI, + unsigned int vectorWidth) const + -> llvm::InstructionCost { return selectCost(TTI, getType(vectorWidth)); } - static auto selectCost(llvm::TargetTransformInfo &TTI, llvm::Type *T) + static auto selectCost(const llvm::TargetTransformInfo &TTI, llvm::Type *T) -> llvm::InstructionCost { llvm::Type *cmpT = llvm::CmpInst::makeCmpResultType(T); // llvm::CmpInst::Predicate pred = @@ -512,7 +515,8 @@ class Operation { llvm::Instruction::Select, T, cmpT, pred, llvm::TargetTransformInfo::TCK_RecipThroughput); } - auto getCastContext(llvm::TargetTransformInfo & /*TTI*/) const + [[nodiscard]] auto + getCastContext(const llvm::TargetTransformInfo & /*TTI*/) const -> llvm::TargetTransformInfo::CastContextHint { if (ins->operandIsLoad() || ins->userIsStore()) return llvm::TargetTransformInfo::CastContextHint::Normal; @@ -521,8 +525,9 @@ class Operation { // TODO: check for whether mask, interleave, or reversed is likely. return llvm::TargetTransformInfo::CastContextHint::None; } - auto calcCastCost(llvm::TargetTransformInfo &TTI, - unsigned int vectorWidth) const -> RecipThroughputLatency { + [[nodiscard]] auto calcCastCost(const llvm::TargetTransformInfo &TTI, + unsigned int vectorWidth) const + -> RecipThroughputLatency { llvm::Type *srcT = cost::getType(getOperand(0)->getType(), vectorWidth), *dstT = getType(vectorWidth); llvm::TargetTransformInfo::CastContextHint ctx = getCastContext(TTI); @@ -533,8 +538,8 @@ class Operation { TTI.getCastInstrCost(idt, dstT, srcT, ctx, llvm::TargetTransformInfo::TCK_Latency)}; } - auto calculateCostFAddFSub(llvm::TargetTransformInfo &TTI, - unsigned int vectorWidth) const + [[nodiscard]] auto calculateCostFAddFSub(const llvm::TargetTransformInfo &TTI, + unsigned int vectorWidth) const -> RecipThroughputLatency { // TODO: allow not assuming hardware FMA support if ((isFMulOrFNegOfFMul(getOperand(0)) || @@ -543,15 +548,15 @@ class Operation { return {}; return calcBinaryArithmeticCost(TTI, vectorWidth); } - auto calculateFNegCost(llvm::TargetTransformInfo &TTI, - unsigned int vectorWidth) const + [[nodiscard]] auto calculateFNegCost(const llvm::TargetTransformInfo &TTI, + unsigned int vectorWidth) const -> RecipThroughputLatency { if (isFMul(getOperand(0)) && ins->allUsersAdditiveContract()) return {}; return calcUnaryArithmeticCost(TTI, vectorWidth); } - [[nodiscard]] auto calcCost(llvm::TargetTransformInfo &TTI, + [[nodiscard]] auto calcCost(const llvm::TargetTransformInfo &TTI, unsigned int vectorWidth) const -> RecipThroughputLatency { switch (getOpCode()) { @@ -647,8 +652,8 @@ class Call { [[nodiscard]] auto getNumOperands() const -> size_t { return ins->getNumOperands(); } - auto calcCallCost(llvm::TargetTransformInfo &TTI, unsigned int vectorWidth) - -> RecipThroughputLatency { + auto calcCallCost(const llvm::TargetTransformInfo &TTI, + unsigned int vectorWidth) -> RecipThroughputLatency { llvm::Type *T = ins->getType(vectorWidth); llvm::SmallVector argTypes; for (auto *op : ins->getOperands()) @@ -663,7 +668,8 @@ class Call { } }; -inline auto Value::getCost(llvm::TargetTransformInfo &TTI, cost::VectorWidth W) +inline auto Value::getCost(const llvm::TargetTransformInfo &TTI, + cost::VectorWidth W) -> cost::RecipThroughputLatency { if (auto *a = llvm::dyn_cast(this)) return a->getCost(TTI, W); invariant(getKind() >= VK_Func); @@ -702,8 +708,8 @@ inline auto Value::getType() const -> llvm::Type * { inline auto Value::getType(unsigned w) const -> llvm::Type * { return cost::getType(getType(), w); } -[[nodiscard]] inline auto Compute::calcCost(llvm::TargetTransformInfo &TTI, - unsigned vectorWidth) +[[nodiscard]] inline auto +Compute::calcCost(const llvm::TargetTransformInfo &TTI, unsigned vectorWidth) -> RecipThroughputLatency { if (auto op = Operation(this)) return op.calcCost(TTI, vectorWidth); if (auto call = Call(this)) return call.calcCallCost(TTI, vectorWidth); diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index 4f493f2df..b5f9c9266 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -18,6 +18,9 @@ #include #include +namespace poly::poly { +class Dependencies; +} // namespace poly::poly namespace poly::IR { using utils::NotNull, utils::invariant, utils::Arena, containers::UList; class Loop; @@ -277,10 +280,12 @@ static_assert(sizeof(Node) == 4 * sizeof(Node *) + 8); /// child: inner (sub) loop /// exit is the associated exit block class Loop : public Node { + enum LegalTransforms { Unknown, None, Unroll, All }; + poly::Loop *affineLoop{nullptr}; Node *last{nullptr}; int32_t edgeId{-1}; - + LegalTransforms legal{Unknown}; // while `child` points to the first contained instruction, // `last` points to the last contained instruction, // and can be used for backwards iteration over the graph. @@ -357,6 +362,8 @@ class Loop : public Node { L = L->getOuterLoop(); return L; } + inline auto getLegality(poly::Dependencies, math::PtrVector) + -> LegalTransforms; }; [[nodiscard]] inline constexpr auto Node::getLoop() const noexcept -> Loop * { if (!parent) return nullptr; @@ -449,7 +456,7 @@ class Value : public Node { [[nodiscard]] inline auto getFastMathFlags() const -> llvm::FastMathFlags; /// these methods are overloaded for specific subtypes - inline auto getCost(llvm::TargetTransformInfo &TTI, cost::VectorWidth W) + inline auto getCost(const llvm::TargetTransformInfo &TTI, cost::VectorWidth W) -> cost::RecipThroughputLatency; [[nodiscard]] inline auto getValue() -> llvm::Value *; [[nodiscard]] inline auto getValue() const -> const llvm::Value *; diff --git a/include/LinearProgramming/LoopBlock.hpp b/include/LinearProgramming/LoopBlock.hpp index 06bcb5a0f..861736725 100644 --- a/include/LinearProgramming/LoopBlock.hpp +++ b/include/LinearProgramming/LoopBlock.hpp @@ -194,6 +194,9 @@ class LoopBlock { [[nodiscard]] constexpr auto getAllocator() -> Arena<> * { return &allocator; } + [[nodiscard]] constexpr auto getDependencies() const -> IR::Dependencies { + return deps; + } private: auto addScheduledNode(IR::Cache &cache, IR::Stow stow, IR::AddrChain addr) @@ -1118,7 +1121,6 @@ class LoopBlock { invariant(false); return 0; } - // // // diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index b29fbbc99..3089aad7c 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -1188,9 +1188,14 @@ inline void IR::Addr::drop(Dependencies deps) { removeFromList(); for (int32_t id : inputEdgeIDs(deps)) deps.removeEdge(Dependence::ID{id}); for (int32_t id : outputEdgeIDs(deps)) deps.removeEdge(Dependence::ID{id}); - arrayP } +inline auto Loop::getLegality(poly::Dependencies deps, + math::PtrVector loopDeps) + -> LegalTransforms { + if (legal != Unknown) return legal; + // TODO: determine legality... +} } // namespace IR namespace poly { diff --git a/include/TurboLoop.hpp b/include/TurboLoop.hpp index c7accfab6..807cbda85 100644 --- a/include/TurboLoop.hpp +++ b/include/TurboLoop.hpp @@ -67,7 +67,6 @@ concept LoadOrStoreInst = std::same_as>; class TurboLoop { - dict::map loopMap; const llvm::TargetLibraryInfo *TLI; const llvm::TargetTransformInfo *TTI; llvm::LoopInfo *LI; @@ -75,6 +74,8 @@ class TurboLoop { llvm::OptimizationRemarkEmitter *ORE; lp::LoopBlock loopBlock{}; IR::Cache instructions{}; + dict::set loopBBs; + dict::set eraseCandidates; CostModeling::CPURegisterFile registers; // this is an allocator that it is safe to reset completely when @@ -163,6 +164,7 @@ class TurboLoop { instructions.addPredicate(A, P, &(*predMapAbridged)); A->setLoopNest(AL); } + loopBBs.insert(BB); } return IR::mergeInstructions(instructions, *predMapAbridged, *TTI, *shortAllocator(), @@ -331,9 +333,14 @@ class TurboLoop { void optimize(IR::TreeResult tr) { // now we build the LinearProgram - lp::OptimizationResult lpor = loopBlock.optimize(instructions, tr); + lp::LoopBlock::OptimizationResult lpor = + loopBlock.optimize(instructions, tr); if (!lpor.nodes) return; - CostModeling::optimize(instructions, loopBlock.getAllocator(), lpor); + for (IR::Addr *addr : lpor.addr.getAddr()) + loopBBs.insert(addr->getBasicBlock()); + CostModeling::optimize(loopBlock.getDependencies(), instructions, loopBBs, + eraseCandidates, loopBlock.getAllocator(), lpor); + loopBBs.clear(); } /* auto isLoopPreHeader(const llvm::BasicBlock *BB) const -> bool { From 0f618d39a093c37f6139e11240fa1a2ea5b80e6d Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Sat, 22 Jul 2023 18:53:56 -0400 Subject: [PATCH 014/112] negligible progress --- include/IR/Node.hpp | 11 ++++++++--- include/Polyhedra/Dependence.hpp | 11 +++++++++-- include/Polyhedra/DependencyPolyhedra.hpp | 1 - 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index b5f9c9266..e3d7da42f 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -4,6 +4,7 @@ #include "IR/InstructionCost.hpp" #include "IR/Users.hpp" #include "Polyhedra/Loops.hpp" +#include "Support/Iterators.hpp" #include "Utilities/Allocators.hpp" #include "Utilities/ListRanges.hpp" #include @@ -280,7 +281,7 @@ static_assert(sizeof(Node) == 4 * sizeof(Node *) + 8); /// child: inner (sub) loop /// exit is the associated exit block class Loop : public Node { - enum LegalTransforms { Unknown, None, Unroll, All }; + enum LegalTransforms { Unknown = 0, None = 1, Unroll = 2, All = 3 }; poly::Loop *affineLoop{nullptr}; Node *last{nullptr}; @@ -291,6 +292,10 @@ class Loop : public Node { // and can be used for backwards iteration over the graph. public: + [[nodiscard]] constexpr auto edges(poly::PtrVector edges) const + -> utils::VForwardRange { + return utils::VForwardRange{edges, edgeId}; + } constexpr Loop(unsigned d) : Node(VK_Loop, d) {} constexpr Loop(unsigned d, poly::Loop *AL) : Node(VK_Loop, d), affineLoop(AL) {} @@ -362,8 +367,8 @@ class Loop : public Node { L = L->getOuterLoop(); return L; } - inline auto getLegality(poly::Dependencies, math::PtrVector) - -> LegalTransforms; + inline auto getLegality(Arena<> *, poly::Dependencies, + math::PtrVector) -> LegalTransforms; }; [[nodiscard]] inline constexpr auto Node::getLoop() const noexcept -> Loop * { if (!parent) return nullptr; diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 3089aad7c..9f2e4118a 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -1190,11 +1190,18 @@ inline void IR::Addr::drop(Dependencies deps) { for (int32_t id : outputEdgeIDs(deps)) deps.removeEdge(Dependence::ID{id}); } -inline auto Loop::getLegality(poly::Dependencies deps, +inline auto Loop::getLegality(Arena<> *alloc, poly::Dependencies deps, math::PtrVector loopDeps) -> LegalTransforms { if (legal != Unknown) return legal; - // TODO: determine legality... + legal = All; + for (int32_t id : edges(loopDeps)) { + poly::DepPoly *dp = deps.depPoly(Dependence::ID{id}); + // the idea here is to check the dep's volume compared to the loop; + // if the dependency is bounded (e.g. at a point), we can scalarize + // that region and parallelize the rest. + } + return legal; } } // namespace IR diff --git a/include/Polyhedra/DependencyPolyhedra.hpp b/include/Polyhedra/DependencyPolyhedra.hpp index df4c6f26d..300a3dbdb 100644 --- a/include/Polyhedra/DependencyPolyhedra.hpp +++ b/include/Polyhedra/DependencyPolyhedra.hpp @@ -1,4 +1,3 @@ - #pragma once #include "IR/Address.hpp" From 3a5a173d78eaf2d07b804b0bc44bd4ea95825931 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Sat, 22 Jul 2023 23:24:48 -0400 Subject: [PATCH 015/112] Start considering how to efficiently summarize options --- include/IR/Node.hpp | 6 +-- include/IR/OptimizationPossibilities.hpp | 59 ++++++++++++++++++++++++ include/Polyhedra/Dependence.hpp | 28 +++++++---- 3 files changed, 82 insertions(+), 11 deletions(-) create mode 100644 include/IR/OptimizationPossibilities.hpp diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index e3d7da42f..318ef55cf 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -281,7 +281,7 @@ static_assert(sizeof(Node) == 4 * sizeof(Node *) + 8); /// child: inner (sub) loop /// exit is the associated exit block class Loop : public Node { - enum LegalTransforms { Unknown = 0, None = 1, Unroll = 2, All = 3 }; + enum LegalTransforms { Unknown, None, DependenceFree, IndexyMismatch }; poly::Loop *affineLoop{nullptr}; Node *last{nullptr}; @@ -367,8 +367,8 @@ class Loop : public Node { L = L->getOuterLoop(); return L; } - inline auto getLegality(Arena<> *, poly::Dependencies, - math::PtrVector) -> LegalTransforms; + inline auto getLegality(poly::Dependencies, math::PtrVector) + -> LegalTransforms; }; [[nodiscard]] inline constexpr auto Node::getLoop() const noexcept -> Loop * { if (!parent) return nullptr; diff --git a/include/IR/OptimizationPossibilities.hpp b/include/IR/OptimizationPossibilities.hpp new file mode 100644 index 000000000..17effe429 --- /dev/null +++ b/include/IR/OptimizationPossibilities.hpp @@ -0,0 +1,59 @@ +#pragma once +#include + +class UnrollOptions { + uint32_t options; // bitmask +public: + constexpr UnrollOptions(uint32_t options) : options(options) {} + static constexpr auto atMost(uint32_t x) -> UnrollOptions { + return {(uint32_t{1} << x) - 1}; + } + [[nodiscard]] constexpr auto allowed(uint32_t x) const -> bool { + return (options & (uint32_t{1} << x)); + } + [[nodiscard]] constexpr auto isDense() const -> bool { + return options == std::numeric_limits::max(); + } + [[nodiscard]] constexpr auto getOptions() const -> uint32_t { + return options; + } + [[nodiscard]] constexpr auto operator&(UnrollOptions other) const + -> UnrollOptions { + return {options & other.options}; + } + constexpr auto operator&=(UnrollOptions other) -> UnrollOptions & { + options &= other.options; + return *this; + } +}; + +class FastVectorization { + uint32_t nonContiguous; // bitmask + uint32_t contiguous; // bitmask, A[i+j,k+l]; multiple may be set +public: + constexpr FastVectorization(uint32_t nonContiguous, uint32_t contiguous) + : nonContiguous(nonContiguous), contiguous(contiguous) {} + [[nodiscard]] constexpr auto getNonContiguous() const -> uint32_t { + return nonContiguous; + } + [[nodiscard]] constexpr auto getContiguous() const -> uint32_t { + return contiguous; + } + [[nodiscard]] constexpr auto operator&(FastVectorization other) const + -> FastVectorization { + uint32_t nonContig = nonContiguous | other.nonContiguous; + return {nonContig, (contiguous & other.contiguous) & ~nonContig}; + } +}; + +/// When we unroll, we have an ordering of the unrolled dimensions. +class RegisterTile { + std::array unroll; // + uint8_t vector; // + uint32_t unrollMask; // bitmask +public: + RegisterTile(std::array unroll, uint8_t vector) + : unroll(unroll), vector(vector) { + unrollMask = (1 << unroll[0]) | (1 << unroll[1]) | (1 << unroll[2]); + } +}; diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 9f2e4118a..5231b34b3 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -1,5 +1,8 @@ #pragma once #include "IR/Address.hpp" +#include "IR/Node.hpp" +#include "Math/Array.hpp" +#include "Math/Comparisons.hpp" #include "Math/Simplex.hpp" #include "Polyhedra/DependencyPolyhedra.hpp" #include "Polyhedra/Loops.hpp" @@ -1190,18 +1193,27 @@ inline void IR::Addr::drop(Dependencies deps) { for (int32_t id : outputEdgeIDs(deps)) deps.removeEdge(Dependence::ID{id}); } -inline auto Loop::getLegality(Arena<> *alloc, poly::Dependencies deps, +using math::StridedVector; +inline auto Loop::getLegality(poly::Dependencies deps, math::PtrVector loopDeps) -> LegalTransforms { if (legal != Unknown) return legal; - legal = All; + if (edgeId < 0) return legal = DependenceFree; + if (this->currentDepth == 0) return legal = None; + ptrdiff_t loop = this->currentDepth - 1; for (int32_t id : edges(loopDeps)) { - poly::DepPoly *dp = deps.depPoly(Dependence::ID{id}); - // the idea here is to check the dep's volume compared to the loop; - // if the dependency is bounded (e.g. at a point), we can scalarize - // that region and parallelize the rest. - } - return legal; + Dependence::ID i{id}; + StridedVector in = deps.input(i)->indexMatrix()(_, loop), + out = deps.output(i)->indexMatrix()(_, loop); + invariant(in.size(), out.size()); + if (in != out) return legal = IndexMismatch; + // ptrdiff_t common = std::min(in.size(), out.size()); + // if ((in[_(0, common)] != out[_(0, common)]) || + // math::anyNEZero(((in.size() > out.size() ? in : out)[_(common, + // end)]))) + // return legal = IndexMismatch; + } + return legal = None; } } // namespace IR From 706d13018265eca73bb6a6fb63ceeb0877ab60d2 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Mon, 24 Jul 2023 09:41:15 -0400 Subject: [PATCH 016/112] Add top sort ids to loops, to assist with mapping to loops --- include/IR/CostModeling.hpp | 39 ++++++++++++--------- include/IR/Node.hpp | 39 +++++++++++++++------ include/IR/OptimizationPossibilities.hpp | 8 ++--- include/LinearProgramming/ScheduledNode.hpp | 3 +- include/Polyhedra/Dependence.hpp | 9 ++--- 5 files changed, 62 insertions(+), 36 deletions(-) diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index f278d73b0..909fee4ad 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -162,8 +162,8 @@ class LoopTree { unsigned depth{0}; // We do not need to know the previous loop, as dependencies between // the `Addr`s and instructions will determine the ordering. - constexpr LoopTree(Arena<> *lalloc, LoopTree *parent_) - : loop{lalloc->create(parent_->depth + 1)}, + constexpr LoopTree(Arena<> *lalloc, poly::Loop *L, LoopTree *parent_) + : loop{lalloc->create(parent_->depth + 1, L)}, depth(parent_->depth + 1) { // allocate the root node, and connect it to parent's node, as well as // previous loop of the same level. @@ -185,10 +185,10 @@ class LoopTree { // We also apply the rotation here. // For dependencies in SCC iteration, only indvar deps get iterated. auto [Pinv, denom] = math::NormalForm::scaledInv(node->getPhi()); - NotNull affloop = + NotNull explicitLoop = node->getLoopNest()->rotate(lalloc, Pinv, node->getOffset()); for (IR::Addr *m : node->localAddr()) { - m->rotate(affloop, Pinv, denom, node->getOffsetOmega(), + m->rotate(explicitLoop, Pinv, denom, node->getOffsetOmega(), node->getOffset()); loop->insertAfter(m); } @@ -206,7 +206,7 @@ class LoopTree { // allocate new nodes and resize children.resize(idx + 1); for (ptrdiff_t i = numChildren; i < idx + 1; ++i) - children[i] = new (salloc) LoopTree{lalloc, this}; + children[i] = new (salloc) LoopTree{lalloc, node->getLoopNest(), this}; numChildren = idx + 1; } children[idx]->addNode(salloc, lalloc, node); @@ -335,6 +335,10 @@ inline auto visitLoopDependent(IR::Dependencies deps, IR::Loop *L, IR::Node *N, if (N->getLoop() == L) body = N->setNext(body); return body; } +struct LoopBuild { + IR::Node *node; + uint32_t count; +}; inline void addBody(IR::Dependencies deps, IR::Loop *root, unsigned depth, IR::Node *nodes) { IR::Exit exit{}; // use to capture last node @@ -346,8 +350,8 @@ inline void addBody(IR::Dependencies deps, IR::Loop *root, unsigned depth, if (last) last->setNext(nullptr); root->setLast(last); } -inline auto topologicalSort(IR::Dependencies deps, IR::Loop *root, - unsigned depth) -> IR::Node * { +inline void topologicalSort(IR::Dependencies deps, IR::Loop *root, + unsigned depth) { // basic plan for the top sort: // We iterate across all users, once all of node's users have been added, // we push it to the front of the list. Thus, we get a top-sorted list. @@ -383,29 +387,32 @@ inline auto topologicalSort(IR::Dependencies deps, IR::Loop *root, for (IR::Node *N : summary.notIndexedByLoop->nodes()) body = visitLoopDependent(deps, root, N, depth, body); // and any remaining edges - return body; } // NOLINTNEXTLINE(misc-no-recursion) -inline auto buildSubGraph(IR::Dependencies deps, IR::Loop *root, unsigned depth) - -> IR::Node * { +inline auto buildSubGraph(IR::Dependencies deps, IR::Loop *root, unsigned depth, + uint32_t id) -> uint32_t { // We build the instruction graph, via traversing the tree, and then // top sorting as we recurse out + root->setMeta(id++); for (IR::Loop *child : root->subLoops()) - buildSubGraph(deps, child, depth + 1); + id = buildSubGraph(deps, child, depth + 1, id); // The very outer `root` needs to have all instr constituents // we also need to add the last instruction of each loop as `last` - return topologicalSort(deps, root, depth); + topologicalSort(deps, root, depth); + return id; } -inline auto buildGraph(IR::Dependencies deps, IR::Loop *root) -> IR::Node * { +inline auto buildGraph(IR::Dependencies deps, IR::Loop *root) -> uint32_t { // We build the instruction graph, via traversing the tree, and then // top sorting as we recurse out - for (IR::Loop *child : root->subLoops()) buildSubGraph(deps, child, 1); + uint32_t id = 0; + for (IR::Loop *child : root->subLoops()) + id = buildSubGraph(deps, child, 1, id); // The very outer `root` needs to have all instr constituents // we also need to add the last instruction of each loop as `last` addBody(deps, root, 0, root->getChild()); - return root; + return id; } inline auto addAddrToGraph(Arena<> *salloc, Arena<> *lalloc, @@ -757,7 +764,7 @@ inline void optimize(IR::Dependencies deps, IR::Cache &instr, // as it allocates the actual nodes. IR::Loop *root = addAddrToGraph(instr.getAllocator(), lalloc, res.nodes); - buildGraph(deps, root); + uint32_t numLoops = buildGraph(deps, root); // `N` is the head of the topologically sorted graph // We now try to remove redundant memory operations diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index 318ef55cf..cd7c49c1f 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -281,24 +281,44 @@ static_assert(sizeof(Node) == 4 * sizeof(Node *) + 8); /// child: inner (sub) loop /// exit is the associated exit block class Loop : public Node { - enum LegalTransforms { Unknown, None, DependenceFree, IndexyMismatch }; - + enum LegalTransforms { + Unknown = 0, + DependenceFree = 1, + IndexMismatch = 2, + None = 3 + }; poly::Loop *affineLoop{nullptr}; Node *last{nullptr}; + /// loopMeta's leading 2 bits give `LegalTransforms` + /// remaining 30 bits give an ID to the loop. + /// IDs are in topologically sorted order. + uint32_t loopMeta; int32_t edgeId{-1}; - LegalTransforms legal{Unknown}; + // LegalTransforms legal{Unknown}; // while `child` points to the first contained instruction, // `last` points to the last contained instruction, // and can be used for backwards iteration over the graph. public: + constexpr void setMeta(uint32_t m) { loopMeta = m; } + [[nodiscard]] constexpr auto getID() const -> uint32_t { + return loopMeta & 0x3FFFFFFF; + } + [[nodiscard]] constexpr auto getLegal() const -> LegalTransforms { + return static_cast(loopMeta >> 30); + } + constexpr auto setLegal(LegalTransforms l) -> LegalTransforms { + loopMeta = (loopMeta & 0x3FFFFFFF) | (static_cast(l) << 30); + return l; + } [[nodiscard]] constexpr auto edges(poly::PtrVector edges) const -> utils::VForwardRange { return utils::VForwardRange{edges, edgeId}; } - constexpr Loop(unsigned d) : Node(VK_Loop, d) {} + constexpr Loop(unsigned d) + : Node{VK_Loop, d}, loopMeta{std::numeric_limits::max()} {} constexpr Loop(unsigned d, poly::Loop *AL) - : Node(VK_Loop, d), affineLoop(AL) {} + : Node{VK_Loop, d}, affineLoop{AL} {} static constexpr auto classof(const Node *v) -> bool { return v->getKind() == VK_Loop; } @@ -321,14 +341,13 @@ class Loop : public Node { } [[nodiscard]] constexpr auto subLoops() const { return utils::ListRange{getSubLoop(), - [](Loop *L) { return L->getNextLoop(); }}; + [](Loop *L) -> Loop * { return L->getNextLoop(); }}; } + /// getLast() + /// Get the last node in the loop. + /// Useful for iterating backwardss. [[nodiscard]] constexpr auto getLast() const -> Node * { return last; } constexpr void setLast(Node *n) { last = n; } - static constexpr auto create(Arena<> *alloc, poly::Loop *AL, size_t depth) - -> Loop * { - return alloc->create(depth, AL); - } [[nodiscard]] constexpr auto getLLVMLoop() const -> llvm::Loop * { return affineLoop->getLLVMLoop(); } diff --git a/include/IR/OptimizationPossibilities.hpp b/include/IR/OptimizationPossibilities.hpp index 17effe429..c92407e55 100644 --- a/include/IR/OptimizationPossibilities.hpp +++ b/include/IR/OptimizationPossibilities.hpp @@ -27,11 +27,11 @@ class UnrollOptions { } }; -class FastVectorization { +class LoopDependencies { uint32_t nonContiguous; // bitmask uint32_t contiguous; // bitmask, A[i+j,k+l]; multiple may be set public: - constexpr FastVectorization(uint32_t nonContiguous, uint32_t contiguous) + constexpr LoopDependencies(uint32_t nonContiguous, uint32_t contiguous) : nonContiguous(nonContiguous), contiguous(contiguous) {} [[nodiscard]] constexpr auto getNonContiguous() const -> uint32_t { return nonContiguous; @@ -39,8 +39,8 @@ class FastVectorization { [[nodiscard]] constexpr auto getContiguous() const -> uint32_t { return contiguous; } - [[nodiscard]] constexpr auto operator&(FastVectorization other) const - -> FastVectorization { + [[nodiscard]] constexpr auto operator&(LoopDependencies other) const + -> LoopDependencies { uint32_t nonContig = nonContiguous | other.nonContiguous; return {nonContig, (contiguous & other.contiguous) & ~nonContig}; } diff --git a/include/LinearProgramming/ScheduledNode.hpp b/include/LinearProgramming/ScheduledNode.hpp index 9f89d9c63..74e394289 100644 --- a/include/LinearProgramming/ScheduledNode.hpp +++ b/include/LinearProgramming/ScheduledNode.hpp @@ -361,8 +361,7 @@ class ScheduledNode { [[nodiscard]] constexpr auto getSchedule() -> poly::AffineSchedule { return {mem}; } - [[nodiscard]] constexpr auto getLoopNest() const - -> NotNull { + [[nodiscard]] constexpr auto getLoopNest() const -> poly::Loop * { return loopNest; } diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 5231b34b3..0db25a18a 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -1197,23 +1197,24 @@ using math::StridedVector; inline auto Loop::getLegality(poly::Dependencies deps, math::PtrVector loopDeps) -> LegalTransforms { + const auto legal = getLegal(); if (legal != Unknown) return legal; - if (edgeId < 0) return legal = DependenceFree; - if (this->currentDepth == 0) return legal = None; + if (edgeId < 0) return setLegal(DependenceFree); + if (this->currentDepth == 0) return setLegal(None); ptrdiff_t loop = this->currentDepth - 1; for (int32_t id : edges(loopDeps)) { Dependence::ID i{id}; StridedVector in = deps.input(i)->indexMatrix()(_, loop), out = deps.output(i)->indexMatrix()(_, loop); invariant(in.size(), out.size()); - if (in != out) return legal = IndexMismatch; + if (in != out) return setLegal(IndexMismatch); // ptrdiff_t common = std::min(in.size(), out.size()); // if ((in[_(0, common)] != out[_(0, common)]) || // math::anyNEZero(((in.size() > out.size() ? in : out)[_(common, // end)]))) // return legal = IndexMismatch; } - return legal = None; + return setLegal(None); } } // namespace IR From 0b5a243a2a2db433e6bf6bc6bc684374afe66bb4 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Wed, 26 Jul 2023 23:25:21 -0400 Subject: [PATCH 017/112] negligible --- include/Dicts/BumpMapSet.hpp | 3 + include/IR/CostModeling.hpp | 25 ++- include/IR/Hash.hpp | 6 +- include/IR/OptimizationPossibilities.hpp | 269 ++++++++++++++++++++++- include/Polyhedra/Dependence.hpp | 1 - 5 files changed, 290 insertions(+), 14 deletions(-) diff --git a/include/Dicts/BumpMapSet.hpp b/include/Dicts/BumpMapSet.hpp index 0254a518b..e8b5c4f65 100644 --- a/include/Dicts/BumpMapSet.hpp +++ b/include/Dicts/BumpMapSet.hpp @@ -2,6 +2,7 @@ #include #include #include +#include namespace poly::dict { @@ -29,4 +30,6 @@ struct aset // NOLINT(readability-identifier-naming) std::equal_to, math::BumpPtrVector>; aset(Arena<> *alloc) : Base{WArena(alloc)} {} }; +static_assert(std::is_trivially_destructible_v); + } // namespace poly::dict diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index 909fee4ad..1655d75d9 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -393,9 +393,9 @@ inline auto buildSubGraph(IR::Dependencies deps, IR::Loop *root, unsigned depth, uint32_t id) -> uint32_t { // We build the instruction graph, via traversing the tree, and then // top sorting as we recurse out - root->setMeta(id++); for (IR::Loop *child : root->subLoops()) id = buildSubGraph(deps, child, depth + 1, id); + root->setMeta(id++); // The very outer `root` needs to have all instr constituents // we also need to add the last instruction of each loop as `last` @@ -484,7 +484,9 @@ class IROptimizer { for (int32_t id : a->outputEdgeIDs(deps, a->getCurrentDepth())) { IR::Addr *b = deps.output(Dependence::ID{id}); // TODO: also check loop extants - if (a->indexMatrix() != b->indexMatrix()) return; + if (a->indexMatrix() != b->indexMatrix() || + a->getOffsetOmega() != b->getOffsetOmega()) + return; if (a->isStore()) { // On a Write->Write, we remove the first write. if (b->isStore()) return a->drop(deps); @@ -507,14 +509,15 @@ class IROptimizer { // load-elimination/stored-val forwarding in `removeRedundantAddr`) // 2. are non-escaping, i.e. `llvm::isNonEscapingLocalObject` // 3. returned by `llvm::isRemovableAlloc` - inline void eliminateTemporaries(IR::AddrChain addr) { + inline auto eliminateTemporaries(IR::AddrChain addr) -> unsigned { auto s = lalloc->scope(); dict::aset loaded{lalloc}; for (IR::Addr *a : addr.getAddr()) if (a->isLoad()) loaded.insert(a); - + unsigned remaining = 0; for (IR::Addr *a : addr.getAddr()) { if (a->isDropped()) continue; + ++remaining; if (loaded.contains(a)) continue; const llvm::SCEVUnknown *ptr = a->getArrayPointer(); auto *call = llvm::dyn_cast(ptr->getValue()); @@ -529,7 +532,9 @@ class IROptimizer { // because we have live `llvm::Instruction`s that we haven't removed yet. // TODO: revisit when handling code generation (and deleting old code) eraseCandidates.insert(call); + --remaining; } + return remaining; } // plan: SCC? Iterate over nodes in program order? @@ -649,13 +654,18 @@ class IROptimizer { IROptimizer(IR::Dependencies deps, IR::Cache &instr, dict::set &loopBBs, dict::set &eraseCandidates_, IR::Loop *root_, - Arena<> *lalloc, lp::LoopBlock::OptimizationResult res) + Arena<> *lalloc, lp::LoopBlock::OptimizationResult res, + uint32_t numLoops) : deps{deps}, instructions{instr}, LBBs{loopBBs}, eraseCandidates{eraseCandidates_}, root{root_}, lalloc{lalloc} { sortEdges(root, 0); removeRedundantAddr(res.addr); - eliminateTemporaries(res.addr); + unsigned numAddr = eliminateTemporaries(res.addr); loopDeps = loopDepSats(lalloc, deps, res); + // plan now is to have a `BitArray` big enough to hold `numLoops` entries + // and `numAddr` rows; final axis is contiguous vs non-contiguous + // Additionally, we will have a vector of unroll strategies to consider + // - } }; @@ -768,7 +778,8 @@ inline void optimize(IR::Dependencies deps, IR::Cache &instr, // `N` is the head of the topologically sorted graph // We now try to remove redundant memory operations - IROptimizer(deps, instr, loopBBs, eraseCandidates, root, lalloc, res); + IROptimizer(deps, instr, loopBBs, eraseCandidates, root, lalloc, res, + numLoops); } /* diff --git a/include/IR/Hash.hpp b/include/IR/Hash.hpp index 7e384075e..b8dd124ea 100644 --- a/include/IR/Hash.hpp +++ b/include/IR/Hash.hpp @@ -37,9 +37,11 @@ template <> struct ankerl::unordered_dense::hash { } }; -template <> struct ankerl::unordered_dense::hash { +template <> +struct ankerl::unordered_dense::hash { using is_avalanching = void; - [[nodiscard]] auto operator()(poly::IR::Identifier const &x) const noexcept + [[nodiscard]] auto + operator()(poly::IR::Instruction::Identifier const &x) const noexcept -> uint64_t { using poly::Hash::combineHash, poly::Hash::getHash; uint64_t seed = getHash(x.kind); diff --git a/include/IR/OptimizationPossibilities.hpp b/include/IR/OptimizationPossibilities.hpp index c92407e55..849f41932 100644 --- a/include/IR/OptimizationPossibilities.hpp +++ b/include/IR/OptimizationPossibilities.hpp @@ -1,5 +1,231 @@ #pragma once +#include "Dicts/BumpMapSet.hpp" +#include "IR/Address.hpp" +#include "IR/Hash.hpp" +#include +#include +#include +#include +#include +#include #include +#include + +namespace poly::CostModeling { +using math::MutPtrVector, math::DensePtrMatrix; +struct ArrayIndex { + const llvm::SCEVUnknown *array; + DensePtrMatrix index; + ArrayIndex(IR::Addr *a) + : array{a->getArrayPointer()}, index{a->indexMatrix()} {} + constexpr auto operator==(const ArrayIndex &) const -> bool = default; +}; + +} // namespace poly::CostModeling +template <> +struct ankerl::unordered_dense::hash { + using is_avalanching = void; + [[nodiscard]] auto + operator()(poly::CostModeling::ArrayIndex const &x) const noexcept + -> uint64_t { + using poly::Hash::combineHash, poly::Hash::getHash; + uint64_t seed = getHash(x.array); + seed = combineHash(seed, getHash(ptrdiff_t{x.index.numRow()})); + seed = combineHash(seed, getHash(ptrdiff_t{x.index.numCol()})); + // Maybe use a faster hash? + for (int64_t y : x.index) seed = combineHash(seed, getHash(y)); + return seed; + } +}; +/// It would be best to actually use the tree structure +/// Let's consider a depth first search approach. +/// A(9) --> B(3) --> C(2) --> D(0) +/// \-> E(5) --> F(4) \-> G(1) +/// \-> H(8) --> I(7) --> J(6) +/// At a given level, we do need to decide whether to unroll and vectorize, +/// using context of both upper and lower levels. Thus, it is a non-local +/// decision that doesn't map well to a single traversal. +/// +/// Many optimal optimization possibilities however are orthogonal with one +/// another, so it would be wasteful to consider the full cartesian product. +/// +/// At each loopnest level, we could consider not unrolling or vectorizing that +/// or any outer level, and then optimize all subtrees independently. When +/// considering these subtrees together, we must always consider them with at +/// least one of this level or an outer level unrolled and/or vectorized. +/// +/// One consideration pattern: +/// [!D], [D], [!G, G], [C, !D, !G], [C, D, !G], [C, !D, G], [C, D, G], +/// [B, C, !D, !G], [B, C, D, !G], [B, C, !D, G], [B, C, D, G]. +/// [B, !C, !D, !G], [B, !C, D, !G], [B, !C, !D, G], [B, !C, D, G] +/// etc +/// So it doesn't cut down much. +/// Note (of course) that we're not considering all of these possibilities; +/// these are the fast ones we're willing to consider at a particular time. +/// +/// We can have contiguous indices giving the range that an optimization +/// possibilities applies to. E.g., if we're at `3` when we reach a loop, we +/// have [3, curr] (i.e., a close-close range). +/// +/// We only need to track the best alg of each subtree, and compare that of the +/// current root. The current root then returns the current best alg: either +/// it's opt, or the composition of the subtrees. The recursion continues until +/// we get the best alg for the whole tree. +namespace poly::CostModeling { + +class AddrSummary { + IR::Addr *addr; + uint64_t minStaticStride; + uint64_t *data; + unsigned numLoops; + [[nodiscard]] constexpr auto numLoopWords() const -> size_t { + return (numLoops + 63) / 64; + } + +public: + constexpr AddrSummary(IR::Addr *addr, uint64_t minStaticStride, + uint64_t *data, unsigned numLoops) + : addr(addr), minStaticStride(minStaticStride), data(data), + numLoops(numLoops) {} + [[nodiscard]] constexpr auto getAddr() const -> IR::Addr * { return addr; } + [[nodiscard]] constexpr auto getMinStaticStride() const -> uint64_t { + return minStaticStride; + } + constexpr auto minStaticStrideLoops() + -> containers::BitSet> { + math::MutPtrVector v{data, numLoopWords()}; + return containers::BitSet>{v}; + } + constexpr auto remainingLoops() + -> containers::BitSet> { + size_t nL = numLoopWords(); + math::MutPtrVector v{data + nL, nL}; + return containers::BitSet>{v}; + } + constexpr auto getAddr() -> IR::Addr * { return addr; } +}; + +class OptimizationOptions; +/// 3-d array, numAddr x (2 x cld(numLoops,64) + 1) +/// The `1` is a static multiplier (e.g. 2) on strides +/// We store the minimum-static rank dependency of each addr, +/// the static rank, and the remaining dependencies. +/// +/// We also want to collect addrs corresponding to arrays, to find +/// unroll possibilities. +class LoopDependencies { + dict::amap addrMap; + /// the chain is for mappings of indices w/in LoopDependencies + unsigned numLoops; + unsigned numAddr; + uint32_t offset{0}; + // data is an array of `AddrSummary`, and then a chain of length `numAddr` + // giving the position among `AddrSummary` of the next in the chain +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpedantic" +#else +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wc99-extensions" +#endif + char data[]; // NOLINT(modernize-avoid-c-arrays) +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#else +#pragma clang diagnostic pop +#endif + + static constexpr auto bytesPerAddr(unsigned numLoops) -> size_t { + return (2 * ((numLoops + 63) / 64) + 1) * sizeof(uint64_t) + + sizeof(IR::Addr *); + } + +public: + LoopDependencies(Arena<> *alloc, unsigned numLoops, unsigned numAddr) + : addrMap(alloc), numLoops(numLoops), numAddr(numAddr) {} + + LoopDependencies(const LoopDependencies &) = default; + static auto create(utils::Arena<> *alloc, unsigned numLoops, unsigned numAddr) + -> LoopDependencies * { + + size_t size = + size_t(numAddr) * (bytesPerAddr(numLoops) + sizeof(uint32_t)) + + sizeof(LoopDependencies); + void *data = alloc->allocate(size); + char *p = static_cast(data); + std::fill(p + sizeof(LoopDependencies), p + size, 0); + auto *ldp = static_cast(data); + return std::construct_at(ldp, alloc, numLoops, numAddr); + } + constexpr auto subTree() -> uint32_t { + return std::exchange(offset, numAddr); + } + constexpr void resetTree(uint32_t newOffset) { offset = newOffset; } + constexpr auto operator[](size_t i) -> AddrSummary { + utils::invariant(i < numAddr); + char *base = data + i * bytesPerAddr(numLoops); + void *addr = base; + void *stride = base + sizeof(IR::Addr *); + void *bits = base + sizeof(IR::Addr *) + sizeof(uint64_t); + return {*static_cast(addr), *static_cast(stride), + static_cast(bits), numLoops}; + } + [[nodiscard]] constexpr auto size() const -> ptrdiff_t { return numAddr; } + class Iterator { + LoopDependencies *deps; + ptrdiff_t i; + + public: + constexpr Iterator(LoopDependencies *deps, ptrdiff_t i) + : deps(deps), i(i) {} + constexpr auto operator*() -> AddrSummary { return (*deps)[i]; } + + constexpr auto operator++() -> Iterator & { + ++i; + return *this; + } + constexpr auto operator!=(Iterator other) const -> bool { + return i != other.i; + } + constexpr auto operator++(int) -> Iterator { + Iterator tmp = *this; + ++*this; + return tmp; + } + constexpr auto operator-(Iterator other) const -> ptrdiff_t { + return i - other.i; + } + constexpr auto operator--() -> Iterator & { + --i; + return *this; + } + constexpr auto operator--(int) -> Iterator { + Iterator tmp = *this; + --*this; + return tmp; + } + }; + constexpr auto begin() -> Iterator { return {this, 0}; } + constexpr auto end() -> Iterator { return {this, size()}; } + // adding an Addr should adds unroll options + inline constexpr void + addAddr(utils::Arena<> *, math::ResizeableView, + IR::Addr *); +}; + +/// What we want is a map from {array,indexMatrix()} pairs to +/// all Addrs with that `indexMatrix()`; +/// the `all Addrs with that `indexMatrix()`` can be achieved via +/// an integer index into a vector representing chains. +/// +/// We can carry an offset for use in filtering `Addr`s when +/// restricting ourselves to a particular subtree. +/// +class ArrayCollection { + +public: + // iterate over... +}; class UnrollOptions { uint32_t options; // bitmask @@ -27,11 +253,45 @@ class UnrollOptions { } }; -class LoopDependencies { +// the accumulated set of unroll and vectorization options +// that we can search later. +class OptimizationOptions { + std::array unrollOptions; + std::array loopIDs; + // bounds on the applicable region + uint16_t lower; + uint16_t upper; + uint16_t vecid; + +public: + [[nodiscard]] constexpr auto vectorize() const -> bool { + return vecid != std::numeric_limits::max(); + } + [[nodiscard]] constexpr auto getVecID() const -> uint16_t { return vecid; } + [[nodiscard]] constexpr auto getRange() const + -> math::Range { + return {lower, upper}; + } +}; + +// Here, we scan the addr so far, +// I think we should have sub-tree ref sets. +inline constexpr void LoopDependencies::addAddr( + utils::Arena<> *alloc, + math::ResizeableView optops, IR::Addr *a) { + for (AddrSummary s : *this) { + if (s.getAddr() == a) { + // check for patterns like `A[i,2*j], A[i,2*j + 1]` + // + } + } +} + +class ContigSummary { uint32_t nonContiguous; // bitmask uint32_t contiguous; // bitmask, A[i+j,k+l]; multiple may be set public: - constexpr LoopDependencies(uint32_t nonContiguous, uint32_t contiguous) + constexpr ContigSummary(uint32_t nonContiguous, uint32_t contiguous) : nonContiguous(nonContiguous), contiguous(contiguous) {} [[nodiscard]] constexpr auto getNonContiguous() const -> uint32_t { return nonContiguous; @@ -39,8 +299,8 @@ class LoopDependencies { [[nodiscard]] constexpr auto getContiguous() const -> uint32_t { return contiguous; } - [[nodiscard]] constexpr auto operator&(LoopDependencies other) const - -> LoopDependencies { + [[nodiscard]] constexpr auto operator&(ContigSummary other) const + -> ContigSummary { uint32_t nonContig = nonContiguous | other.nonContiguous; return {nonContig, (contiguous & other.contiguous) & ~nonContig}; } @@ -57,3 +317,4 @@ class RegisterTile { unrollMask = (1 << unroll[0]) | (1 << unroll[1]) | (1 << unroll[2]); } }; +} // namespace poly::CostModeling diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 0db25a18a..73517587d 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -2,7 +2,6 @@ #include "IR/Address.hpp" #include "IR/Node.hpp" #include "Math/Array.hpp" -#include "Math/Comparisons.hpp" #include "Math/Simplex.hpp" #include "Polyhedra/DependencyPolyhedra.hpp" #include "Polyhedra/Loops.hpp" From 7c698a7281a8ff5b2a7487c5a2d31dbddfd79f9b Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Thu, 27 Jul 2023 15:56:24 -0400 Subject: [PATCH 018/112] negligible progress --- include/IR/CostModeling.hpp | 3 +- include/IR/OptimizationPossibilities.hpp | 85 +++++++++++++++++++----- 2 files changed, 71 insertions(+), 17 deletions(-) diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index 1655d75d9..be3eff993 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -4,6 +4,7 @@ #include "Dicts/BumpMapSet.hpp" #include "Graphs/Graphs.hpp" #include "IR/Address.hpp" +#include "IR/OptimizationPossibilities.hpp" #include "LinearProgramming/LoopBlock.hpp" #include "LinearProgramming/ScheduledNode.hpp" #include "Polyhedra/Dependence.hpp" @@ -665,7 +666,7 @@ class IROptimizer { // plan now is to have a `BitArray` big enough to hold `numLoops` entries // and `numAddr` rows; final axis is contiguous vs non-contiguous // Additionally, we will have a vector of unroll strategies to consider - // - + LoopDependencies *ld = LoopDependencies::create(lalloc, numLoops, numAddr); } }; diff --git a/include/IR/OptimizationPossibilities.hpp b/include/IR/OptimizationPossibilities.hpp index 849f41932..6c0ac1b87 100644 --- a/include/IR/OptimizationPossibilities.hpp +++ b/include/IR/OptimizationPossibilities.hpp @@ -2,6 +2,7 @@ #include "Dicts/BumpMapSet.hpp" #include "IR/Address.hpp" #include "IR/Hash.hpp" +#include "Support/Iterators.hpp" #include #include #include @@ -9,6 +10,7 @@ #include #include #include +#include #include namespace poly::CostModeling { @@ -16,6 +18,7 @@ using math::MutPtrVector, math::DensePtrMatrix; struct ArrayIndex { const llvm::SCEVUnknown *array; DensePtrMatrix index; + ArrayIndex(IR::Addr *a) : array{a->getArrayPointer()}, index{a->indexMatrix()} {} constexpr auto operator==(const ArrayIndex &) const -> bool = default; @@ -114,11 +117,12 @@ class OptimizationOptions; /// We also want to collect addrs corresponding to arrays, to find /// unroll possibilities. class LoopDependencies { - dict::amap addrMap; + dict::amap addrMap; /// the chain is for mappings of indices w/in LoopDependencies unsigned numLoops; - unsigned numAddr; - uint32_t offset{0}; + unsigned maxAddr; + unsigned numAddr{0}; + int32_t offset{0}; // data is an array of `AddrSummary`, and then a chain of length `numAddr` // giving the position among `AddrSummary` of the next in the chain #if !defined(__clang__) && defined(__GNUC__) @@ -148,20 +152,17 @@ class LoopDependencies { static auto create(utils::Arena<> *alloc, unsigned numLoops, unsigned numAddr) -> LoopDependencies * { - size_t size = - size_t(numAddr) * (bytesPerAddr(numLoops) + sizeof(uint32_t)) + - sizeof(LoopDependencies); + size_t size = size_t(numAddr) * (bytesPerAddr(numLoops) + sizeof(int32_t)) + + sizeof(LoopDependencies); void *data = alloc->allocate(size); char *p = static_cast(data); std::fill(p + sizeof(LoopDependencies), p + size, 0); auto *ldp = static_cast(data); return std::construct_at(ldp, alloc, numLoops, numAddr); } - constexpr auto subTree() -> uint32_t { - return std::exchange(offset, numAddr); - } - constexpr void resetTree(uint32_t newOffset) { offset = newOffset; } - constexpr auto operator[](size_t i) -> AddrSummary { + constexpr auto subTree() -> int32_t { return std::exchange(offset, numAddr); } + constexpr void resetTree(int32_t newOffset) { offset = newOffset; } + constexpr auto operator[](ptrdiff_t i) -> AddrSummary { utils::invariant(i < numAddr); char *base = data + i * bytesPerAddr(numLoops); void *addr = base; @@ -205,12 +206,48 @@ class LoopDependencies { return tmp; } }; - constexpr auto begin() -> Iterator { return {this, 0}; } + constexpr auto begin() -> Iterator { return {this, offset}; } constexpr auto end() -> Iterator { return {this, size()}; } + constexpr auto findShared(IR::Addr *a) -> std::pair * { + return addrMap.find(ArrayIndex{a}); + } + // constexpr auto getShared(IR::Addr *a) -> int32_t & { + // return addrMap[ArrayIndex{a}]; + // } + [[nodiscard]] constexpr auto sharedChain() -> int32_t * { + void *p = data + maxAddr * bytesPerAddr(numLoops); + return static_cast(p); + } + /// calls `f` with `this` and an iterator over a set of + /// array pointers that share `indexMatrix` + void evalCollections(const auto &f) { + int32_t *p = sharedChain(); + for (auto [s, i] : addrMap) { + if ((i < offset) || (p[i] < offset)) continue; + f(this, utils::VForwardRange{p, i}); + } + } + // constexpr auto hasMultiple(IR::Addr *a) -> bool { + // auto *f = findShared(a); + // if (!f) return false; + + // } + constexpr auto sharedIndex(IR::Addr *a) -> utils::VForwardRange { + auto *f = findShared(a); + if (f == addrMap.end()) return utils::VForwardRange{nullptr, -1}; + + return utils::VForwardRange{sharedChain(), f->second}; + } + constexpr auto commonIndices(IR::Addr *a) { + return sharedIndex(a) | + std::views::filter([=](int32_t i) -> bool { return i >= offset; }) | + std::views::transform( + [this](int32_t i) -> AddrSummary { return (*this)[i]; }); + } // adding an Addr should adds unroll options inline constexpr void - addAddr(utils::Arena<> *, math::ResizeableView, - IR::Addr *); + addAddr(utils::Arena<> *, + math::ResizeableView &, IR::Addr *); }; /// What we want is a map from {array,indexMatrix()} pairs to @@ -278,11 +315,27 @@ class OptimizationOptions { // I think we should have sub-tree ref sets. inline constexpr void LoopDependencies::addAddr( utils::Arena<> *alloc, - math::ResizeableView optops, IR::Addr *a) { + math::ResizeableView &optops, IR::Addr *a) { + auto *f = findShared(a); + if (f && f->second >= offset) return; // already added + + bool foundMatchInd = false; + for (AddrSummary s : commonIndices(a)) { + IR::Addr *b = s.getAddr(); + // we share the same array and IndexMatrix + // check for patterns like `A[i,2*j], A[i,2*j + 1]` + // if we're not part of the same BB + if ((a->getParent() != b->getParent()) || (a->isLoad() != b->isLoad())) + continue; + // we can check top positions + invariant(a->getTopPosition() > b->getTopPosition()); + // note that outputEdgeIDs are sorted; can we use this to check for + // no intervening edges? + } + if (foundMatchInd) return; // already added this `indexMatrix` for (AddrSummary s : *this) { if (s.getAddr() == a) { // check for patterns like `A[i,2*j], A[i,2*j + 1]` - // } } } From 44d5a82cc54d2908222739a3e418cf1429e8d2be Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Fri, 28 Jul 2023 12:32:42 -0400 Subject: [PATCH 019/112] minor progress on addAddr --- include/IR/OptimizationPossibilities.hpp | 97 +++++++++++++++++++----- 1 file changed, 76 insertions(+), 21 deletions(-) diff --git a/include/IR/OptimizationPossibilities.hpp b/include/IR/OptimizationPossibilities.hpp index 6c0ac1b87..580194a59 100644 --- a/include/IR/OptimizationPossibilities.hpp +++ b/include/IR/OptimizationPossibilities.hpp @@ -2,6 +2,7 @@ #include "Dicts/BumpMapSet.hpp" #include "IR/Address.hpp" #include "IR/Hash.hpp" +#include "Math/GreatestCommonDivisor.hpp" #include "Support/Iterators.hpp" #include #include @@ -75,37 +76,55 @@ struct ankerl::unordered_dense::hash { /// it's opt, or the composition of the subtrees. The recursion continues until /// we get the best alg for the whole tree. namespace poly::CostModeling { +using math::end, math::last; +constexpr auto cld64(unsigned x) -> unsigned { return (x + 63) / 64; } class AddrSummary { IR::Addr *addr; uint64_t minStaticStride; uint64_t *data; - unsigned numLoops; - [[nodiscard]] constexpr auto numLoopWords() const -> size_t { - return (numLoops + 63) / 64; - } + unsigned words; public: constexpr AddrSummary(IR::Addr *addr, uint64_t minStaticStride, uint64_t *data, unsigned numLoops) : addr(addr), minStaticStride(minStaticStride), data(data), - numLoops(numLoops) {} + words(cld64(numLoops)) {} [[nodiscard]] constexpr auto getAddr() const -> IR::Addr * { return addr; } [[nodiscard]] constexpr auto getMinStaticStride() const -> uint64_t { return minStaticStride; } - constexpr auto minStaticStrideLoops() + static constexpr auto minStaticStrideLoops(uint64_t *data, unsigned words) -> containers::BitSet> { - math::MutPtrVector v{data, numLoopWords()}; + math::MutPtrVector v{data, words}; return containers::BitSet>{v}; } - constexpr auto remainingLoops() + static constexpr auto remainingLoops(uint64_t *data, unsigned words) -> containers::BitSet> { - size_t nL = numLoopWords(); - math::MutPtrVector v{data + nL, nL}; + math::MutPtrVector v{data + words, words}; return containers::BitSet>{v}; } + constexpr auto minStaticStrideLoops() + -> containers::BitSet> { + return minStaticStrideLoops(data, words); + } + constexpr auto remainingLoops() + -> containers::BitSet> { + return remainingLoops(data, words); + } constexpr auto getAddr() -> IR::Addr * { return addr; } + constexpr void copyTo(char *dst) { + void *paddr = dst; + void *stride = dst + sizeof(IR::Addr *); + void *bits = dst + sizeof(IR::Addr *) + sizeof(uint64_t); + *static_cast(paddr) = addr; + *static_cast(stride) = minStaticStride; + std::copy_n(data, 2 * words, static_cast(bits)); + } + constexpr auto setAddr(IR::Addr *a) -> AddrSummary & { + addr = a; + return *this; + } }; class OptimizationOptions; @@ -120,8 +139,8 @@ class LoopDependencies { dict::amap addrMap; /// the chain is for mappings of indices w/in LoopDependencies unsigned numLoops; - unsigned maxAddr; - unsigned numAddr{0}; + int32_t maxAddr; + int32_t numAddr{0}; int32_t offset{0}; // data is an array of `AddrSummary`, and then a chain of length `numAddr` // giving the position among `AddrSummary` of the next in the chain @@ -143,10 +162,24 @@ class LoopDependencies { return (2 * ((numLoops + 63) / 64) + 1) * sizeof(uint64_t) + sizeof(IR::Addr *); } + struct AddrReference { + IR::Addr **addr; + uint64_t *stride; + uint64_t *bits; + }; + constexpr auto addrRef(ptrdiff_t i) -> AddrReference { + utils::invariant(i < numAddr); + char *base = data + i * bytesPerAddr(numLoops); + void *addr = base; + void *stride = base + sizeof(IR::Addr *); + void *bits = base + sizeof(IR::Addr *) + sizeof(uint64_t); + return {static_cast(addr), static_cast(stride), + static_cast(bits)}; + } public: LoopDependencies(Arena<> *alloc, unsigned numLoops, unsigned numAddr) - : addrMap(alloc), numLoops(numLoops), numAddr(numAddr) {} + : addrMap(alloc), numLoops(numLoops), numAddr(int32_t(numAddr)) {} LoopDependencies(const LoopDependencies &) = default; static auto create(utils::Arena<> *alloc, unsigned numLoops, unsigned numAddr) @@ -163,13 +196,8 @@ class LoopDependencies { constexpr auto subTree() -> int32_t { return std::exchange(offset, numAddr); } constexpr void resetTree(int32_t newOffset) { offset = newOffset; } constexpr auto operator[](ptrdiff_t i) -> AddrSummary { - utils::invariant(i < numAddr); - char *base = data + i * bytesPerAddr(numLoops); - void *addr = base; - void *stride = base + sizeof(IR::Addr *); - void *bits = base + sizeof(IR::Addr *) + sizeof(uint64_t); - return {*static_cast(addr), *static_cast(stride), - static_cast(bits), numLoops}; + AddrReference ref = addrRef(i); + return {*(ref.addr), *(ref.stride), ref.bits, numLoops}; } [[nodiscard]] constexpr auto size() const -> ptrdiff_t { return numAddr; } class Iterator { @@ -244,6 +272,11 @@ class LoopDependencies { std::views::transform( [this](int32_t i) -> AddrSummary { return (*this)[i]; }); } + constexpr void push(AddrSummary s) { + invariant(numAddr < maxAddr); + s.copyTo(data + (numAddr++) * bytesPerAddr(numLoops)); + } + // adding an Addr should adds unroll options inline constexpr void addAddr(utils::Arena<> *, @@ -316,8 +349,30 @@ class OptimizationOptions { inline constexpr void LoopDependencies::addAddr( utils::Arena<> *alloc, math::ResizeableView &optops, IR::Addr *a) { + int32_t id = numAddr; + // something to think about here is how to handle the mix of `Addr` reference + // as pointers, vs `Addr` references as indices into a vector. auto *f = findShared(a); - if (f && f->second >= offset) return; // already added + size_t bpa = bytesPerAddr(numLoops); + if (f) { + push((*this)[f->second].setAddr(a)); + std::copy_n(data + bpa * f->second, bpa, data + bpa * id); + if (f && f->second >= offset) return; + // TODO: add it to opt results + return; + } + ++numAddr; + AddrReference ref = addrRef(id); + *ref.addr = a; + // calc minStaticStride + DensePtrMatrix indMat = a->indexMatrix(); // dim x loop + uint64_t minStaticStride = std::numeric_limits::max(); + for (ptrdiff_t i = ptrdiff_t{indMat.numCol()}; i--;) + if (int64_t x = indMat(last, i)) + minStaticStride = + std::min(minStaticStride, math::constexpr_abs(x)); + + // TODO: create `AddrSummary` and optResults bool foundMatchInd = false; for (AddrSummary s : commonIndices(a)) { From 611536c1c080cf6153779b74c426111b7b37ef90 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Fri, 28 Jul 2023 17:08:25 -0400 Subject: [PATCH 020/112] minor progress --- include/IR/OptimizationPossibilities.hpp | 132 ++++++++++++++++++----- 1 file changed, 104 insertions(+), 28 deletions(-) diff --git a/include/IR/OptimizationPossibilities.hpp b/include/IR/OptimizationPossibilities.hpp index 580194a59..9cc2dee19 100644 --- a/include/IR/OptimizationPossibilities.hpp +++ b/include/IR/OptimizationPossibilities.hpp @@ -15,6 +15,67 @@ #include namespace poly::CostModeling { + +class LoopIndexDependency { + // for (j : J){ + // b = B[j]; + // for (i : I) f(A[i], b); + // } + // In this example, if `j` and `i` have the same stride category, + // we'd want to add the option to unroll and vectorize `j` + // If `i` has a small static stride and `j` does not, we'd want + // to add the option to vectorize `i` (while still unrolling `j`) + // + // Another thing to consider with optimization options is that we may + // want to be able to combine separate ones; do we need some + // indicator of what we would like to discourage? + // + // Nested: benefit from unrolling + // Non-static stride: penalize vectorization + // + // + // Mappings: + // A[i] in j, B[j] in i => i,j; + // A[i] in j, B[j] in !i => j; + // A[i] in !j, B[j] in i => i; + // A[i] in !j, B[j] in !i => {}; + + // A[i,j], B[j] in i => i; + // A[i,j], B[j] in !i => {}; + // A[i] in j, B[j,i] => j; + // A[i] in !j, B[j,i] => {}; + // A[i,j], B[j,i] => {}; + + // An access only benefits from a loop it is nested inside but doesn't depend + // on being unrolled. + // How can we do the mapping? + // Nested and dynamic or small static -> benefit from unrolling + // + // For now, we'll use 4 bits per... + uint64_t *data; + unsigned words; + // 4 bits/loop + // 64 bits/word + static constexpr unsigned numBits = 4; // wasteful + static constexpr unsigned numLoopsPerUInt = 64 / numBits; + [[nodiscard]] static constexpr auto numWords(unsigned numLoops) -> unsigned { + return (numLoops + numLoopsPerUInt - 1) / numLoopsPerUInt; + } + static constexpr auto numberToShift(uint64_t x) -> unsigned { + return std::countr_zero(x) & ~(numBits - 1); + } + +public: + constexpr LoopIndexDependency(uint64_t *data, unsigned numLoops) + : data{data}, words{numWords(numLoops)} {} + enum class DependencyType { + Independent = 0, // 000 // + Nested = 1, // 001 // cheap to vectorize + Dynamic = 2, // 010 // expensive to vectorize + SmallStatic = 4 // 100 // cheap to vectorize + }; +}; + using math::MutPtrVector, math::DensePtrMatrix; struct ArrayIndex { const llvm::SCEVUnknown *array; @@ -159,8 +220,7 @@ class LoopDependencies { #endif static constexpr auto bytesPerAddr(unsigned numLoops) -> size_t { - return (2 * ((numLoops + 63) / 64) + 1) * sizeof(uint64_t) + - sizeof(IR::Addr *); + return (2 * cld64(numLoops) + 1) * sizeof(uint64_t) + sizeof(IR::Addr *); } struct AddrReference { IR::Addr **addr; @@ -281,6 +341,10 @@ class LoopDependencies { inline constexpr void addAddr(utils::Arena<> *, math::ResizeableView &, IR::Addr *); + inline constexpr void + addOptOption(utils::Arena<> *, + math::ResizeableView &, + AddrSummary); }; /// What we want is a map from {array,indexMatrix()} pairs to @@ -355,10 +419,11 @@ inline constexpr void LoopDependencies::addAddr( auto *f = findShared(a); size_t bpa = bytesPerAddr(numLoops); if (f) { - push((*this)[f->second].setAddr(a)); + AddrSummary s = (*this)[f->second].setAddr(a); + push(s); std::copy_n(data + bpa * f->second, bpa, data + bpa * id); if (f && f->second >= offset) return; - // TODO: add it to opt results + addOptOption(alloc, optops, s); return; } ++numAddr; @@ -366,33 +431,44 @@ inline constexpr void LoopDependencies::addAddr( *ref.addr = a; // calc minStaticStride DensePtrMatrix indMat = a->indexMatrix(); // dim x loop + // we want mapping from `indMat` index to loop index uint64_t minStaticStride = std::numeric_limits::max(); - for (ptrdiff_t i = ptrdiff_t{indMat.numCol()}; i--;) - if (int64_t x = indMat(last, i)) - minStaticStride = - std::min(minStaticStride, math::constexpr_abs(x)); - - // TODO: create `AddrSummary` and optResults - - bool foundMatchInd = false; - for (AddrSummary s : commonIndices(a)) { - IR::Addr *b = s.getAddr(); - // we share the same array and IndexMatrix - // check for patterns like `A[i,2*j], A[i,2*j + 1]` - // if we're not part of the same BB - if ((a->getParent() != b->getParent()) || (a->isLoad() != b->isLoad())) - continue; - // we can check top positions - invariant(a->getTopPosition() > b->getTopPosition()); - // note that outputEdgeIDs are sorted; can we use this to check for - // no intervening edges? - } - if (foundMatchInd) return; // already added this `indexMatrix` - for (AddrSummary s : *this) { - if (s.getAddr() == a) { - // check for patterns like `A[i,2*j], A[i,2*j + 1]` + auto minStaticStrideLoops = + AddrSummary::minStaticStrideLoops(ref.bits, cld64(numLoops)); + auto remainingLoops = AddrSummary::remainingLoops(ref.bits, cld64(numLoops)); + IR::Loop *L = a->getLoop(); + for (ptrdiff_t l = ptrdiff_t{indMat.numCol()}; l--; L = L->getLoop()) { + uint32_t lid = L->getID(); + for (ptrdiff_t j = 0; j < ptrdiff_t{indMat.numRow()} - 1; ++j) + if (indMat(j, l)) remainingLoops.insert(lid); + if (int64_t x = indMat(last, l)) { + uint64_t absx = math::constexpr_abs(x); + if (minStaticStride > absx) { + minStaticStride = absx; + remainingLoops |= minStaticStrideLoops; + minStaticStrideLoops.clear(); + minStaticStrideLoops.insert(lid); + } else if (minStaticStride == absx) { + minStaticStrideLoops.insert(lid); + } else { + remainingLoops.insert(lid); + } } } + *ref.stride = minStaticStride; + addOptOption(alloc, optops, {a, minStaticStride, ref.bits, numLoops}); +} + +inline constexpr void LoopDependencies::addOptOption( + utils::Arena<> *alloc, + math::ResizeableView &optops, AddrSummary s) { + // scan older `AddrSummary`s, compare with `s` + for (ptrdiff_t i = 0; i < numAddr - 1; ++i) { + AddrSummary o = (*this)[i]; + // to identify tiling opportunities...we need to know which loops `s` and + // `o` are actually both nested inside. + // + } } class ContigSummary { From e593765ec6a9ec5c882237f2ad45adcae9c5a179 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Sat, 29 Jul 2023 14:09:29 -0400 Subject: [PATCH 021/112] negligible progress --- include/IR/Node.hpp | 24 ------------- include/IR/OptimizationPossibilities.hpp | 46 ++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 24 deletions(-) diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index cd7c49c1f..438b603f3 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -444,30 +444,6 @@ class Value : public Node { users.push_back(alloc, I); } constexpr void removeFromUsers(Instruction *I) { users.remove(I); } - // unionPtr methods - // [[nodiscard]] constexpr auto getUsers() const - // -> const UList * { - // invariant(kind == VK_Load || kind >= VK_Func); - // return unionPtr.users; - // } - // [[nodiscard]] constexpr auto getUsers() -> UList * { - // invariant(kind == VK_Load || kind >= VK_Func); - // return unionPtr.users; - // } - // constexpr void setUsers(UList *users) { - // invariant(kind == VK_Load || kind >= VK_Func); - // unionPtr.users = users; - // } - // constexpr void addUser(Arena<> *alloc, Instruction *n) { - // invariant(kind == VK_Load || kind >= VK_Func); - // if (!unionPtr.users) - // unionPtr.users = alloc->create>(n); - // else unionPtr.users = unionPtr.users->pushUnique(alloc, n); - // } - // constexpr void removeFromUsers(Instruction *n) { - // invariant(kind == VK_Load || kind >= VK_Func); - // unionPtr.users->eraseUnordered(n); - // } /// isStore() is true if the address is a store, false if it is a load /// If the memory access is a store, this can still be a reload diff --git a/include/IR/OptimizationPossibilities.hpp b/include/IR/OptimizationPossibilities.hpp index 9cc2dee19..7b878ee4b 100644 --- a/include/IR/OptimizationPossibilities.hpp +++ b/include/IR/OptimizationPossibilities.hpp @@ -15,7 +15,52 @@ #include namespace poly::CostModeling { +using math::DensePtrMatrix; +// loop subsets are contiguous +// +// comparing addrs; NaN == independent of? +// for (j : J){ +// b = B[j]; +// for (i : I) f(A[i], b); +// } +// +// Lets start with the actual cost: +// Ca and Cb are cost of loading from A and B, respectively. +// Ui and Uj are the unrolling factors for i and j, respectively. +// Vi and Vj are the vectorization factors; only one is allowed to be !=0 +// C = Ca * J * I/(Uj*Vj*Vi) + Cb * J/Vj +// +// Vi: C = Ca * J * I/(Uj*Vi) + Cb * J +// Vj: C = Ca * J * I/(Uj*Vj) + Cb * J/Vj +// +// Cost of `A` is Ca * Uj^0 * Ui^1 * I*J / (Uj * Ui) +// = Ca * I * J / Uj +// Cost of `B` is Cb * Uj^1 * Ui^0 * I^0*J / (Uj * Ui^0) +// = Cb * J +// Perhaps easier to work with logarithms? +// +// +// j i +// A: 0 1 +// B: 1 NaN +// +// +// +// i j k +// NaN NaN NaN +class Costs { + DensePtrMatrix costs; + + [[nodiscard]] constexpr auto numAddr() const -> ptrdiff_t { + return ptrdiff_t{costs.numRow()}; + } + [[nodiscard]] constexpr auto numLoops() const -> ptrdiff_t { + return ptrdiff_t{costs.numCol()}; + } +}; + +// perhaps should just store costs? class LoopIndexDependency { // for (j : J){ // b = B[j]; @@ -421,6 +466,7 @@ inline constexpr void LoopDependencies::addAddr( if (f) { AddrSummary s = (*this)[f->second].setAddr(a); push(s); + // FIXME: not okay!!! We may have different loops std::copy_n(data + bpa * f->second, bpa, data + bpa * id); if (f && f->second >= offset) return; addOptOption(alloc, optops, s); From 99256b79a829597e46f3ffd10e3cfe2a9bc954f3 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Sun, 6 Aug 2023 22:34:00 -0400 Subject: [PATCH 022/112] negligible progress --- include/IR/CostModeling.hpp | 1 + include/IR/OptimizationPossibilities.hpp | 44 ++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index be3eff993..efd5ac1a6 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -1,3 +1,4 @@ + #pragma once // #include "./ControlFlowMerging.hpp" diff --git a/include/IR/OptimizationPossibilities.hpp b/include/IR/OptimizationPossibilities.hpp index 7b878ee4b..4fe2d19db 100644 --- a/include/IR/OptimizationPossibilities.hpp +++ b/include/IR/OptimizationPossibilities.hpp @@ -11,12 +11,56 @@ #include #include #include +#include #include #include namespace poly::CostModeling { using math::DensePtrMatrix; +// Classifies the type of loop dependency +// Possibilities: +// Not nested: this address is not nested inside the loop +// Dynamic: unknown stride +// Static: 0... +// Special values: +// 0: nested inside, but not dependent +// 1: contiguous +// -1: contiguous, but reversed +// From here, small values like `2` might mean we can efficiently shuffle. +// Ideally, we'd be paired with another address offset by 1. +// But even just `A[2*i]`, it may take less micro-ops to shuffle than to +// use a gather. +struct LoopDependency { + int type_; + static constexpr int notNested = std::numeric_limits::min(); + static constexpr int dynamic = notNested + 1; + // NOLINTNEXTLINE(readability-identifier-naming) + static constexpr auto NotNested() -> LoopDependency { return {notNested}; } + // NOLINTNEXTLINE(readability-identifier-naming) + static constexpr auto Dynamic() -> LoopDependency { return {dynamic}; } + // NOLINTNEXTLINE(readability-identifier-naming) + static constexpr auto Static(int stride) -> LoopDependency { + // incredibly unlikely, but we don't want to mistake "notNested" + // for a static stride with that value. It isn't something we can optimize + // anyway, so we'll just return dynamic. + return {stride == notNested ? dynamic : stride}; + } + [[nodiscard]] constexpr auto stride() const -> std::optional { + switch (type_) { + case notNested: + case dynamic: return std::nullopt; + default: return type_; + } + } + [[nodiscard]] constexpr auto isDynamic() const -> bool { + return type_ == dynamic; + } + [[nodiscard]] constexpr auto isNotNested() const -> bool { + return type_ == notNested; + } +}; + // loop subsets are contiguous // // comparing addrs; NaN == independent of? From 39cfb2b6f0ff1ae4391a99b3caaac2badf19c0b7 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Wed, 13 Sep 2023 23:55:02 -0400 Subject: [PATCH 023/112] Add some comments --- include/IR/CostFunction.hpp | 54 +++++++++++++++++++++++++++++++++++++ include/IR/CostModeling.hpp | 12 ++++++++- 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 include/IR/CostFunction.hpp diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp new file mode 100644 index 000000000..377ba9da3 --- /dev/null +++ b/include/IR/CostFunction.hpp @@ -0,0 +1,54 @@ +#pragma once +#include + +namespace poly::CostModeling { +using math::DensePtrMatrix; + +/// Here, we define a cost fn that can be optimized to produce +/// vectorization and unrolling factors. +/// We assemble all addrs into a vector, sorted by depth first traversal order +/// of the loop tree, e.g. +/// A(0) --> B(1) --> C(2) --> D(3) +/// \-> E(5) --> F(6) \-> G(4) +/// \-> H(7) --> I(8) --> J(9) +/// Focusing only on memory addresses initially... +/// The cost of a particular read/write can be looked up from LLVM +/// as a function of scalar/gather/scatter/broadcast/contiguous. +/// Then this can be adjusted by the product of all unroll factors of loops +/// it depends on, divided by the product of all unroll factors of all +/// containing loops. +/// To optimize, we can branch and bound. Unrolling factors lead to a natural +/// relaxation that plays well, but less so for binary variables like which loop +/// is vectorized. Additionally, patterns such as replacing gather/scatters with +/// shuffle sequences need special handling, that restricts the branch and bound +/// to powers of 2. To be able to build such a cost model, we need to estimate +/// the number of live variables as a result of unroll factors, in order to +/// impose constraints. +/// +/// We use soft constraints for register pressuring, representing the +/// store/reload pair of a spill. +/// +/// Furthermore, we also need to consider the possibility of dependency chains. +/// Consider, for example +/// for (ptrdiff_t i = 0; i < I; ++i) +/// for (ptrdiff_t j = 0; j < J; ++j) +/// x[i] += A[i][j] * y[j]; +/// The `j` loop itself has a dependency chain. +/// Two options for addressing this: +/// 1. unrolling `j`, cloning the accumulation registers, and reducing at the +/// end. +/// 2. unrolling the `i` loop. +/// The second option is better, but may not be possible, e.g. if there is no +/// `i` loop or it carries some dependency. Thus, we want our model to unroll +/// `i` when legal, and unroll `j` otherwise. +/// Assuming a throughput of 2 fma/cycle and a latency of 4 cycles, an estimate +/// of the cost as a function of I, J, Ui, and Uj is (ignoring vectorization): +/// 4*I*J/min(Ui*Uj, 2*4) + 4*I*log2(Uj) +/// The first term is latency per fma (because of the dependency chain) * the +/// number of iterations, divided by however many unrolling allows us to have +/// inflight. The second term is for the reduction of the cloned `Uj` +/// accumulators. Each step in the reduction has a latency of 4 cycles, and we +/// need to do `log2(Uj)` steps. +/// +/// /// +} // namespace poly::CostModeling diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index efd5ac1a6..25e3edd04 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -47,12 +47,22 @@ class CPURegisterFile { [[no_unique_address]] uint8_t numGeneralPurposeRegisters; [[no_unique_address]] uint8_t numPredicateRegisters; +#if defined(__x86_64__) // hacky check for has AVX512 static inline auto hasAVX512(llvm::LLVMContext &C, const llvm::TargetTransformInfo &TTI) -> bool { return TTI.isLegalMaskedExpandLoad( llvm::FixedVectorType::get(llvm::Type::getDoubleTy(C), 8)); } +#else + // assume we're not cross-compiling to x64 from some other arch to reduce the + // risk of false positives + static constexpr hasAVX512(llvm::LLVMContext &, + const llvm::TargetTransformInfo &) + ->bool { + return false; + } +#endif static auto estimateNumPredicateRegisters( llvm::LLVMContext &C, const llvm::TargetTransformInfo &TTI) -> uint8_t { @@ -679,7 +689,7 @@ class IROptimizer { // } // x[i] /= U[i,i]; // } -// We have an edge from the store `x[i] = x[i] / U[i,i]=` to the load of +// We have an edge from the store `x[i] = x[i] / U[i,i]` to the load of // `x[j]`, when `j = ` the current `i`, on some future iteration. // We want to unroll; // for (int i = 0: i < I-3; i += 4){ From 9e742abdd627b6285209a6fcb16b34f94cc7f04c Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Thu, 14 Sep 2023 01:47:38 -0400 Subject: [PATCH 024/112] Add a few comments, in particular on a soft min --- include/IR/CostFunction.hpp | 5 ++ include/IR/OptimizationPossibilities.hpp | 68 +++++++++++++++++++++--- 2 files changed, 67 insertions(+), 6 deletions(-) diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp index 377ba9da3..7309564bd 100644 --- a/include/IR/CostFunction.hpp +++ b/include/IR/CostFunction.hpp @@ -50,5 +50,10 @@ using math::DensePtrMatrix; /// accumulators. Each step in the reduction has a latency of 4 cycles, and we /// need to do `log2(Uj)` steps. /// +/// Note, `y-softplus(l*(y-x))/l` is a good smooth minimum function, +/// monotonic in `x` and differentiable everywhere. `l` controls + /// sharpness. Likewise, `y+softplus(l*(x-y))/l` for `max`. +/// +/// /// /// } // namespace poly::CostModeling diff --git a/include/IR/OptimizationPossibilities.hpp b/include/IR/OptimizationPossibilities.hpp index 4fe2d19db..a0bb84c84 100644 --- a/include/IR/OptimizationPossibilities.hpp +++ b/include/IR/OptimizationPossibilities.hpp @@ -16,7 +16,7 @@ #include namespace poly::CostModeling { -using math::DensePtrMatrix; +using math::DensePtrMatrix, math::MutDensePtrMatrix; // Classifies the type of loop dependency // Possibilities: @@ -31,22 +31,24 @@ using math::DensePtrMatrix; // Ideally, we'd be paired with another address offset by 1. // But even just `A[2*i]`, it may take less micro-ops to shuffle than to // use a gather. +// struct LoopDependency { - int type_; - static constexpr int notNested = std::numeric_limits::min(); - static constexpr int dynamic = notNested + 1; + using I = int; + I type_; + static constexpr I notNested = std::numeric_limits::min(); + static constexpr I dynamic = notNested + 1; // NOLINTNEXTLINE(readability-identifier-naming) static constexpr auto NotNested() -> LoopDependency { return {notNested}; } // NOLINTNEXTLINE(readability-identifier-naming) static constexpr auto Dynamic() -> LoopDependency { return {dynamic}; } // NOLINTNEXTLINE(readability-identifier-naming) - static constexpr auto Static(int stride) -> LoopDependency { + static constexpr auto Static(I stride) -> LoopDependency { // incredibly unlikely, but we don't want to mistake "notNested" // for a static stride with that value. It isn't something we can optimize // anyway, so we'll just return dynamic. return {stride == notNested ? dynamic : stride}; } - [[nodiscard]] constexpr auto stride() const -> std::optional { + [[nodiscard]] constexpr auto stride() const -> std::optional { switch (type_) { case notNested: case dynamic: return std::nullopt; @@ -60,6 +62,60 @@ struct LoopDependency { return type_ == notNested; } }; +// So, our data structure can be a `MutDensePtrMatrix` +// with a column per loop, and a row per address. +// We create these per independent sub-tree. +// (Can we use some sparse block structure for better efficiency?) +// +// The addr's order corresponds to the loop tree structure's traversal order. +class LoopDependencies { + MutDensePtrMatrix deps; + unsigned numAddr_; + unsigned offset_{0}; + // We also do want an addrMap to associate uses of the same Addr + +public: + LoopDependencies(utils::Arena<> *a, unsigned numAddr, unsigned numLoops) + : deps{math::matrix(a, math::Row{numAddr}, + math::Col{numLoops}, + LoopDependency::NotNested())}, + numAddr_{numAddr} {} +}; + +/// Optimizes one option. +class OptionOptimizer {}; + +/// Traverses, generating options and optimizing them +class LoopTreeOptimizer { + /// addrMap yields start of a chain of addrs sharing the same array and index + /// (modulo any offsets). Indices are into the `LoopDependencies` class, + /// following the same order. + dict::amap addrMap; + MutPtrVector addrChain; + /// This class provides the functionality for traversing the loop IR, and + /// picking the optimal schedule. We do a depth-first traversal, analyzing and + /// picking an optimal schedule as we return. This, given loops such as + /// A(9) --> B(3) --> C(2) --> D(0) + /// \-> E(5) --> F(4) \-> G(1) + /// \-> H(8) --> I(7) --> J(6) + /// We would descend A->B->C->D + /// Then we would add the Addr inside `D` (which is loop 0) + /// and determine the optimal schedule. + /// Then we return, ascending, to C, which immediately descends to `G`. + /// We add the Addr inside `G` (which is loop 1), and determine the optimal + /// vectorization and unrolling. + /// Upon returning to `C`, with no sub-loops left, we similarly add its Addr, + /// and determine the optimal schedule for the set of loops D, G, and C. + /// Does C need to retraverse the `Addr` in order to add them with the + /// appropriate loop index (2)? + /// + /// The optimization process involves adding optimization possibilities, + /// for each of these, we perform a more expensive analysis. + /// That analysis -- what kind of information do we need to accumulate? + /// Lets start with that... +public: + void descend() {} +}; // loop subsets are contiguous // From 524c4dda459c50474b3eac8d2d42f7ad5abc5995 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Fri, 15 Sep 2023 01:17:37 -0400 Subject: [PATCH 025/112] more comments --- include/IR/CostFunction.hpp | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp index 7309564bd..377c2a9ce 100644 --- a/include/IR/CostFunction.hpp +++ b/include/IR/CostFunction.hpp @@ -30,9 +30,12 @@ using math::DensePtrMatrix; /// /// Furthermore, we also need to consider the possibility of dependency chains. /// Consider, for example -/// for (ptrdiff_t i = 0; i < I; ++i) +/// for (ptrdiff_t i = 0; i < I; ++i){ +/// eltype_t xi = x[i]; /// for (ptrdiff_t j = 0; j < J; ++j) -/// x[i] += A[i][j] * y[j]; +/// xi += A[i][j] * y[j]; +/// x[i] = xi; +/// } /// The `j` loop itself has a dependency chain. /// Two options for addressing this: /// 1. unrolling `j`, cloning the accumulation registers, and reducing at the @@ -52,8 +55,23 @@ using math::DensePtrMatrix; /// /// Note, `y-softplus(l*(y-x))/l` is a good smooth minimum function, /// monotonic in `x` and differentiable everywhere. `l` controls - /// sharpness. Likewise, `y+softplus(l*(x-y))/l` for `max`. +/// sharpness. Likewise, `y+softplus(l*(x-y))/l` for `max`. /// +/// Thus, a cost function for the above gemv could be something like +/// memcost = I*J*(Ui*Uj*C_{Al} + Uj*C_{yl}) / (Ui*Uj) + +/// I*(C_{xl}*Ui + C_{xs}*Ui) / Ui +/// cthroughput = I*J*(Ui*Uj*C_{t,fma}) / (Ui*Uj) + I*(Ui*C_{t,add}*(Uj-1)) / Ui +/// clatency = I*J*C_{l,fma}/smin(Ui*Uj, C_{l,fma}/C_{t,fma}) + +/// I*C_{l,add}*log2(Uj) +/// cost = memcost + smax(cthroughput, clatency) +/// or, if the it is easier to solve: +/// cost = memcost + cthroughput + clatency +/// +/// We may initially want to add a small cost for loop increment and cmp/branch, +/// to encourage unrolling more generally, plus a cost for unrolling to +/// discourse any excess unrolling when it doesn't provide meaningful benefits +/// (representing the general cost of code size/ filling uop cache -- we +/// definitely want loops to fit in the uop cache of any CPU sporting one!!! ). /// /// /// } // namespace poly::CostModeling From e34b44b78039c3b32cfe96474217e6df12ffea34 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Sun, 17 Sep 2023 02:44:13 -0400 Subject: [PATCH 026/112] A few more comments --- include/IR/CostFunction.hpp | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp index 377c2a9ce..626c5024a 100644 --- a/include/IR/CostFunction.hpp +++ b/include/IR/CostFunction.hpp @@ -73,5 +73,40 @@ using math::DensePtrMatrix; /// (representing the general cost of code size/ filling uop cache -- we /// definitely want loops to fit in the uop cache of any CPU sporting one!!! ). /// +/// +/// +/// Note that if we had +/// for (ptrdiff_t i = 0; i < I; ++i){ +/// eltype_t yi = y[i]; +/// for (ptrdiff_t j = 0; j < J; ++j) +/// x[j] += A[i][j] * yi; +/// } +/// then unrolling the `i` loop doesn't increase OOO, +/// but we can assume that as successive `j` iterations are independent/do not +/// have a dependency chain, this isn't an issue. +/// That is, we only consider reductions across the inner-most loop as requiring +/// cloning of accumulators. +/// + /// On throughput modeling, LLVM seems to generally give a recip throughput of 1 for pipelined instructions, regardless of number of ports. This is actually what we want, as this allows RTs to be additive (e.g., we may have a fma that is able to run on 2 ports (e.g. p0 or p5) and a permute that can only execute on one (e.g. p5); when mixing these instructions, they have the same effective cost -- they use a port -- and the more limited port choices of one isn't a problem so long as others can use what remains. + /// For our purposes, it isn't worth getting too fancy here. It is worth noting that the baseline model presented here +/// https://arxiv.org/pdf/2107.14210.pdf + /// performed respectively well when compared to vastly more sophisticated tools; for example, it performed similarly well as llvm-mca on most tested architectures! +/// The baseline model used above for loops was + /// max(1, (n-1)/i, m_r/m, m_w/w) +/// where + /// n - the number of instructions in the benchmark (-1 because of assumption that the cmp and branch are macro-fused, meaning the last two instructions count as 1) +/// m_r - number of memory reads +/// m_w - number of memory writes + /// i - the issue width, e.g. 4 for Intel Skylake CPUs. + /// m - number of reads the CPU can do per cycle (2 for all in the article) + /// w - number of writes the CPU can do per cycle (e.g. 2 for Ice Lake and newer, 1 for older) + /// Unfortunately, we cannot get the CPU-specific information (`i`,`m`,or`w`) from LLVM. + /// However, these are largely a matter of scale, and are generally correlated. E.g., Intel's Alderlake's values would be 6, 3, and 2, vs the older Skylake's 4, 2, and 1. + /// While not all the ratios are equal (`w`'s is 2 instead of 1.5), it is unlikely that many optimization decisions are going to be made differently between them. +/// A possible exception is that we may wish to unroll more for CPUs with more out of order execution abilities. +/// `getMaxInterleaveFactor` is an indicator of whether the pipeline might be very narrow. +/// +/// +/// /// /// /// } // namespace poly::CostModeling From d09ff1fa6ccca5d7e2bd851a5954131ce11bfb34 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Mon, 18 Sep 2023 21:40:28 -0400 Subject: [PATCH 027/112] comment formatting --- include/IR/CostFunction.hpp | 53 +++++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp index 626c5024a..a30988408 100644 --- a/include/IR/CostFunction.hpp +++ b/include/IR/CostFunction.hpp @@ -87,26 +87,51 @@ using math::DensePtrMatrix; /// That is, we only consider reductions across the inner-most loop as requiring /// cloning of accumulators. /// - /// On throughput modeling, LLVM seems to generally give a recip throughput of 1 for pipelined instructions, regardless of number of ports. This is actually what we want, as this allows RTs to be additive (e.g., we may have a fma that is able to run on 2 ports (e.g. p0 or p5) and a permute that can only execute on one (e.g. p5); when mixing these instructions, they have the same effective cost -- they use a port -- and the more limited port choices of one isn't a problem so long as others can use what remains. - /// For our purposes, it isn't worth getting too fancy here. It is worth noting that the baseline model presented here +/// On throughput modeling, LLVM seems to generally give a recip throughput of 1 +/// for pipelined instructions, regardless of number of ports. This is actually +/// what we want, as this allows RTs to be additive (e.g., we may have a fma +/// that is able to run on 2 ports (e.g. p0 or p5) and a permute that can only +/// execute on one (e.g. p5); when mixing these instructions, they have the same +/// effective cost -- they use a port -- and the more limited port choices of +/// one isn't a problem so long as others can use what remains. For our +/// purposes, it isn't worth getting too fancy here. It is worth noting that the +/// baseline model presented here /// https://arxiv.org/pdf/2107.14210.pdf - /// performed respectively well when compared to vastly more sophisticated tools; for example, it performed similarly well as llvm-mca on most tested architectures! +/// performed respectively well when compared to vastly more sophisticated +/// tools; for example, it performed similarly well as llvm-mca on most tested +/// architectures! /// The baseline model used above for loops was - /// max(1, (n-1)/i, m_r/m, m_w/w) +/// max(1, (n-1)/i, m_r/m, m_w/w) /// where - /// n - the number of instructions in the benchmark (-1 because of assumption that the cmp and branch are macro-fused, meaning the last two instructions count as 1) +/// n - the number of instructions in the benchmark (-1 because of assumption +/// that the cmp and branch are macro-fused, meaning the last two instructions +/// count as 1) /// m_r - number of memory reads /// m_w - number of memory writes - /// i - the issue width, e.g. 4 for Intel Skylake CPUs. - /// m - number of reads the CPU can do per cycle (2 for all in the article) - /// w - number of writes the CPU can do per cycle (e.g. 2 for Ice Lake and newer, 1 for older) - /// Unfortunately, we cannot get the CPU-specific information (`i`,`m`,or`w`) from LLVM. - /// However, these are largely a matter of scale, and are generally correlated. E.g., Intel's Alderlake's values would be 6, 3, and 2, vs the older Skylake's 4, 2, and 1. - /// While not all the ratios are equal (`w`'s is 2 instead of 1.5), it is unlikely that many optimization decisions are going to be made differently between them. -/// A possible exception is that we may wish to unroll more for CPUs with more out of order execution abilities. -/// `getMaxInterleaveFactor` is an indicator of whether the pipeline might be very narrow. +/// i - the issue width, e.g. 4 for Intel Skylake CPUs. +/// m - number of reads the CPU can do per cycle (2 for all in the article) +/// w - number of writes the CPU can do per cycle (e.g. 2 for Ice Lake and +/// newer, 1 for older) Unfortunately, we cannot get the CPU-specific +/// information (`i`,`m`,or`w`) from LLVM. However, these are largely a matter +/// of scale, and are generally correlated. E.g., Intel's Alderlake's values +/// would be 6, 3, and 2, vs the older Skylake's 4, 2, and 1. While not all the +/// ratios are equal (`w`'s is 2 instead of 1.5), it is unlikely that many +/// optimization decisions are going to be made differently between them. +/// A possible exception is that we may wish to unroll more for CPUs with more +/// out of order execution abilities. `getMaxInterleaveFactor` is an indicator +/// of whether the pipeline might be very narrow. +/// +/// +/// +/// +/// /// /// /// /// -/// /// +class LoopTreeCostFn { + +public: + constexpr auto operator()(const AbstractVector auto &x) const { return 0.0; } +}; + } // namespace poly::CostModeling From dcdd97483feb63c54285b97feab350e8110bb5ba Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Tue, 19 Sep 2023 01:12:45 -0400 Subject: [PATCH 028/112] Some progress cleaning up --- include/Dicts/BumpMapSet.hpp | 7 +++- include/Graphs/Graphs.hpp | 20 ++++----- include/IR/Address.hpp | 12 +++--- include/IR/Cache.hpp | 6 +-- include/IR/ControlFlowMerging.hpp | 2 +- include/IR/CostFunction.hpp | 4 ++ include/IR/CostModeling.hpp | 19 ++++----- include/IR/Hash.hpp | 29 ++----------- include/IR/Instruction.hpp | 45 +++++++++++++++------ include/IR/Node.hpp | 15 ++++--- include/IR/OptimizationPossibilities.hpp | 3 +- include/IR/Predicate.hpp | 3 +- include/LinearProgramming/ScheduledNode.hpp | 20 ++++----- include/Polyhedra/Dependence.hpp | 20 ++++----- include/Polyhedra/DependencyPolyhedra.hpp | 1 - include/Polyhedra/Loops.hpp | 11 ++--- include/Polyhedra/Polyhedra.hpp | 15 +++---- include/Support/Iterators.hpp | 25 ++++++------ include/Support/OStream.hpp | 14 ++++--- test/ArrayReference.hpp | 20 ++++----- test/TestUtilities.hpp | 1 - test/bumpmap_test.cpp | 17 +++++++- test/compat_test.cpp | 14 ++++--- test/orthogonalize_test.cpp | 1 - 24 files changed, 176 insertions(+), 148 deletions(-) diff --git a/include/Dicts/BumpMapSet.hpp b/include/Dicts/BumpMapSet.hpp index e8b5c4f65..ce145327c 100644 --- a/include/Dicts/BumpMapSet.hpp +++ b/include/Dicts/BumpMapSet.hpp @@ -1,5 +1,6 @@ #pragma once #include +#include #include #include #include @@ -30,6 +31,10 @@ struct aset // NOLINT(readability-identifier-naming) std::equal_to, math::BumpPtrVector>; aset(Arena<> *alloc) : Base{WArena(alloc)} {} }; -static_assert(std::is_trivially_destructible_v); + +static_assert(std::same_as::value_container_type, + math::BumpPtrVector>>); +static_assert(std::same_as::allocator_type, + utils::WArena, 16384, true>>); } // namespace poly::dict diff --git a/include/Graphs/Graphs.hpp b/include/Graphs/Graphs.hpp index 32f621b8a..ed2fe0cf1 100644 --- a/include/Graphs/Graphs.hpp +++ b/include/Graphs/Graphs.hpp @@ -34,13 +34,9 @@ namespace poly::graph { // template concept AbstractPtrGraph = requires(G g, typename G::VertexType *v) { - { - *(g.getVertices(v).begin()) - } -> std::template same_as; + { *(g.getVertices(v).begin()) } -> std::same_as; { g.getVertices(v) } -> std::ranges::forward_range; - { - *(g.outNeighbors(v).begin()) - } -> std::template same_as; + { *(g.outNeighbors(v).begin()) } -> std::same_as; { g.outNeighbors(v) } -> std::ranges::forward_range; { v->index() } -> std::assignable_from; { v->lowLink() } -> std::assignable_from; @@ -50,10 +46,10 @@ concept AbstractPtrGraph = requires(G g, typename G::VertexType *v) { { v->visited() } -> std::same_as; { v->visit() }; { v->unVisit() }; - { v->setNext(v) } -> std::template same_as; - { v->getNext() } -> std::template same_as; - { v->setNextComponent(v) } -> std::template same_as; - { v->getNextComponent() } -> std::template same_as; + { v->setNext(v) } -> std::same_as; + { v->getNext() } -> std::same_as; + { v->setNextComponent(v) } -> std::same_as; + { v->getNextComponent() } -> std::same_as; }; template struct State { @@ -99,8 +95,8 @@ template inline auto stronglyConnectedComponents(G g, vertex_t *seed) -> vertex_t * { using N = vertex_t; - State state{}; - for (auto *v : g->getVertices(seed)) + State state{}; + for (auto *v : g.getVertices(seed)) if (!v->wasVisited()) state = strongConnect(g, state, v); return state.components; } diff --git a/include/IR/Address.hpp b/include/IR/Address.hpp index b8da8a2d5..cc429424c 100644 --- a/include/IR/Address.hpp +++ b/include/IR/Address.hpp @@ -122,7 +122,8 @@ class Addr : public Instruction { [[nodiscard]] constexpr auto indMatPtr() const -> int64_t * { return getIntMemory() + 1 + getArrayDim(); } - [[nodiscard]] auto getSymbolicOffsets() -> MutPtrVector { + [[nodiscard]] constexpr auto getSymbolicOffsets() + -> MutPtrVector { return {syms + numDim, numDynSym}; } [[nodiscard]] constexpr auto offsetMatrix() -> MutDensePtrMatrix { @@ -323,10 +324,11 @@ class Addr : public Instruction { r->edgeOut = -1; return r; } - [[nodiscard]] auto getSizes() const -> PtrVector { + [[nodiscard]] constexpr auto getSizes() const + -> PtrVector { return {syms, numDim}; } - [[nodiscard]] auto getSymbolicOffsets() const + [[nodiscard]] constexpr auto getSymbolicOffsets() const -> PtrVector { return {syms + numDim, numDynSym}; } @@ -674,7 +676,7 @@ class Load : public AddrWrapper { Load(Node *a) : AddrWrapper(a->getKind() == Node::VK_Load ? static_cast(a) : nullptr) {} - [[nodiscard]] constexpr auto getInstruction() const -> llvm::Instruction * { + [[nodiscard]] auto getInstruction() const -> llvm::Instruction * { // could be load or store return llvm::cast(this->addr->getInstruction()); } @@ -686,7 +688,7 @@ class Stow : public AddrWrapper { Stow(Node *a) : AddrWrapper(a->getKind() == Node::VK_Stow ? static_cast(a) : nullptr) {} - [[nodiscard]] constexpr auto getInstruction() const -> llvm::StoreInst * { + [[nodiscard]] auto getInstruction() const -> llvm::StoreInst * { // must be store return llvm::cast(this->addr->getInstruction()); } diff --git a/include/IR/Cache.hpp b/include/IR/Cache.hpp index 3a271f395..061bbc5b7 100644 --- a/include/IR/Cache.hpp +++ b/include/IR/Cache.hpp @@ -44,8 +44,8 @@ struct AddrChain { [[nodiscard]] constexpr auto getStores() const { Addr *S = (addr && addr->isStore()) ? addr : nullptr; return utils::ListRange(S, [](Addr *A) -> Addr * { - Addr *S = A->getNextAddr(); - if (S && S->isStore()) return S; + Addr *W = A->getNextAddr(); + if (W && W->isStore()) return W; return nullptr; }); } @@ -416,7 +416,7 @@ class Cache { /// updating the operands of all users of `oldNode` /// and the `users` of all operands of `oldNode` // NOLINTNEXTLINE(misc-no-recursion) - constexpr void replaceAllUsesWith(Instruction *oldNode, Value *newNode) { + void replaceAllUsesWith(Instruction *oldNode, Value *newNode) { invariant(oldNode->getKind() == Node::VK_Load || oldNode->getKind() >= Node::VK_Func); replaceUsesByUsers(oldNode, newNode); diff --git a/include/IR/ControlFlowMerging.hpp b/include/IR/ControlFlowMerging.hpp index c67cd9592..479769b9c 100644 --- a/include/IR/ControlFlowMerging.hpp +++ b/include/IR/ControlFlowMerging.hpp @@ -457,7 +457,7 @@ mergeInstructions(IR::Cache &cache, Predicate::Map &predMap, opMap{&tAlloc}; amap valToPred{&tAlloc}; llvm::SmallVector mergingCosts; - mergingCosts.emplace_back(tAlloc); + mergingCosts.emplace_back(&tAlloc); // We search through incomplete instructions inside the predMap // this should yield all merge candidates.L for (auto *C = completed; C; C = static_cast(C->getNext())) { diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp index a30988408..fd394e873 100644 --- a/include/IR/CostFunction.hpp +++ b/include/IR/CostFunction.hpp @@ -1,7 +1,11 @@ #pragma once + #include +#include +#include namespace poly::CostModeling { +using math::AbstractVector; using math::DensePtrMatrix; /// Here, we define a cost fn that can be optimized to produce diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index 25e3edd04..e56964447 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -467,9 +467,9 @@ class IROptimizer { IR::Cache &instructions; dict::set &LBBs; dict::set &eraseCandidates; - IR::Loop *root; + IR::Loop *root_; MutPtrVector loopDeps; - Arena<> *lalloc; + Arena<> *lalloc_; llvm::TargetLibraryInfo *TLI; /// `loopDepSats` places the dependencies at the correct loop level so that @@ -522,8 +522,8 @@ class IROptimizer { // 2. are non-escaping, i.e. `llvm::isNonEscapingLocalObject` // 3. returned by `llvm::isRemovableAlloc` inline auto eliminateTemporaries(IR::AddrChain addr) -> unsigned { - auto s = lalloc->scope(); - dict::aset loaded{lalloc}; + auto s = lalloc_->scope(); + dict::aset loaded{lalloc_}; for (IR::Addr *a : addr.getAddr()) if (a->isLoad()) loaded.insert(a); unsigned remaining = 0; @@ -536,7 +536,7 @@ class IROptimizer { if (!call) continue; if (!llvm::isNonEscapingLocalObject(call, nullptr)) continue; if (!llvm::isRemovableAlloc(call, TLI)) continue; - if (hasFutureReads(lalloc, LBBs, call)) continue; + if (hasFutureReads(lalloc_, LBBs, call)) continue; a->drop(deps); // we later check if any uses remain other than the associated free // if not, we can delete them. @@ -665,19 +665,20 @@ class IROptimizer { public: IROptimizer(IR::Dependencies deps, IR::Cache &instr, dict::set &loopBBs, - dict::set &eraseCandidates_, IR::Loop *root_, + dict::set &eraseCandidates_, IR::Loop *root, Arena<> *lalloc, lp::LoopBlock::OptimizationResult res, uint32_t numLoops) : deps{deps}, instructions{instr}, LBBs{loopBBs}, - eraseCandidates{eraseCandidates_}, root{root_}, lalloc{lalloc} { - sortEdges(root, 0); + eraseCandidates{eraseCandidates_}, root_{root}, lalloc_{lalloc} { + sortEdges(root_, 0); removeRedundantAddr(res.addr); unsigned numAddr = eliminateTemporaries(res.addr); loopDeps = loopDepSats(lalloc, deps, res); // plan now is to have a `BitArray` big enough to hold `numLoops` entries // and `numAddr` rows; final axis is contiguous vs non-contiguous // Additionally, we will have a vector of unroll strategies to consider - LoopDependencies *ld = LoopDependencies::create(lalloc, numLoops, numAddr); + // LoopDependencies *ld = LoopDependencies::create(lalloc_, numLoops, + // numAddr); } }; diff --git a/include/IR/Hash.hpp b/include/IR/Hash.hpp index b8dd124ea..b5039fccf 100644 --- a/include/IR/Hash.hpp +++ b/include/IR/Hash.hpp @@ -1,6 +1,6 @@ #pragma once -#include "IR/Instruction.hpp" #include "IR/Node.hpp" +#include #include #include @@ -31,7 +31,7 @@ template <> struct ankerl::unordered_dense::hash { case poly::IR::Node::VK_Bint: return combineHash(seed, llvm::hash_value(*x.payload.ci)); default: - poly::invariant(x.kind == poly::IR::Node::VK_Bint); + poly::utils::invariant(x.kind == poly::IR::Node::VK_Bint); return combineHash(seed, llvm::hash_value(*x.payload.cf)); } } @@ -54,27 +54,6 @@ struct ankerl::unordered_dense::hash { /// template <> struct ankerl::unordered_dense::hash { using is_avalanching = void; - [[nodiscard]] auto operator()(poly::IR::InstByValue const &x) const noexcept - -> uint64_t { - using poly::Hash::combineHash, poly::Hash::getHash, poly::containers::UList, - poly::IR::Value; - uint64_t seed = getHash(x.inst->getKind()); - seed = combineHash(seed, getHash(x.inst->getType())); - seed = combineHash(seed, getHash(x.inst->getOpId())); - if (x.inst->isIncomplete()) - return combineHash(seed, getHash(x.inst->getLLVMInstruction())); - uint8_t assocFlag = x.inst->associativeOperandsFlag(); - // combine all operands - size_t offset = 0; - poly::PtrVector operands = x.inst->getOperands(); - if (assocFlag) { - poly::invariant(assocFlag, uint8_t(3)); - // we combine hashes in a commutative way - seed = combineHash(seed, getHash(operands[0]) + getHash(operands[1])); - offset = 2; - } - for (auto B = operands.begin() + offset, E = operands.end(); B != E; ++B) - seed = combineHash(seed, getHash(*B)); - return seed; - } + [[nodiscard]] inline auto + operator()(poly::IR::InstByValue const &x) const noexcept -> uint64_t; }; diff --git a/include/IR/Instruction.hpp b/include/IR/Instruction.hpp index 3d1482641..90514ad71 100644 --- a/include/IR/Instruction.hpp +++ b/include/IR/Instruction.hpp @@ -94,8 +94,7 @@ class Compute : public Instruction { public: Compute(const Compute &) = delete; - constexpr Compute(ValKind k, llvm::Instruction *i, llvm::Intrinsic::ID id, - int numOps) + Compute(ValKind k, llvm::Instruction *i, llvm::Intrinsic::ID id, int numOps) : Instruction(k), inst(i), type(i->getType()), opId(id), numOperands(numOps), fastMathFlags(i->getFastMathFlags()) {} constexpr Compute(ValKind k, llvm::Intrinsic::ID id, int numOps, @@ -260,14 +259,12 @@ class Compute : public Instruction { // which case it is free [[nodiscard]] inline auto allUsersAdditiveContract() const -> bool; -}; // class Inst +}; // class Compute -struct InstByValue { - Compute *inst; - auto operator==(InstByValue const &other) const -> bool { - return *inst == *other.inst; - } -}; +inline auto InstByValue::operator==(InstByValue const &other) const -> bool { + if (inst == other.inst) return true; + return *inst == *other.inst; +} // some opaque function class OpaqueFunc { @@ -335,8 +332,7 @@ class Operation { [[nodiscard]] constexpr auto getNumOperands() const -> unsigned { return ins->getNumOperands(); } - [[nodiscard]] constexpr auto isInstruction(llvm::Intrinsic::ID opCode) const - -> bool { + [[nodiscard]] auto isInstruction(llvm::Intrinsic::ID opCode) const -> bool { return getOpCode() == opCode; } static auto isFMul(Node *n) -> bool { @@ -776,7 +772,7 @@ Compute::calcCost(const llvm::TargetTransformInfo &TTI, unsigned vectorWidth) if (auto *I = getInstruction()) return I->getParent(); return nullptr; } -[[nodiscard]] constexpr auto Instruction::getIdentifier() const +[[nodiscard]] auto Instruction::getIdentifier() const -> Instruction::Identifier { llvm::Intrinsic::ID id; if (const auto *I = llvm::dyn_cast(this)) id = I->getOpId(); @@ -811,3 +807,28 @@ inline void Instruction::setOperands(Arena<> *alloc, // llvm::Intrinsic::IndependentIntrinsics y = llvm::Intrinsic::sin; } // namespace poly::IR + +[[nodiscard]] inline auto +ankerl::unordered_dense::hash::operator()( + poly::IR::InstByValue const &x) const noexcept -> uint64_t { + using poly::Hash::combineHash, poly::Hash::getHash, poly::containers::UList, + poly::IR::Value; + uint64_t seed = getHash(x.inst->getKind()); + seed = combineHash(seed, getHash(x.inst->getType())); + seed = combineHash(seed, getHash(x.inst->getOpId())); + if (x.inst->isIncomplete()) + return combineHash(seed, getHash(x.inst->getLLVMInstruction())); + uint8_t assocFlag = x.inst->associativeOperandsFlag(); + // combine all operands + size_t offset = 0; + poly::PtrVector operands = x.inst->getOperands(); + if (assocFlag) { + poly::invariant(assocFlag, uint8_t(3)); + // we combine hashes in a commutative way + seed = combineHash(seed, getHash(operands[0]) + getHash(operands[1])); + offset = 2; + } + for (auto B = operands.begin() + offset, E = operands.end(); B != E; ++B) + seed = combineHash(seed, getHash(*B)); + return seed; +} diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index 438b603f3..c88200c16 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -17,7 +17,6 @@ #include #include #include -#include namespace poly::poly { class Dependencies; @@ -499,7 +498,7 @@ class Instruction : public Value { llvm::Type *type; }; // declarations - [[nodiscard]] constexpr auto getIdentifier() const -> Identifier; + [[nodiscard]] auto getIdentifier() const -> Identifier; inline void setOperands(Arena<> *alloc, math::PtrVector); }; @@ -526,7 +525,7 @@ class Cnst : public Value { llvm::Type *typ; protected: - constexpr Cnst(ValKind kind, llvm::Type *t) : Value(kind) { typ = t; } + constexpr Cnst(ValKind knd, llvm::Type *t) : Value(knd) { typ = t; } public: static constexpr auto classof(const Node *v) -> bool { @@ -604,7 +603,7 @@ class Bint : public Cnst { const llvm::APInt &val; public: - constexpr Bint(llvm::ConstantInt *v, llvm::Type *t) + Bint(llvm::ConstantInt *v, llvm::Type *t) : Cnst(VK_Bint, t), val(v->getValue()) {} static constexpr auto create(Arena<> *alloc, llvm::ConstantInt *v, llvm::Type *t) -> Bint * { @@ -624,7 +623,7 @@ class Bflt : public Cnst { const llvm::APFloat &val; public: - constexpr Bflt(llvm::ConstantFP *v, llvm::Type *t) + Bflt(llvm::ConstantFP *v, llvm::Type *t) : Cnst(VK_Bflt, t), val(v->getValue()) {} static constexpr auto create(Arena<> *alloc, llvm::ConstantFP *v, llvm::Type *t) -> Bflt * { @@ -645,4 +644,10 @@ class Bflt : public Cnst { return false; } +class Compute; +struct InstByValue { + Compute *inst; + inline auto operator==(InstByValue const &other) const -> bool; +}; + } // namespace poly::IR diff --git a/include/IR/OptimizationPossibilities.hpp b/include/IR/OptimizationPossibilities.hpp index a0bb84c84..12fcce17e 100644 --- a/include/IR/OptimizationPossibilities.hpp +++ b/include/IR/OptimizationPossibilities.hpp @@ -14,7 +14,7 @@ #include #include #include - +/* namespace poly::CostModeling { using math::DensePtrMatrix, math::MutDensePtrMatrix; @@ -648,3 +648,4 @@ class RegisterTile { } }; } // namespace poly::CostModeling +*/ diff --git a/include/IR/Predicate.hpp b/include/IR/Predicate.hpp index 2702dcba7..5f8ef3c04 100644 --- a/include/IR/Predicate.hpp +++ b/include/IR/Predicate.hpp @@ -16,7 +16,6 @@ #include #include #include -#include namespace poly::IR { @@ -378,7 +377,7 @@ struct Set { [[nodiscard]] auto operator&=(Set &pred) -> Set & { if (!pred.allocated) return *this &= pred.intersectUnion.intersect; pred.intersectUnion.intersects->forEach( - [&](Intersection pred) { *this &= pred; }); + [&](Intersection prd) { *this &= prd; }); return *this; } auto copy(Arena<> *alloc) const -> Set { diff --git a/include/LinearProgramming/ScheduledNode.hpp b/include/LinearProgramming/ScheduledNode.hpp index 74e394289..b03b815a7 100644 --- a/include/LinearProgramming/ScheduledNode.hpp +++ b/include/LinearProgramming/ScheduledNode.hpp @@ -62,8 +62,8 @@ class ScheduledNode { auto L = getNumLoops(); return L * L; } - constexpr ScheduledNode(Addr *store, poly::Loop *L) - : store(store), loopNest(L) { + constexpr ScheduledNode(Addr *write, poly::Loop *L) + : store(write), loopNest(L) { mem[0] = L->getNumLoops(); getFusionOmega() << 0; } @@ -122,10 +122,10 @@ class ScheduledNode { } constexpr void setOffsets(int64_t *o) { offsets = o; } struct NextAddr { - constexpr auto operator()(Addr *a) const -> Addr * { + auto operator()(Addr *a) const -> Addr * { return llvm::cast_or_null(a->getNext()); } - constexpr auto operator()(const Addr *a) const -> const Addr * { + auto operator()(const Addr *a) const -> const Addr * { return llvm::cast_or_null(a->getNext()); } }; @@ -481,11 +481,11 @@ static_assert(sizeof(ScheduledNode) <= 64); // fits in cache line class ScheduleGraph { IR::Dependencies deps; - unsigned depth; + unsigned depth_; public: using VertexType = ScheduledNode; - constexpr ScheduleGraph(unsigned depth) : depth(depth) {} + constexpr ScheduleGraph(unsigned depth) : depth_(depth) {} [[nodiscard]] static constexpr auto getVertices(ScheduledNode *nodes) -> utils::ListRange { @@ -495,11 +495,11 @@ class ScheduleGraph { -> utils::ListRange { return static_cast(nodes)->getVertices(); } - [[nodiscard]] constexpr auto outNeighbors(ScheduledNode *v) const { - return v->outNeighbors(deps, depth); + [[nodiscard]] auto outNeighbors(ScheduledNode *v) const { + return v->outNeighbors(deps, depth_); } - [[nodiscard]] constexpr auto inNeighbors(ScheduledNode *v) const { - return v->inNeighbors(deps, depth); + [[nodiscard]] auto inNeighbors(ScheduledNode *v) const { + return v->inNeighbors(deps, depth_); } }; diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 73517587d..a7d137192 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -455,7 +455,7 @@ class Dependence { constexpr Active(Active &&) noexcept = default; constexpr Active() noexcept = default; constexpr auto operator=(const Active &) noexcept -> Active & = default; - constexpr Active(unsigned depth) : depth(depth) {} + constexpr Active(unsigned d) : depth(d) {} constexpr auto operator()(const Dependence *d) const -> bool { return d->isActive(depth); } @@ -1064,14 +1064,14 @@ class Dependencies { } class Ref { - Dependencies *deps; - ID i; + Dependencies *deps_; + ID i_; public: - Ref(Dependencies *deps, ID i) : deps(deps), i(i) {} - operator Dependence() const { return deps->get(i); } + constexpr Ref(Dependencies *deps, ID i) : deps_(deps), i_(i) {} + operator Dependence() const { return deps_->get(i_); } auto operator=(Dependence d) -> Ref & { - deps->set(i, d); + deps_->set(i_, d); return *this; } }; @@ -1110,7 +1110,7 @@ class Dependencies { return utils::VForwardRange{outEdges(), id}; } [[nodiscard]] constexpr auto getEdgeTransform() const { - auto f = [=](int32_t id) { return get(Dependence::ID{id}); }; + auto f = [=, this](int32_t id) { return get(Dependence::ID{id}); }; return std::views::transform(f); } [[nodiscard]] constexpr auto inputEdges(int32_t id) const { @@ -1121,17 +1121,17 @@ class Dependencies { } [[nodiscard]] constexpr auto activeFilter(unsigned depth) const { - auto f = [=](int32_t id) -> bool { + auto f = [=, this](int32_t id) -> bool { return !isSat(Dependence::ID{id}, depth); }; return std::views::filter(f); } [[nodiscard]] constexpr auto inputAddrTransform() { - auto f = [=](int32_t id) { return input(Dependence::ID{id}); }; + auto f = [=, this](int32_t id) { return input(Dependence::ID{id}); }; return std::views::transform(f); } [[nodiscard]] constexpr auto outputAddrTransform() { - auto f = [=](int32_t id) { return output(Dependence::ID{id}); }; + auto f = [=, this](int32_t id) { return output(Dependence::ID{id}); }; return std::views::transform(f); } }; diff --git a/include/Polyhedra/DependencyPolyhedra.hpp b/include/Polyhedra/DependencyPolyhedra.hpp index 300a3dbdb..81ddc9ce4 100644 --- a/include/Polyhedra/DependencyPolyhedra.hpp +++ b/include/Polyhedra/DependencyPolyhedra.hpp @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include diff --git a/include/Polyhedra/Loops.hpp b/include/Polyhedra/Loops.hpp index 970d90c1f..10c6d14d5 100644 --- a/include/Polyhedra/Loops.hpp +++ b/include/Polyhedra/Loops.hpp @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include @@ -431,9 +430,8 @@ class Loop : public BasePolyhedra { /// offset the loops by `offsets`, e.g. if we have /// offsets[0] = 2, then the first loop is shifted by 2. /// this shifting is applied before rotation. - [[nodiscard]] constexpr auto rotate(Arena<> *alloc, DensePtrMatrix R, - const int64_t *offsets) const - -> NotNull { + [[nodiscard]] auto rotate(Arena<> *alloc, DensePtrMatrix R, + const int64_t *offsets) const -> NotNull { // if offsets is not null, we have the equivalent of // A * O * [I 0; 0 R] // where O = I - [0 0; offsets 0], @@ -558,14 +556,13 @@ class Loop : public BasePolyhedra { -> PtrVector { return getA()(j, _(0, getNumSymbols())); } - [[nodiscard]] constexpr auto copy(Arena<> *alloc) const -> NotNull { + [[nodiscard]] auto copy(Arena<> *alloc) const -> NotNull { auto ret = Loop::allocate(alloc, L, numConstraints, numLoops, getSyms(), isNonNegative()); ret->getA() << getA(); return ret; } - [[nodiscard]] constexpr auto removeLoop(Arena<> *alloc, ptrdiff_t v) const - -> Loop * { + [[nodiscard]] auto removeLoop(Arena<> *alloc, ptrdiff_t v) const -> Loop * { auto A{getA()}; v += getNumSymbols(); auto zeroNegPos = indsZeroNegPos(A(_, v)); diff --git a/include/Polyhedra/Polyhedra.hpp b/include/Polyhedra/Polyhedra.hpp index c187671e3..00e7857d5 100644 --- a/include/Polyhedra/Polyhedra.hpp +++ b/include/Polyhedra/Polyhedra.hpp @@ -3,6 +3,7 @@ #include "Polyhedra/Comparators.hpp" #include #include +#include #include #include #include @@ -19,7 +20,7 @@ namespace poly::poly { using math::DensePtrMatrix, math::MutDensePtrMatrix, math::EmptyMatrix, math::Row, math::Col, math::vector, math::matrix, math::_, math::end, - math::last; + math::last, math::operator<<; using utils::Arena; inline auto printPositive(std::ostream &os, ptrdiff_t stop) -> std::ostream & { for (ptrdiff_t i = 0; i < stop; ++i) os << "v_" << i << " >= 0\n"; @@ -229,13 +230,13 @@ struct BasePolyhedra { dropEmptyConstraints(getA()); if constexpr (HasEqualities) dropEmptyConstraints(getE()); } - friend inline auto operator<<(llvm::raw_ostream &os, const BasePolyhedra &p) - -> llvm::raw_ostream & { - auto &&os2 = printConstraints(os << "\n", p.getA()); + friend inline auto operator<<(std::ostream &os, const BasePolyhedra &p) + -> std::ostream & { + printConstraints(os << "\n", p.getA()); if constexpr (MaybeNonNeg) - if (p.isNonNegative()) printPositive(os2, p.getNumDynamic()); - if constexpr (HasEqualities) return printConstraints(os2, p.getE(), false); - return os2; + if (p.isNonNegative()) printPositive(os, p.getNumDynamic()); + if constexpr (HasEqualities) return printConstraints(os, p.getE(), false); + return os; } #ifndef NDEBUG [[gnu::used]] void dump() const { diff --git a/include/Support/Iterators.hpp b/include/Support/Iterators.hpp index fa1bc42e4..d312dbf9c 100644 --- a/include/Support/Iterators.hpp +++ b/include/Support/Iterators.hpp @@ -18,8 +18,8 @@ class VCycleIterator { public: using value_type = int32_t; constexpr VCycleIterator() noexcept = default; - constexpr VCycleIterator(const int32_t *data, int32_t start) noexcept - : data(data), state(start), start(start), dobreak(start < 0) {} + constexpr VCycleIterator(const int32_t *data_, int32_t start_) noexcept + : data(data_), state(start_), start(start_), dobreak(start_ < 0) {} constexpr auto operator*() const noexcept -> int32_t { return state; } constexpr auto operator++() noexcept -> VCycleIterator & { state = data[state]; @@ -64,10 +64,10 @@ class VCycleRange : public std::ranges::view_interface { int32_t start; public: - constexpr VCycleRange(math::PtrVector data, int32_t start) noexcept - : data(data.begin()), start(start) {} - constexpr VCycleRange(const int32_t *data, int32_t start) noexcept - : data(data), start(start) {} + constexpr VCycleRange(math::PtrVector data_, int32_t start_) noexcept + : data(data_.begin()), start(start_) {} + constexpr VCycleRange(const int32_t *data_, int32_t start_) noexcept + : data(data_), start(start_) {} [[nodiscard]] constexpr auto begin() const noexcept -> VCycleIterator { return {data, start}; @@ -87,8 +87,8 @@ class VForwardIterator { public: using value_type = int32_t; constexpr VForwardIterator() noexcept = default; - constexpr VForwardIterator(const int32_t *data, int32_t start) noexcept - : data{data}, state{start}, next{start < 0 ? start : data[start]} {} + constexpr VForwardIterator(const int32_t *data_, int32_t start_) noexcept + : data{data_}, state{start_}, next{start_ < 0 ? start_ : data_[start_]} {} constexpr auto operator*() const noexcept -> int32_t { return state; } constexpr auto operator++() noexcept -> VForwardIterator & { @@ -134,10 +134,11 @@ class VForwardRange : public std::ranges::view_interface { int32_t start; public: - constexpr VForwardRange(math::PtrVector data, int32_t start) noexcept - : data(data.begin()), start(start) {} - constexpr VForwardRange(const int32_t *data, int32_t start) noexcept - : data(data), start(start) {} + constexpr VForwardRange(math::PtrVector data_, + int32_t start_) noexcept + : data(data_.begin()), start(start_) {} + constexpr VForwardRange(const int32_t *data_, int32_t start_) noexcept + : data(data_), start(start_) {} [[nodiscard]] constexpr auto begin() const noexcept -> VForwardIterator { return {data, start}; diff --git a/include/Support/OStream.hpp b/include/Support/OStream.hpp index 1671b0830..5303a8095 100644 --- a/include/Support/OStream.hpp +++ b/include/Support/OStream.hpp @@ -13,7 +13,8 @@ template inline auto operator<<(llvm::raw_ostream &os, PtrVector const &A) -> llvm::raw_ostream & { std::ostringstream sos; - return os << printVector(sos, A).str(); + printVector(sos, A); + return os << sos.str(); } inline auto operator<<(llvm::raw_ostream &os, const AbstractVector auto &A) -> llvm::raw_ostream & { @@ -25,17 +26,18 @@ template inline auto operator<<(llvm::raw_ostream &os, PtrMatrix A) -> llvm::raw_ostream & { std::ostringstream sos; - return os << printMatrix(sos, A).str(); + printMatrix(sos, A); + return os << sos.str(); } template inline auto operator<<(llvm::raw_ostream &os, Array A) - -> std::ostream & { - return printMatrix(os, PtrMatrix{A}); + -> llvm::raw_ostream & { + return os << PtrMatrix{A}; } template inline auto operator<<(llvm::raw_ostream &os, Array A) - -> std::ostream & { - return printMatrix(os, PtrMatrix{A}); + -> llvm::raw_ostream & { + return os << PtrMatrix{A}; } } // namespace math namespace utils { diff --git a/test/ArrayReference.hpp b/test/ArrayReference.hpp index 33ec953fd..2af5f1b00 100644 --- a/test/ArrayReference.hpp +++ b/test/ArrayReference.hpp @@ -1,6 +1,7 @@ #pragma once #include "IR/Address.hpp" #include "Math/Math.hpp" +#include "Math/MatrixDimensions.hpp" #include "Polyhedra/Loops.hpp" #include #include @@ -8,7 +9,7 @@ namespace poly { using math::DenseMatrix, math::PtrMatrix, math::MutPtrMatrix, utils::Arena, - math::PtrVector, utils::NotNull; + math::PtrVector, math::DenseDims, utils::NotNull; struct ArrayReference { const llvm::SCEVUnknown *basePointer; @@ -16,7 +17,7 @@ struct ArrayReference { DenseMatrix indMat; DenseMatrix offMat; llvm::SmallVector sizes; - ArrayReference(const llvm::SCEVUnknown *p, poly::Loop *l, size_t dim) + ArrayReference(const llvm::SCEVUnknown *p, poly::Loop *l, unsigned dim) : basePointer(p), loop(l), indMat(DenseDims{loop->getNumLoops(), dim}), offMat(DenseDims{dim, 1}), sizes(dim) { indexMatrix() << 0; @@ -32,12 +33,13 @@ struct ArrayReference { return ptrdiff_t(offMat.numRow()); } }; -inline auto createMemAccess(Arena<> *alloc, ArrayReference &ar, - llvm::Instruction *IC, PtrVector omegas) - -> NotNull { +// inline auto createMemAccess(Arena<> *alloc, ArrayReference &ar, +// llvm::Instruction *IC, PtrVector +// omegas) +// -> NotNull { - IntMatrix indMatT(ar.indMat.transpose()); - return IR::Addr::construct(alloc, ar.basePointer, *ar.loop, IC, indMatT, - {ar.sizes, {}}, ar.offsetMatrix(), omegas); -} +// math::IntMatrix indMatT{ar.indMat.transpose()}; +// return IR::Addr::construct(alloc, ar.basePointer, *ar.loop, IC, indMatT, +// {ar.sizes, {}}, ar.offsetMatrix(), omegas); +// } } // namespace poly diff --git a/test/TestUtilities.hpp b/test/TestUtilities.hpp index 1de5f585a..dcd3a196d 100644 --- a/test/TestUtilities.hpp +++ b/test/TestUtilities.hpp @@ -4,7 +4,6 @@ #include #include #include -#include #include #include #include diff --git a/test/bumpmap_test.cpp b/test/bumpmap_test.cpp index 326e4a928..a6d9a5710 100644 --- a/test/bumpmap_test.cpp +++ b/test/bumpmap_test.cpp @@ -1,4 +1,5 @@ #include "Dicts/BumpMapSet.hpp" +#include #include // // NOLINTNEXTLINE(modernize-use-trailing-return-type) @@ -13,9 +14,21 @@ // } // NOLINTNEXTLINE(modernize-use-trailing-return-type) TEST(BumpDownMapTest, BasicAssertions) { - OwningArena<> alloc; + using M = poly::dict::amap; + static_assert( + std::same_as>>); + static_assert( + std::same_as< + M::allocator_type, + poly::utils::WArena, 16384, true>>); + + poly::utils::OwningArena<> alloc; + M::allocator_type walloc{&alloc}; + M::value_container_type mvals{walloc}; + // poly::math::BumpPtrVector vec{&alloc}; for (int i = 0; i < 100; ++i) { - poly::dict::amap map{&alloc}; + M map{&alloc}; for (int j = 0; j < 100; ++j) map.insert({j, j}); for (int j = 0; j < 100; ++j) EXPECT_EQ(map.find(j)->second, j); alloc.reset(); diff --git a/test/compat_test.cpp b/test/compat_test.cpp index 2cbbca17c..1dd02c051 100644 --- a/test/compat_test.cpp +++ b/test/compat_test.cpp @@ -2,6 +2,7 @@ #include "Polyhedra/Loops.hpp" #include "Support/OStream.hpp" #include "TestUtilities.hpp" +#include "Utilities/Valid.hpp" #include #include #include @@ -14,7 +15,7 @@ namespace poly { -using math::IntMatrix, utils::operator""_mat; +using math::IntMatrix, math::DenseMatrix, utils::operator""_mat; // NOLINTNEXTLINE(modernize-use-trailing-return-type) TEST(TrivialPruneBounds0, BasicAssertions) { @@ -150,7 +151,7 @@ TEST(AffineTest0, BasicAssertions) { llvm::errs() << "\nPermuting loops 1 and 2\n"; utils::OwningArena<> allocator; utils::NotNull affp021ptr{ - aff.rotate(allocator, "[1 0 0; 0 0 1; 0 1 0]"_mat, nullptr)}; + aff.rotate(&allocator, "[1 0 0; 0 0 1; 0 1 0]"_mat, nullptr)}; poly::Loop &affp021 = *affp021ptr; // Now that we've swapped loops 1 and 2, we should have // for m in 0:M-1, k in 1:N-1, n in 0:k-1 @@ -164,9 +165,9 @@ TEST(AffineTest0, BasicAssertions) { << "\n"; llvm::errs() << "Constructed affine obj\n"; llvm::errs() << "About to run first compat test\n"; - EXPECT_FALSE(affp021.zeroExtraItersUponExtending(tlf.getAlloc(), 1, false)); + EXPECT_FALSE(affp021.zeroExtraItersUponExtending(*tlf.getAlloc(), 1, false)); llvm::errs() << "About to run second compat test\n"; - EXPECT_TRUE(affp021.zeroExtraItersUponExtending(tlf.getAlloc(), 1, true)); + EXPECT_TRUE(affp021.zeroExtraItersUponExtending(*tlf.getAlloc(), 1, true)); // affp021.zeroExtraIterationsUponExtending(poset, 1, ) } @@ -198,8 +199,9 @@ TEST(NonUnimodularExperiment, BasicAssertions) { tlf.addLoop(std::move(B), 2); poly::Loop &aff2 = *tlf.getLoopNest(tlf.getNumLoopNests() - 1); EXPECT_FALSE(aff2.isEmpty()); - OwningArena<> allocator; - NotNull affp10{aff2.rotate(allocator, "[0 1; 1 0]"_mat, nullptr)}; + utils::OwningArena<> allocator; + utils::NotNull affp10{ + aff2.rotate(&allocator, "[0 1; 1 0]"_mat, nullptr)}; llvm::errs() << "Swapped order:\n"; #ifndef NDEBUG diff --git a/test/orthogonalize_test.cpp b/test/orthogonalize_test.cpp index 91efde138..d20446c09 100644 --- a/test/orthogonalize_test.cpp +++ b/test/orthogonalize_test.cpp @@ -11,7 +11,6 @@ #include #include #include -#include #include #include #include From 12df4e6136a490a266a69f6b05944951907fbd16 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Sun, 24 Sep 2023 18:43:18 -0400 Subject: [PATCH 029/112] some comments, mostly --- .github/workflows/ci.yml | 8 +- CMakeLists.txt | 2 +- benchmark/CMakeLists.txt | 4 +- compile_commands.json | 262 +++++++++++++++++++----------------- include/IR/CostFunction.hpp | 68 +++++++++- test/CMakeLists.txt | 5 +- 6 files changed, 212 insertions(+), 137 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a97f27093..ae8f287a8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,9 +10,9 @@ jobs: sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" sudo wget https://apt.llvm.org/llvm.sh sudo chmod +x llvm.sh - sudo ./llvm.sh 16 all + sudo ./llvm.sh 17 all sudo apt install g++-12 libgtest-dev ninja-build pkg-config cmake gcovr - sudo ln -s $(which opt-16) /usr/local/bin/opt + sudo ln -s $(which opt-17) /usr/local/bin/opt - run: cmake -G Ninja -S test -B build/test -DUSE_SANITIZER='Undefined' -DENABLE_TEST_COVERAGE=1 -DCMAKE_BUILD_TYPE=Debug -DENABLE_LLD=OFF env: CXX: g++-12 @@ -22,7 +22,7 @@ jobs: CTEST_OUTPUT_ON_FAILURE: 1 - run: cmake -G Ninja -S test -B builddirclang/test -DCMAKE_BUILD_TYPE=RelWithDebInfo -DUSE_SANITIZER='Undefined' -DCMAKE_PREFIX_PATH=/usr/local -DENABLE_LLD=OFF env: - CXX: clang++-16 + CXX: clang++-17 - run: cmake --build builddirclang/test - run: cmake --build builddirclang/test --target test env: @@ -37,7 +37,7 @@ jobs: # - uses: actions/checkout@v3 # - run: sudo xcode-select --switch /Library/Developer/CommandLineTools # - run: echo $(pkgutil --pkg-info=com.apple.pkg.CLTools_Executables) - # - run: brew install llvm@16 ninja pkg-config cmake gcovr # gcc + # - run: brew install llvm@17 ninja pkg-config cmake gcovr # gcc # - run: echo "/usr/local/opt/llvm/bin" >> $GITHUB_PATH # - run: echo $(which clang++) # - run: cmake -G Ninja -S test -B build/test -DUSE_SANITIZER='Undefined' -DCMAKE_PREFIX_PATH=/usr/local -DCMAKE_BUILD_TYPE=Debug -DENABLE_LLD=OFF diff --git a/CMakeLists.txt b/CMakeLists.txt index bf5ec5a04..e34370957 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,7 +45,7 @@ CPMAddPackage("gh:TheLartians/PackageProject.cmake@1.8.0") # clang;clang-tools-extra;lld;lldb;polly;pstl" "LLVM_ENABLE_RUNTIMES all" "LLVM_ENABLE_RTTI OFF" # "BUILD_SHARED_LIBS OFF" "LLVM_CCACHE_BUILD ON" "LLVM_OPTIMIZED_TABLEGEN ON" "LLVM_ENABLE_LTO ON" # "LLVM_ENABLE_Z3_SOLVER ON" ) -find_package(LLVM 16 REQUIRED CONFIG) +find_package(LLVM 17 REQUIRED CONFIG) list(APPEND CMAKE_MODULE_PATH ${LLVM_CMAKE_DIR}) # include(AddLLVM) include(${LLVM_DIR}/AddLLVM.cmake) diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt index 5b707b3bc..45aa4c9ae 100644 --- a/benchmark/CMakeLists.txt +++ b/benchmark/CMakeLists.txt @@ -36,7 +36,7 @@ CPMAddPackage( # file(GLOB_RECURSE headers CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/include/*.hpp) file(GLOB benchmarks CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) -find_package(LLVM 16 REQUIRED CONFIG) +find_package(LLVM 17 REQUIRED CONFIG) list(APPEND CMAKE_MODULE_PATH ${LLVM_CMAKE_DIR}) include(${LLVM_DIR}/AddLLVM.cmake) # message(STATUS "headers: ${headers}") add_executable(${PROJECT_NAME} ${headers} ${benchmarks}) @@ -78,7 +78,7 @@ if(ENABLE_NATIVE_COMPILATION) endif() set_target_properties( ${PROJECT_NAME} - PROPERTIES CXX_STANDARD 20 + PROPERTIES CXX_STANDARD 23 CXX_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN ON ) diff --git a/compile_commands.json b/compile_commands.json index 5e5110f6f..47c7c36cc 100644 --- a/compile_commands.json +++ b/compile_commands.json @@ -1,655 +1,667 @@ [ { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -fpch-instantiate-templates -Xclang -emit-pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -x c++-header -o CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.cxx", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -fpch-instantiate-templates -Xclang -emit-pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -x c++-header -o CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.cxx", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.cxx", "output": "CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/bumpmap_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/bumpmap_test.cpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/bumpmap_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/bumpmap_test.cpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/bumpmap_test.cpp", "output": "CMakeFiles/LoopModelsTests.dir/bumpmap_test.cpp.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/comparator_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/comparator_test.cpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/comparator_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/comparator_test.cpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/comparator_test.cpp", "output": "CMakeFiles/LoopModelsTests.dir/comparator_test.cpp.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/compat_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/compat_test.cpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/compat_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/compat_test.cpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/compat_test.cpp", "output": "CMakeFiles/LoopModelsTests.dir/compat_test.cpp.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/dependence_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/dependence_test.cpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/dependence_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/dependence_test.cpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/dependence_test.cpp", "output": "CMakeFiles/LoopModelsTests.dir/dependence_test.cpp.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/graph_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/graph_test.cpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/graph_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/graph_test.cpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/graph_test.cpp", "output": "CMakeFiles/LoopModelsTests.dir/graph_test.cpp.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/orthogonalize_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/orthogonalize_test.cpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/orthogonalize_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/orthogonalize_test.cpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/orthogonalize_test.cpp", "output": "CMakeFiles/LoopModelsTests.dir/orthogonalize_test.cpp.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/remarks_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/remarks_test.cpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/remarks_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/remarks_test.cpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/remarks_test.cpp", "output": "CMakeFiles/LoopModelsTests.dir/remarks_test.cpp.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -o CMakeFiles/gtest.dir/src/gtest-all.cc.o -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-all.cc", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -o CMakeFiles/gtest.dir/src/gtest-all.cc.o -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-all.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-all.cc", "output": "_deps/googletest-build/googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -o CMakeFiles/gtest_main.dir/src/gtest_main.cc.o -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest_main.cc", + "command": "/usr/bin/clang++ -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -o CMakeFiles/gtest_main.dir/src/gtest_main.cc.o -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest_main.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest_main.cc", "output": "_deps/googletest-build/googletest/CMakeFiles/gtest_main.dir/src/gtest_main.cc.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -fpch-instantiate-templates -Xclang -emit-pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -x c++-header -o CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.cxx", + "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -fpch-instantiate-templates -Xclang -emit-pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -x c++-header -o CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.cxx", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.cxx", "output": "LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -o CMakeFiles/LoopModels.dir/lib/TurboLoop.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/lib/TurboLoop.cpp", + "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -o CMakeFiles/LoopModels.dir/lib/TurboLoop.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/lib/TurboLoop.cpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/lib/TurboLoop.cpp", "output": "LoopModels/CMakeFiles/LoopModels.dir/lib/TurboLoop.cpp.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/BumpMapSet.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/BumpMapSet.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/BumpMapSet.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/BumpVector.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/BumpVector.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/BumpVector.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Array.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Array.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Array.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/Storage.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/Storage.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/Storage.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/ArrayOps.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/ArrayOps.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/ArrayOps.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Indexing.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Indexing.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Indexing.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/AxisTypes.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/AxisTypes.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/AxisTypes.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Invariant.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Invariant.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Invariant.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Iterators.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Iterators.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Iterators.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/MatrixDimensions.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/MatrixDimensions.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/MatrixDimensions.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Matrix.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Matrix.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Matrix.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/TypePromotion.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/TypePromotion.hpp" + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Vector.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Vector.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/UniformScaling.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/UniformScaling.hpp" + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/TypePromotion.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/TypePromotion.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Vector.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Vector.hpp" + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/UniformScaling.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/UniformScaling.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Rational.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Rational.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Rational.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/GreatestCommonDivisor.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/GreatestCommonDivisor.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/GreatestCommonDivisor.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Allocators.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Allocators.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Allocators.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Valid.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Valid.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Valid.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Optional.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Optional.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Optional.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include/ankerl/unordered_dense.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include/ankerl/unordered_dense.h", "file": "/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include/ankerl/unordered_dense.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Comparators.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Comparators.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Comparators.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Constraints.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Constraints.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Constraints.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/BitSets.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/BitSets.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/BitSets.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Comparisons.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Comparisons.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Comparisons.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/EmptyArrays.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/EmptyArrays.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/EmptyArrays.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Math.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Math.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Math.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/NormalForm.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/NormalForm.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/NormalForm.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Constructors.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Constructors.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Constructors.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/VectorGreatestCommonDivisor.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/VectorGreatestCommonDivisor.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/VectorGreatestCommonDivisor.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Simplex.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Simplex.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Simplex.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/MatrixStringParse.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/MatrixStringParse.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/MatrixStringParse.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Loops.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Loops.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Loops.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Polyhedra.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Polyhedra.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Polyhedra.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/RemarkAnalysis.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/RemarkAnalysis.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/RemarkAnalysis.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Support/OStream.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Support/OStream.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Support/OStream.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/TestUtilities.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/TestUtilities.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/TestUtilities.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/ArrayReference.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/ArrayReference.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/ArrayReference.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Address.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Address.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Address.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/InstructionCost.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/InstructionCost.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/InstructionCost.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Node.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Node.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Node.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/UnrolledList.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/UnrolledList.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/UnrolledList.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Users.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Users.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Users.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/ListRanges.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/ListRanges.hpp" + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Support/Iterators.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Support/Iterators.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/CostModeling.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/CostModeling.hpp" + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/ListRanges.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/ListRanges.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Graphs/Graphs.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Graphs/Graphs.hpp" + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/CostModeling.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/CostModeling.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/LoopBlock.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/LoopBlock.hpp" + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Graphs/Graphs.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Graphs/Graphs.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Cache.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Cache.hpp" + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/OptimizationPossibilities.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/OptimizationPossibilities.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/BBPredPath.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/BBPredPath.hpp" + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Hash.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Hash.hpp" }, { - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/MapVector.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/MapVector.hpp" + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", + "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Instruction.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Instruction.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Predicate.hpp", + "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Predicate.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Predicate.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/TinyVector.hpp", + "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/TinyVector.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/TinyVector.hpp" }, { - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Instruction.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Instruction.hpp" + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/LoopBlock.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/LoopBlock.hpp" +}, + +{ + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Cache.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Cache.hpp" +}, + +{ + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/BBPredPath.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/BBPredPath.hpp" +}, + +{ + "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/MapVector.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/MapVector.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/ScheduledNode.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/ScheduledNode.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/ScheduledNode.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Dependence.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Dependence.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Dependence.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/DependencyPolyhedra.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/DependencyPolyhedra.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/DependencyPolyhedra.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Orthogonalize.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Orthogonalize.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Orthogonalize.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Schedule.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Schedule.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Schedule.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Support/Iterators.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Support/Iterators.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/StaticArrays.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/StaticArrays.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/StaticArrays.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Graphs/IndexGraphs.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Graphs/IndexGraphs.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Graphs/IndexGraphs.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-assertion-result.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-assertion-result.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-assertion-result.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-message.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-message.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-message.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-port.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-port.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-port.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest-port.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest-port.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest-port.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-port-arch.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-port-arch.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-port-arch.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-death-test.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-death-test.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-death-test.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-death-test-internal.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-death-test-internal.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-death-test-internal.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-matchers.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-matchers.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-matchers.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-printers.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-printers.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-printers.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-internal.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-internal.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-internal.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-filepath.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-filepath.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-filepath.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-string.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-string.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-string.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-type-util.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-type-util.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-type-util.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest-printers.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest-printers.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest-printers.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-param-test.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-param-test.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-param-test.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-param-util.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-param-util.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-param-util.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-test-part.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-test-part.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-test-part.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-typed-test.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-typed-test.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-typed-test.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest_pred_impl.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest_pred_impl.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest_pred_impl.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest_prod.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest_prod.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest_prod.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-assertion-result.cc", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-assertion-result.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-assertion-result.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-death-test.cc", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-death-test.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-death-test.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-internal-inl.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-internal-inl.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-internal-inl.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-spi.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-spi.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-spi.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-filepath.cc", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-filepath.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-filepath.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-matchers.cc", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-matchers.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-matchers.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-port.cc", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-port.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-port.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-printers.cc", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-printers.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-printers.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-test-part.cc", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-test-part.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-test-part.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-typed-test.cc", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-typed-test.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-typed-test.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest.cc", + "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/TurboLoop.hpp", + "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/TurboLoop.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/TurboLoop.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/ControlFlowMerging.hpp", + "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/ControlFlowMerging.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/ControlFlowMerging.hpp" } ] diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp index fd394e873..f02662ef9 100644 --- a/include/IR/CostFunction.hpp +++ b/include/IR/CostFunction.hpp @@ -126,8 +126,72 @@ using math::DensePtrMatrix; /// of whether the pipeline might be very narrow. /// /// -/// -/// +/// Given `x[a*i + b*j]`, where neither `i` or `j` are vectorized (and `a` and +/// `b` are compile time constants), we use: +/// (a_g*U_i + b_g*U_j - a_g*b_g) / (U_i * U_j) +/// as the cost, where `a_g = abs(a/gcd(a,b))` and `b_g = abs(b/gcd(a,b))`. +/// +/// +/// Given `x[a*i + b*j + c*k]`, where neither `i` or `j` are vectorized (and +/// `a`, `b`, and `c` are compile time constants), we use: +/// (a_g*U_i + b_g*U_j + c_g*U_k - a_g*b_g - a_g*c_g - b_g*c_g + a_g*b_g*c_g) / +/// (U_i * U_j * U_k) +/// as the cost, where the `_g`s are same as before, but using the gcd of all +/// three `a`, `b`, and `c`. +/// NOTE: these, unlike the 2-case, are wrong, but they happen to be correct +/// when the gcds are all `1`. It hopefully at least dominates the actual cost. +/// Eventually, it'd be great to actually derive a general formula. +/// +/// For register consumption, we +/// 1. Determine an ordering of unroll factors for each inner most loop. +/// 2. Define a registers used as a function of these unroll factors. +/// +/// Loads from inner unrolls that don't depend on any outer-unrolls must have +/// lifetimes spanning all outer-unrolls, if they're re-used by an op depending +/// on that outer. +/// Our heuristic for ordering unrolls is based on the twin observations: +/// 1. Inner unrolls are likely to consume more registers for longer. +/// 2. More ops with overlapping lifetimes dependent on one particular loop +/// require more registers. +/// +/// As the ordering of unrolls influences register pressure, we sort them first +/// by register cost per unroll (placing those with the highest register cost +/// outside), and then by memory op cost within these categories, placing the +/// highest costs innermost (higher memory cost means lower unroll relative to +/// the lower cost, so that we get more reuse on the higher cost operations; +/// lower unroll means we place inside, reducing the cost of these unrolls). +/// +/// So, how do we define register cost per unroll in an unroll-order independent +/// manner, so that we can use this for determining the order? +/// for (int m=0; m*--> (Cmn +=) +/// B[k,n] -/ +/// +/// Register Costs: +/// Amk_rc = U_m * U_k // live until use +/// Bkn_rc = U_k * U_n // live until use +/// Cmn_rc = U_m * U_n // live until end of loop +/// Memory Op Costs, m-vectorized (assuming column-major): +/// Amk_rc = L_c * U_m * U_k +/// Bkn_rc = L_b * U_k * U_n +/// Cmn_rc = 0 * U_m * U_n +/// L_c > L_b, so A-contiguous load should be interior to B-broadcast load. +/// +/// As the cost function is evaluated many times, we try and move as much work +/// to the setup as possible. Loop cost is thus divided into some structured +/// components, and much of the interpreting work hoisted to a step defining a +/// parameterization. +/// Ideally, we would avoid repeating this work for different vectorization +/// decisions. However, vectorization decisions may impact unroll ordering +/// decisions. /// /// /// diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index bf694dbe6..179f2762d 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -57,7 +57,7 @@ file( ${CMAKE_CURRENT_SOURCE_DIR}/bumpmap_test.cpp ${CMAKE_CURRENT_SOURCE_DIR}/comparator_test.cpp ${CMAKE_CURRENT_SOURCE_DIR}/compat_test.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/dependence_test.cpp + # ${CMAKE_CURRENT_SOURCE_DIR}/dependence_test.cpp ${CMAKE_CURRENT_SOURCE_DIR}/graph_test.cpp ${CMAKE_CURRENT_SOURCE_DIR}/linear_algebra_test.cpp ${CMAKE_CURRENT_SOURCE_DIR}/linear_diophantine_test.cpp @@ -71,7 +71,7 @@ file( ) # list(FILTER tests EXCLUDE REGEX "remarks.*") for remarks test -find_package(LLVM 16 REQUIRED CONFIG) +find_package(LLVM 17 REQUIRED CONFIG) list(APPEND CMAKE_MODULE_PATH ${LLVM_CMAKE_DIR}) # include(AddLLVM) include(${LLVM_DIR}/AddLLVM.cmake) @@ -88,7 +88,6 @@ target_precompile_headers( ${PROJECT_NAME} PRIVATE - From 5aca8fb86a3efbb346f6ac372f22bd0fd6c8f379 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Thu, 5 Oct 2023 02:47:14 -0400 Subject: [PATCH 030/112] start adding experimental trie --- include/Dicts/Trie.hpp | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 include/Dicts/Trie.hpp diff --git a/include/Dicts/Trie.hpp b/include/Dicts/Trie.hpp new file mode 100644 index 000000000..ce84719f8 --- /dev/null +++ b/include/Dicts/Trie.hpp @@ -0,0 +1,41 @@ +#pragma once +#include +#include +#include + +namespace poly::dict { +// Based on implementation from https://nullprogram.com/blog/2023/09/30/ +// Blog included statement: All information on this blog, unless otherwise +// noted, is hereby released into the public domain, with no rights reserved. +template struct TrieMap { + K first; + V second; + TrieMap *children[4]{}; + + constexpr auto find(const K &k) -> TrieMap * { + if (k == first) return this; + TrieMap *m = this; + uint64_t h = ankerl::unordered_dense::hash{}(k); + for (;; h <<= 2) { + m = m->children[h >> 62]; + if (!m) return nullptr; + if (k == m->first) return m; + } + } + auto operator[](utils::NotNull> alloc, const K &k) -> V & { + if (k == first) return second; + TrieMap *m = this, *c = nullptr; + uint64_t h = ankerl::unordered_dense::hash{}(k); + for (;; h <<= 2) { + c = m->children[h >> 62]; + if (!c) break; + if (k == c->first) return c->second; + m = c; + } + m->children[h >> 62] = alloc->create>(); + c = m->children[h >> 62]; + c->first = k; + return c->second; + } +}; +} // namespace poly::dict From e7b54744e4bbc50264130005d4b6595ddb9d0336 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Fri, 6 Oct 2023 04:15:29 -0400 Subject: [PATCH 031/112] minor progress --- benchmark/include/map_benchmark.hpp | 6 +- include/Dicts/Trie.hpp | 105 +++++++++++++++++++++------- 2 files changed, 83 insertions(+), 28 deletions(-) diff --git a/benchmark/include/map_benchmark.hpp b/benchmark/include/map_benchmark.hpp index b1cca726f..083661fde 100644 --- a/benchmark/include/map_benchmark.hpp +++ b/benchmark/include/map_benchmark.hpp @@ -1,13 +1,11 @@ #pragma once - -#include "Containers/BumpMapSet.hpp" +#include "Dicts/BumpMapSet.hpp" #include "Dicts/BumpVector.hpp" +#include "Dicts/Trie.hpp" #include "Utilities/Allocators.hpp" #include #include -#include #include -#include #include #include #include diff --git a/include/Dicts/Trie.hpp b/include/Dicts/Trie.hpp index ce84719f8..21f3b78ca 100644 --- a/include/Dicts/Trie.hpp +++ b/include/Dicts/Trie.hpp @@ -2,40 +2,97 @@ #include #include #include +#include namespace poly::dict { -// Based on implementation from https://nullprogram.com/blog/2023/09/30/ -// Blog included statement: All information on this blog, unless otherwise -// noted, is hereby released into the public domain, with no rights reserved. -template struct TrieMap { +// Idea from from https://nullprogram.com/blog/2023/09/30/ +template struct TrieMapNode { K first; V second; - TrieMap *children[4]{}; + std::array *, 4> children{}; - constexpr auto find(const K &k) -> TrieMap * { - if (k == first) return this; - TrieMap *m = this; - uint64_t h = ankerl::unordered_dense::hash{}(k); - for (;; h <<= 2) { - m = m->children[h >> 62]; - if (!m) return nullptr; - if (k == m->first) return m; - } + constexpr auto find(const K &k) -> TrieMapNode * { + return findChild(k).child; } auto operator[](utils::NotNull> alloc, const K &k) -> V & { - if (k == first) return second; - TrieMap *m = this, *c = nullptr; + Child c = findChild(k); + if (c.child) return c.second; + invariant(c.parent != nullptr); + invariant(c.index < 4); + c.parent[c.index] = alloc->create(); + c.parent[c.index]->first = k; + return c.parent[c.index]->second; + } + +protected: + struct Child { + TrieMapNode *child; + TrieMapNode *parent; + uint64_t index; // child == parent->children[index]; + }; + constexpr auto firstChild() -> Child { + for (int i = 0; i < 4; ++i) + if (TrieMapNode *c = children[i]) return Child{c, this, i}; + return Child{nullptr, this, 0}; + } + constexpr auto isLeaf() -> bool { return !std::ranges::any_of(children); } + constexpr auto numChildren() -> int { + int count = 0; + for (auto c : children) count += (c != nullptr); + return count; + } + auto findChild(const K &k) -> Child { + if (k == first) return {this, nullptr, 0}; + TrieMapNode *p = this, *c = nullptr; uint64_t h = ankerl::unordered_dense::hash{}(k); for (;; h <<= 2) { - c = m->children[h >> 62]; - if (!c) break; - if (k == c->first) return c->second; - m = c; + c = p->children[h >> 62]; + if (!c || (c->first == k)) return {c, p, h >> 62}; + p = c; } - m->children[h >> 62] = alloc->create>(); - c = m->children[h >> 62]; - c->first = k; - return c->second; + } + // Returns the removed node + auto eraseImpl(const K &k) -> TrieMapNode * { + Child child = findChild(k); + if (!child.child) return nullptr; + // we're erasing `child` + Child l = child.child->firstChild(); + if (l.child) { + for (;;) { + Child n = l.child->firstChild(); + if (!n.child) break; + l = n; + } + l.parent.children[l.index] = nullptr; // leaf is moved up + l.child.children = child.child.children; // leaf takes child's children + } + child.parent[child.index] = l.child; // leaf replaces deleted + + return child.child; + } +}; + +template +struct TrieMap : TrieMapNode { + using BaseT = TrieMapNode; + BaseT *list{}; + // TODO: implement using `list` to avoid allocs + void erase(const K &k) { + BaseT erased = this->eraseImpl(k); + erased.children[0] = list; + list = erased; } }; + +template struct TrieMap : TrieMapNode { + using BaseT = TrieMapNode; + void erase(const K &k) { this->eraseImpl(k); } +}; + +static_assert(sizeof(TrieMap) == + sizeof(TrieMapNode)); +static_assert(sizeof(TrieMap) == + sizeof(TrieMapNode) + sizeof(TrieMapNode *)); +// static_assert(sizeof(std::array*,0 >)==1); + } // namespace poly::dict From 6403e250d9ec436b7d68cefc5225f89c4fc6c93d Mon Sep 17 00:00:00 2001 From: chriselrod Date: Tue, 10 Oct 2023 04:33:49 -0400 Subject: [PATCH 032/112] cpp23 --- CMakeLists.txt | 2 +- compile_commands.json | 148 ++++++++++++++++++++--------------------- include/Dicts/Trie.hpp | 23 ++++++- test/CMakeLists.txt | 2 +- 4 files changed, 98 insertions(+), 77 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e34370957..ecacd1716 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,7 +85,7 @@ add_library(${PROJECT_NAME} MODULE ${headers} ${sources}) set(CXX_STANDARD_REQUIRED ON) set_target_properties( ${PROJECT_NAME} - PROPERTIES CXX_STANDARD 20 + PROPERTIES CXX_STANDARD 23 CXX_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN ON ) diff --git a/compile_commands.json b/compile_commands.json index 47c7c36cc..fd29aeefc 100644 --- a/compile_commands.json +++ b/compile_commands.json @@ -1,56 +1,56 @@ [ { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -fpch-instantiate-templates -Xclang -emit-pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -x c++-header -o CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.cxx", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -fpch-instantiate-templates -Xclang -emit-pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -x c++-header -o CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.cxx", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.cxx", "output": "CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/bumpmap_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/bumpmap_test.cpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/bumpmap_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/bumpmap_test.cpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/bumpmap_test.cpp", "output": "CMakeFiles/LoopModelsTests.dir/bumpmap_test.cpp.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/comparator_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/comparator_test.cpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/comparator_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/comparator_test.cpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/comparator_test.cpp", "output": "CMakeFiles/LoopModelsTests.dir/comparator_test.cpp.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/compat_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/compat_test.cpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/compat_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/compat_test.cpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/compat_test.cpp", "output": "CMakeFiles/LoopModelsTests.dir/compat_test.cpp.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/dependence_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/dependence_test.cpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/dependence_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/dependence_test.cpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/dependence_test.cpp", "output": "CMakeFiles/LoopModelsTests.dir/dependence_test.cpp.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/graph_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/graph_test.cpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/graph_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/graph_test.cpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/graph_test.cpp", "output": "CMakeFiles/LoopModelsTests.dir/graph_test.cpp.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/orthogonalize_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/orthogonalize_test.cpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/orthogonalize_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/orthogonalize_test.cpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/orthogonalize_test.cpp", "output": "CMakeFiles/LoopModelsTests.dir/orthogonalize_test.cpp.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/remarks_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/remarks_test.cpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/remarks_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/remarks_test.cpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/remarks_test.cpp", "output": "CMakeFiles/LoopModelsTests.dir/remarks_test.cpp.o" }, @@ -71,387 +71,387 @@ { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -fpch-instantiate-templates -Xclang -emit-pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -x c++-header -o CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.cxx", + "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++23 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -fpch-instantiate-templates -Xclang -emit-pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -x c++-header -o CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.cxx", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.cxx", "output": "LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -o CMakeFiles/LoopModels.dir/lib/TurboLoop.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/lib/TurboLoop.cpp", + "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++23 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -o CMakeFiles/LoopModels.dir/lib/TurboLoop.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/lib/TurboLoop.cpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/lib/TurboLoop.cpp", "output": "LoopModels/CMakeFiles/LoopModels.dir/lib/TurboLoop.cpp.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/BumpMapSet.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/BumpMapSet.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/BumpMapSet.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/BumpVector.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/BumpVector.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/BumpVector.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Array.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Array.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Array.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/Storage.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/Storage.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/Storage.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/ArrayOps.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/ArrayOps.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/ArrayOps.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Indexing.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Indexing.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Indexing.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/AxisTypes.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/AxisTypes.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/AxisTypes.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Invariant.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Invariant.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Invariant.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Iterators.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Iterators.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Iterators.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/MatrixDimensions.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/MatrixDimensions.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/MatrixDimensions.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Matrix.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Matrix.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Matrix.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Vector.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Vector.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Vector.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/TypePromotion.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/TypePromotion.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/TypePromotion.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/UniformScaling.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/UniformScaling.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/UniformScaling.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Rational.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Rational.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Rational.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/GreatestCommonDivisor.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/GreatestCommonDivisor.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/GreatestCommonDivisor.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Allocators.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Allocators.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Allocators.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Valid.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Valid.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Valid.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Optional.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Optional.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Optional.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include/ankerl/unordered_dense.h", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include/ankerl/unordered_dense.h", "file": "/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include/ankerl/unordered_dense.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Comparators.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Comparators.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Comparators.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Constraints.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Constraints.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Constraints.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/BitSets.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/BitSets.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/BitSets.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Comparisons.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Comparisons.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Comparisons.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/EmptyArrays.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/EmptyArrays.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/EmptyArrays.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Math.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Math.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Math.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/NormalForm.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/NormalForm.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/NormalForm.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Constructors.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Constructors.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Constructors.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/VectorGreatestCommonDivisor.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/VectorGreatestCommonDivisor.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/VectorGreatestCommonDivisor.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Simplex.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Simplex.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Simplex.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/MatrixStringParse.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/MatrixStringParse.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/MatrixStringParse.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Loops.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Loops.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Loops.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Polyhedra.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Polyhedra.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Polyhedra.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/RemarkAnalysis.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/RemarkAnalysis.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/RemarkAnalysis.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Support/OStream.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Support/OStream.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Support/OStream.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/TestUtilities.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/TestUtilities.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/TestUtilities.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/ArrayReference.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/ArrayReference.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/ArrayReference.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Address.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Address.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Address.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/InstructionCost.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/InstructionCost.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/InstructionCost.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Node.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Node.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Node.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/UnrolledList.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/UnrolledList.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/UnrolledList.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Users.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Users.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Users.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Support/Iterators.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Support/Iterators.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Support/Iterators.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/ListRanges.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/ListRanges.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/ListRanges.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/CostModeling.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/CostModeling.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/CostModeling.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Graphs/Graphs.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Graphs/Graphs.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Graphs/Graphs.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/OptimizationPossibilities.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/OptimizationPossibilities.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/OptimizationPossibilities.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Hash.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Hash.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Hash.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Instruction.hpp", + "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++23 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Instruction.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Instruction.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Predicate.hpp", + "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++23 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Predicate.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Predicate.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/TinyVector.hpp", + "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++23 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/TinyVector.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/TinyVector.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/LoopBlock.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/LoopBlock.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/LoopBlock.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Cache.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Cache.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Cache.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/BBPredPath.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/BBPredPath.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/BBPredPath.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/MapVector.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/MapVector.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/MapVector.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/ScheduledNode.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/ScheduledNode.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/ScheduledNode.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Dependence.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Dependence.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Dependence.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/DependencyPolyhedra.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/DependencyPolyhedra.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/DependencyPolyhedra.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Orthogonalize.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Orthogonalize.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Orthogonalize.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Schedule.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Schedule.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Schedule.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/StaticArrays.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/StaticArrays.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/StaticArrays.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++20 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Graphs/IndexGraphs.hpp", + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Graphs/IndexGraphs.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Graphs/IndexGraphs.hpp" }, @@ -655,13 +655,13 @@ { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/TurboLoop.hpp", + "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++23 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/TurboLoop.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/TurboLoop.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++20 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/ControlFlowMerging.hpp", + "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++23 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/ControlFlowMerging.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/ControlFlowMerging.hpp" } ] diff --git a/include/Dicts/Trie.hpp b/include/Dicts/Trie.hpp index 21f3b78ca..f5e5bf952 100644 --- a/include/Dicts/Trie.hpp +++ b/include/Dicts/Trie.hpp @@ -72,16 +72,37 @@ template struct TrieMapNode { } }; +// If `EfficientErase = true`, it stores a list of erased nodes. +// Future allocations will allocate from this list if possible. +// Thus, whenever using a pattern that involves interleaving erase and insertions, +// it is worth setting `EfficientErase = true`. +// It is common enough not to do this, that the option for `false` also exists. +// Don't pay for what you don't use. template struct TrieMap : TrieMapNode { using BaseT = TrieMapNode; - BaseT *list{}; + using BaseT::Child; + BaseT *list{nullptr}; // TODO: implement using `list` to avoid allocs void erase(const K &k) { BaseT erased = this->eraseImpl(k); erased.children[0] = list; list = erased; } + auto operator[](utils::NotNull> alloc, const K &k) -> V & { + Child c = findChild(k); + if (c.child) return c.second; + invariant(c.parent != nullptr); + invariant(c.index < 4); + if (list) { + c.parent[c.index] = list; + list = list.children[0]; + } else { + c.parent[c.index] = alloc->create(); + } + c.parent[c.index]->first = k; + return c.parent[c.index]->second; + } }; template struct TrieMap : TrieMapNode { diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 179f2762d..15ea5a60a 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -136,7 +136,7 @@ target_link_libraries( ${PROJECT_NAME} PRIVATE GTest::gtest_main LLVM unordered_dense::unordered_dense Math ) set(CXX_STANDARD_REQUIRED ON) -set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 20) +set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 23) set_target_properties( ${PROJECT_NAME} PROPERTIES ENVIRONMENT WORKING_DIRECTORY=${PROJECT_BINARY_DIR} ) From 26fd50d26b37d336fe79c98480e71f0469b54133 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Sat, 14 Oct 2023 02:22:48 -0400 Subject: [PATCH 033/112] A few updates for breakages --- benchmark/include/map_benchmark.hpp | 2 +- benchmark/include/simplex_benchmark.hpp | 8 +- compile_commands.json | 4 +- include/Dicts/BumpMapSet.hpp | 2 +- include/Dicts/BumpVector.hpp | 6 +- include/Dicts/Trie.hpp | 29 +++-- include/Graphs/Graphs.hpp | 2 +- include/IR/Address.hpp | 18 +-- include/IR/Cache.hpp | 2 +- include/IR/ControlFlowMerging.hpp | 2 +- include/IR/CostModeling.hpp | 6 +- include/IR/Instruction.hpp | 6 +- include/IR/Node.hpp | 4 +- include/IR/OptimizationPossibilities.hpp | 14 +-- include/IR/Predicate.hpp | 2 +- include/IR/Users.hpp | 4 +- include/LinearProgramming/LoopBlock.hpp | 4 +- include/LinearProgramming/ScheduledNode.hpp | 6 +- include/Polyhedra/Comparators.hpp | 4 +- include/Polyhedra/Dependence.hpp | 122 ++++++++++---------- include/Polyhedra/DependencyPolyhedra.hpp | 36 +++--- include/Polyhedra/Loops.hpp | 22 ++-- include/Polyhedra/Polyhedra.hpp | 4 +- include/Polyhedra/Schedule.hpp | 6 +- include/TurboLoop.hpp | 2 +- test/ArrayReference.hpp | 6 +- test/TestUtilities.hpp | 4 +- test/compat_test.cpp | 4 +- test/orthogonalize_test.cpp | 2 +- 29 files changed, 166 insertions(+), 167 deletions(-) diff --git a/benchmark/include/map_benchmark.hpp b/benchmark/include/map_benchmark.hpp index 083661fde..6d487382f 100644 --- a/benchmark/include/map_benchmark.hpp +++ b/benchmark/include/map_benchmark.hpp @@ -2,7 +2,7 @@ #include "Dicts/BumpMapSet.hpp" #include "Dicts/BumpVector.hpp" #include "Dicts/Trie.hpp" -#include "Utilities/Allocators.hpp" +#include "Alloc/Arena.hpp" #include #include #include diff --git a/benchmark/include/simplex_benchmark.hpp b/benchmark/include/simplex_benchmark.hpp index 798ce6e94..09af7becd 100644 --- a/benchmark/include/simplex_benchmark.hpp +++ b/benchmark/include/simplex_benchmark.hpp @@ -875,10 +875,10 @@ static void BM_Simplex0(benchmark::State &state) { OwningArena<> alloc; unsigned numCon = unsigned(tableau.numRow()) - 1; unsigned numVar = unsigned(tableau.numCol()) - 1; - NotNull simpBackup{Simplex::create(alloc, numCon, numVar, 0)}; + Valid simpBackup{Simplex::create(alloc, numCon, numVar, 0)}; simpBackup->getTableau() << tableau; // Simplex simpBackup{tableau}; - NotNull simp{Simplex::create(alloc, simpBackup->getNumCons(), + Valid simp{Simplex::create(alloc, simpBackup->getNumCons(), simpBackup->getNumVars(), 0)}; // Vector sol(37); for (auto b : state) { @@ -1114,9 +1114,9 @@ static void BM_Simplex1(benchmark::State &state) { OwningArena<> alloc; unsigned numCon = unsigned(tableau.numRow()) - 1; unsigned numVar = unsigned(tableau.numCol()) - 1; - NotNull simpBackup{Simplex::create(alloc, numCon, numVar, 0)}; + Valid simpBackup{Simplex::create(alloc, numCon, numVar, 0)}; simpBackup->getTableau() << tableau; - NotNull simp{Simplex::create(alloc, simpBackup->getNumCons(), + Valid simp{Simplex::create(alloc, simpBackup->getNumCons(), simpBackup->getNumVars(), 0)}; for (auto b : state) { *simp << *simpBackup; diff --git a/compile_commands.json b/compile_commands.json index fd29aeefc..680a03264 100644 --- a/compile_commands.json +++ b/compile_commands.json @@ -181,8 +181,8 @@ { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Allocators.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Allocators.hpp" + "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Alloc/Arena.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Alloc/Arena.hpp" }, { diff --git a/include/Dicts/BumpMapSet.hpp b/include/Dicts/BumpMapSet.hpp index ce145327c..d14f87be2 100644 --- a/include/Dicts/BumpMapSet.hpp +++ b/include/Dicts/BumpMapSet.hpp @@ -1,7 +1,7 @@ #pragma once #include #include -#include +#include #include #include diff --git a/include/Dicts/BumpVector.hpp b/include/Dicts/BumpVector.hpp index bcc22821f..7d36231a9 100644 --- a/include/Dicts/BumpVector.hpp +++ b/include/Dicts/BumpVector.hpp @@ -1,13 +1,13 @@ #pragma once #include #include -#include +#include #include // In include/Dicts, as it primarily serves to support amap/aset namespace poly { -using utils::WArena, utils::Arena; +using utils::WArena, alloc::Arena; } // namespace poly namespace poly::math { @@ -31,7 +31,7 @@ template struct BumpPtrVector { [[no_unique_address]] T *mem; [[no_unique_address]] unsigned Size; [[no_unique_address]] unsigned Capacity; - [[no_unique_address]] NotNull> Alloc; + [[no_unique_address]] Valid> Alloc; constexpr BumpPtrVector(WArena a) : mem(a.allocate(InitialCapacity)), Size(0), Capacity(InitialCapacity), diff --git a/include/Dicts/Trie.hpp b/include/Dicts/Trie.hpp index f5e5bf952..7f175eb69 100644 --- a/include/Dicts/Trie.hpp +++ b/include/Dicts/Trie.hpp @@ -1,5 +1,5 @@ #pragma once -#include +#include #include #include #include @@ -14,7 +14,7 @@ template struct TrieMapNode { constexpr auto find(const K &k) -> TrieMapNode * { return findChild(k).child; } - auto operator[](utils::NotNull> alloc, const K &k) -> V & { + auto operator[](utils::Valid> alloc, const K &k) -> V & { Child c = findChild(k); if (c.child) return c.second; invariant(c.parent != nullptr); @@ -74,31 +74,30 @@ template struct TrieMapNode { // If `EfficientErase = true`, it stores a list of erased nodes. // Future allocations will allocate from this list if possible. -// Thus, whenever using a pattern that involves interleaving erase and insertions, -// it is worth setting `EfficientErase = true`. -// It is common enough not to do this, that the option for `false` also exists. -// Don't pay for what you don't use. +// Thus, whenever using a pattern that involves interleaving erase and +// insertions, it is worth setting `EfficientErase = true`. It is common enough +// not to do this, that the option for `false` also exists. Don't pay for what +// you don't use. template struct TrieMap : TrieMapNode { - using BaseT = TrieMapNode; - using BaseT::Child; - BaseT *list{nullptr}; + using NodeT = TrieMapNode; + NodeT *list{nullptr}; // TODO: implement using `list` to avoid allocs void erase(const K &k) { - BaseT erased = this->eraseImpl(k); - erased.children[0] = list; + NodeT* erased = this->eraseImpl(k); + erased->children[0] = list; list = erased; } - auto operator[](utils::NotNull> alloc, const K &k) -> V & { - Child c = findChild(k); + auto operator[](utils::Valid> alloc, const K &k) -> V & { + typename NodeT::Child c = findChild(k); if (c.child) return c.second; invariant(c.parent != nullptr); invariant(c.index < 4); if (list) { c.parent[c.index] = list; - list = list.children[0]; + list = list->children[0]; } else { - c.parent[c.index] = alloc->create(); + c.parent[c.index] = alloc->create(); } c.parent[c.index]->first = k; return c.parent[c.index]->second; diff --git a/include/Graphs/Graphs.hpp b/include/Graphs/Graphs.hpp index ed2fe0cf1..28c3031da 100644 --- a/include/Graphs/Graphs.hpp +++ b/include/Graphs/Graphs.hpp @@ -1,6 +1,6 @@ #pragma once #include -#include +#include namespace poly::graph { // Currently, only implements top sort, and Tarjan's strongly connected diff --git a/include/IR/Address.hpp b/include/IR/Address.hpp index cc429424c..4ff07d9d4 100644 --- a/include/IR/Address.hpp +++ b/include/IR/Address.hpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include #include @@ -78,7 +78,7 @@ class Addr : public Instruction { int32_t edgeIn{-1}; int32_t edgeOut{-1}; lp::ScheduledNode *node; - NotNull basePointer; + Valid basePointer; poly::Loop *loop{nullptr}; llvm::Instruction *instr; int64_t *offSym{nullptr}; @@ -148,7 +148,7 @@ class Addr : public Instruction { numLoops), basePointer(arrayPtr), instr(user){}; - constexpr void rotate(NotNull explicitLoop, + constexpr void rotate(Valid explicitLoop, SquarePtrMatrix Pinv, int64_t denom, PtrVector omega, int64_t *offsets) { loop = explicitLoop; @@ -281,7 +281,7 @@ class Addr : public Instruction { llvm::Instruction *user, PtrMatrix indMat, std::array, 2> szOff, PtrVector coffsets, int64_t *offsets, unsigned numLoops, - unsigned maxNumLoops) -> NotNull { + unsigned maxNumLoops) -> Valid { // we don't want to hold any other pointers that may need freeing unsigned arrayDim = szOff[0].size(), nOff = szOff[1].size(); size_t memNeeded = intMemNeeded(maxNumLoops, arrayDim); @@ -308,7 +308,7 @@ class Addr : public Instruction { std::copy_n(o.begin(), getCurrentDepth(), getFusionOmega().begin()); getFusionOmega().back() = o.back()--; } - [[nodiscard]] auto reload(Arena<> *alloc) -> NotNull { + [[nodiscard]] auto reload(Arena<> *alloc) -> Valid { size_t memNeeded = intMemNeeded(maxDepth, numDim); void *p = alloc->allocate(sizeof(Addr) + memNeeded * sizeof(int64_t)); *static_cast(p) = VK_Load; @@ -336,7 +336,7 @@ class Addr : public Instruction { return v->getKind() <= VK_Stow; } [[nodiscard]] constexpr auto getArrayPointer() const - -> NotNull { + -> Valid { return basePointer; } [[nodiscard]] auto getType() const -> llvm::Type * { @@ -347,7 +347,7 @@ class Addr : public Instruction { if (anyNEZero(indexMatrix()(i, _(d, end)))) return true; return false; } - [[nodiscard]] constexpr auto getAffLoop() const -> NotNull { + [[nodiscard]] constexpr auto getAffLoop() const -> Valid { return loop; } [[nodiscard]] constexpr auto getStoredVal() const -> Value * { @@ -497,10 +497,10 @@ class Addr : public Instruction { invariant(offSym != nullptr || numDynSym == 0); return {offSym, DenseDims{getArrayDim(), numDynSym}}; } - [[nodiscard]] constexpr auto getAffineLoop() -> NotNull { + [[nodiscard]] constexpr auto getAffineLoop() -> Valid { return loop; } - [[nodiscard]] constexpr auto sizesMatch(NotNull x) const -> bool { + [[nodiscard]] constexpr auto sizesMatch(Valid x) const -> bool { auto thisSizes = getSizes(), xSizes = x->getSizes(); return std::equal(thisSizes.begin(), thisSizes.end(), xSizes.begin(), xSizes.end()); diff --git a/include/IR/Cache.hpp b/include/IR/Cache.hpp index 061bbc5b7..de0a0d20f 100644 --- a/include/IR/Cache.hpp +++ b/include/IR/Cache.hpp @@ -145,7 +145,7 @@ struct TreeResult { [[nodiscard]] constexpr auto getAddr() const { return addr.getAddr(); } [[nodiscard]] constexpr auto getLoads() const { return addr.getLoads(); } [[nodiscard]] constexpr auto getStores() const { return addr.getStores(); } - void setLoopNest(NotNull L) const { + void setLoopNest(Valid L) const { for (Addr *A : getAddr()) A->setLoopNest(L); } constexpr auto operator*=(TreeResult tr) -> TreeResult & { diff --git a/include/IR/ControlFlowMerging.hpp b/include/IR/ControlFlowMerging.hpp index 479769b9c..b4b52423a 100644 --- a/include/IR/ControlFlowMerging.hpp +++ b/include/IR/ControlFlowMerging.hpp @@ -5,7 +5,7 @@ #include "IR/Cache.hpp" #include "IR/Instruction.hpp" #include "IR/Predicate.hpp" -#include "Utilities/Allocators.hpp" +#include "Alloc/Arena.hpp" #include #include #include diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index e56964447..8f134d4de 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -11,7 +11,7 @@ #include "Polyhedra/Dependence.hpp" #include #include -#include +#include #include #include #include @@ -168,7 +168,7 @@ template using Vec = math::ResizeableView; /// construction of the IR::Loop graph, from the fusion omegas class LoopTree { // The root of this subtree - NotNull loop; + Valid loop; // LoopTree *parent{nullptr}; // do we need this? Vec children{}; unsigned depth{0}; @@ -197,7 +197,7 @@ class LoopTree { // We also apply the rotation here. // For dependencies in SCC iteration, only indvar deps get iterated. auto [Pinv, denom] = math::NormalForm::scaledInv(node->getPhi()); - NotNull explicitLoop = + Valid explicitLoop = node->getLoopNest()->rotate(lalloc, Pinv, node->getOffset()); for (IR::Addr *m : node->localAddr()) { m->rotate(explicitLoop, Pinv, denom, node->getOffsetOmega(), diff --git a/include/IR/Instruction.hpp b/include/IR/Instruction.hpp index 90514ad71..c56d15e7d 100644 --- a/include/IR/Instruction.hpp +++ b/include/IR/Instruction.hpp @@ -7,7 +7,7 @@ #include "IR/Predicate.hpp" #include #include -#include +#include #include #include #include @@ -32,8 +32,8 @@ #include namespace poly { -using math::PtrVector, math::MutPtrVector, utils::Arena, utils::invariant, - utils::NotNull; +using math::PtrVector, math::MutPtrVector, alloc::Arena, utils::invariant, + utils::Valid; }; // namespace poly namespace poly::IR { diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index c88200c16..c8539045e 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -5,7 +5,7 @@ #include "IR/Users.hpp" #include "Polyhedra/Loops.hpp" #include "Support/Iterators.hpp" -#include "Utilities/Allocators.hpp" +#include "Alloc/Arena.hpp" #include "Utilities/ListRanges.hpp" #include #include @@ -22,7 +22,7 @@ namespace poly::poly { class Dependencies; } // namespace poly::poly namespace poly::IR { -using utils::NotNull, utils::invariant, utils::Arena, containers::UList; +using utils::Valid, utils::invariant, alloc::Arena, containers::UList; class Loop; /// We take an approach similar to LLVM's RTTI /// however, we want to take advantage of FAMs while having a "hieararchy" diff --git a/include/IR/OptimizationPossibilities.hpp b/include/IR/OptimizationPossibilities.hpp index 12fcce17e..db0b5d564 100644 --- a/include/IR/OptimizationPossibilities.hpp +++ b/include/IR/OptimizationPossibilities.hpp @@ -6,7 +6,7 @@ #include "Support/Iterators.hpp" #include #include -#include +#include #include #include #include @@ -75,7 +75,7 @@ class LoopDependencies { // We also do want an addrMap to associate uses of the same Addr public: - LoopDependencies(utils::Arena<> *a, unsigned numAddr, unsigned numLoops) + LoopDependencies(alloc::Arena<> *a, unsigned numAddr, unsigned numLoops) : deps{math::matrix(a, math::Row{numAddr}, math::Col{numLoops}, LoopDependency::NotNested())}, @@ -387,7 +387,7 @@ class LoopDependencies { : addrMap(alloc), numLoops(numLoops), numAddr(int32_t(numAddr)) {} LoopDependencies(const LoopDependencies &) = default; - static auto create(utils::Arena<> *alloc, unsigned numLoops, unsigned numAddr) + static auto create(alloc::Arena<> *alloc, unsigned numLoops, unsigned numAddr) -> LoopDependencies * { size_t size = size_t(numAddr) * (bytesPerAddr(numLoops) + sizeof(int32_t)) + @@ -484,10 +484,10 @@ class LoopDependencies { // adding an Addr should adds unroll options inline constexpr void - addAddr(utils::Arena<> *, + addAddr(alloc::Arena<> *, math::ResizeableView &, IR::Addr *); inline constexpr void - addOptOption(utils::Arena<> *, + addOptOption(alloc::Arena<> *, math::ResizeableView &, AddrSummary); }; @@ -556,7 +556,7 @@ class OptimizationOptions { // Here, we scan the addr so far, // I think we should have sub-tree ref sets. inline constexpr void LoopDependencies::addAddr( - utils::Arena<> *alloc, + alloc::Arena<> *alloc, math::ResizeableView &optops, IR::Addr *a) { int32_t id = numAddr; // something to think about here is how to handle the mix of `Addr` reference @@ -606,7 +606,7 @@ inline constexpr void LoopDependencies::addAddr( } inline constexpr void LoopDependencies::addOptOption( - utils::Arena<> *alloc, + alloc::Arena<> *alloc, math::ResizeableView &optops, AddrSummary s) { // scan older `AddrSummary`s, compare with `s` for (ptrdiff_t i = 0; i < numAddr - 1; ++i) { diff --git a/include/IR/Predicate.hpp b/include/IR/Predicate.hpp index 5f8ef3c04..a4e73637b 100644 --- a/include/IR/Predicate.hpp +++ b/include/IR/Predicate.hpp @@ -3,7 +3,7 @@ #include "Containers/UnrolledList.hpp" #include "Dicts/BumpVector.hpp" #include -#include +#include #include #include #include diff --git a/include/IR/Users.hpp b/include/IR/Users.hpp index ab67c9cf1..4c8733689 100644 --- a/include/IR/Users.hpp +++ b/include/IR/Users.hpp @@ -1,12 +1,12 @@ #pragma once #include "Utilities/Invariant.hpp" -#include +#include #include #include namespace poly::IR { -using utils::Arena, utils::invariant; +using alloc::Arena, utils::invariant; class Value; class Instruction; class Addr; diff --git a/include/LinearProgramming/LoopBlock.hpp b/include/LinearProgramming/LoopBlock.hpp index 861736725..b411d4a43 100644 --- a/include/LinearProgramming/LoopBlock.hpp +++ b/include/LinearProgramming/LoopBlock.hpp @@ -17,7 +17,7 @@ #include #include #include -#include +#include #include #include #include @@ -1075,7 +1075,7 @@ class LoopBlock { C(_(cc, ccc), _(po, po + bnd.numCol())) << bnd; } } - void addIndependentSolutionConstraints(NotNull omniSimplex, + void addIndependentSolutionConstraints(Valid omniSimplex, const ScheduledNode *nodes, unsigned d, CoefCounts counts) { // omniSimplex->setNumCons(omniSimplex->getNumCons() + diff --git a/include/LinearProgramming/ScheduledNode.hpp b/include/LinearProgramming/ScheduledNode.hpp index b03b815a7..a869fabe4 100644 --- a/include/LinearProgramming/ScheduledNode.hpp +++ b/include/LinearProgramming/ScheduledNode.hpp @@ -19,7 +19,7 @@ using math::PtrVector, math::MutPtrVector, math::DensePtrMatrix, math::MutDensePtrMatrix, math::SquarePtrMatrix, math::MutSquarePtrMatrix, math::end, math::last, math::_, math::Simplex; using poly::Dependence, poly::DepPoly; -using utils::NotNull, utils::invariant, utils::Optional, utils::Arena; +using utils::Valid, utils::invariant, utils::Optional, alloc::Arena; /// ScheduledNode /// Represents a set of memory accesses that are optimized together in the LP. @@ -32,8 +32,8 @@ using utils::NotNull, utils::invariant, utils::Optional, utils::Arena; /// class ScheduledNode { - NotNull store; // linked list to loads, iterate over getChild - NotNull loopNest; + Valid store; // linked list to loads, iterate over getChild + Valid loopNest; ScheduledNode *next{nullptr}; ScheduledNode *component{nullptr}; // SCC cycle, or last node in a chain // Dependence *dep{nullptr}; // input edges (points to parents) diff --git a/include/Polyhedra/Comparators.hpp b/include/Polyhedra/Comparators.hpp index 829de427e..1e0c1387d 100644 --- a/include/Polyhedra/Comparators.hpp +++ b/include/Polyhedra/Comparators.hpp @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include #include #include @@ -24,7 +24,7 @@ using math::PtrVector, math::MutPtrVector, math::Vector, math::_, math::Row, math::NormalForm::simplifySystemsImpl, math::NormalForm::solveSystem, math::StridedVector, math::vector, math::matrix, math::identity, math::Simplex, math::DenseDims, math::DenseMatrix; -using utils::invariant, utils::Arena, utils::Optional; +using utils::invariant, alloc::Arena, utils::Optional; // For `== 0` constraints struct EmptyComparator { static constexpr auto getNumConstTerms() -> ptrdiff_t { return 0; } diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index a7d137192..eec6250a1 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -8,7 +8,7 @@ #include "Polyhedra/Schedule.hpp" #include "Support/Iterators.hpp" #include -#include +#include #include #include #include @@ -29,11 +29,11 @@ class Dependence { private: // // - NotNull depPoly; - NotNull dependenceSatisfaction; - NotNull dependenceBounding; - NotNull in; - NotNull out; + Valid depPoly; + Valid dependenceSatisfaction; + Valid dependenceBounding; + Valid in; + Valid out; // Dependence *nextInput{nullptr}; // all share same `in` // Dependence *nextOutput{nullptr}; // // all share same `out` @@ -45,7 +45,7 @@ class Dependence { std::array satLvl; bool forward; - constexpr auto getSimplexPair() -> std::array, 2> { + constexpr auto getSimplexPair() -> std::array, 2> { return {dependenceSatisfaction, dependenceBounding}; } @@ -61,12 +61,12 @@ class Dependence { // [[nodiscard]] constexpr auto getNextOutput() const -> const Dependence * { // return nextOutput; // } - [[nodiscard]] constexpr auto input() -> NotNull { return in; } - [[nodiscard]] constexpr auto output() -> NotNull { return out; } - [[nodiscard]] constexpr auto input() const -> NotNull { + [[nodiscard]] constexpr auto input() -> Valid { return in; } + [[nodiscard]] constexpr auto output() -> Valid { return out; } + [[nodiscard]] constexpr auto input() const -> Valid { return in; } - [[nodiscard]] constexpr auto output() const -> NotNull { + [[nodiscard]] constexpr auto output() const -> Valid { return out; } // constexpr auto setNextInput(Dependence *n) -> Dependence * { @@ -75,14 +75,14 @@ class Dependence { // constexpr auto setNextOutput(Dependence *n) -> Dependence * { // return nextOutput = n; // } - constexpr Dependence(NotNull poly, - std::array, 2> depSatBound, - NotNull i, NotNull o, bool fwd) + constexpr Dependence(Valid poly, + std::array, 2> depSatBound, + Valid i, Valid o, bool fwd) : depPoly(poly), dependenceSatisfaction(depSatBound[0]), dependenceBounding(depSatBound[1]), in(i), out(o), forward(fwd) {} - constexpr Dependence(NotNull poly, - std::array, 2> depSatBound, - NotNull i, NotNull o, + constexpr Dependence(Valid poly, + std::array, 2> depSatBound, + Valid i, Valid o, std::array sL, bool fwd) : depPoly(poly), dependenceSatisfaction(depSatBound[0]), dependenceBounding(depSatBound[1]), in(i), out(o), satLvl(sL), @@ -169,9 +169,9 @@ class Dependence { return in->indexMatrix(); } // satisfies dep if it is empty when conditioning on inPhi and outPhi - void checkEmptySat(Arena<> *alloc, NotNull inLoop, + void checkEmptySat(Arena<> *alloc, Valid inLoop, const int64_t *inOff, DensePtrMatrix inPhi, - NotNull outLoop, const int64_t *outOff, + Valid outLoop, const int64_t *outOff, DensePtrMatrix outPhi) { if (!isForward()) { std::swap(inLoop, outLoop); @@ -246,10 +246,10 @@ class Dependence { getNumOmegaCoefficients() == size_t(dependenceSatisfaction->getConstraints().numCol())); } - [[nodiscard]] constexpr auto getDepPoly() -> NotNull { + [[nodiscard]] constexpr auto getDepPoly() -> Valid { return depPoly; } - [[nodiscard]] constexpr auto getDepPoly() const -> NotNull { + [[nodiscard]] constexpr auto getDepPoly() const -> Valid { return depPoly; } [[nodiscard]] constexpr auto getNumConstraints() const -> unsigned { @@ -329,8 +329,8 @@ class Dependence { return {phiCoefsIn, phiCoefsOut}; } [[nodiscard]] auto isSatisfied(Arena<> alloc, - NotNull schIn, - NotNull schOut) const + Valid schIn, + Valid schOut) const -> bool { unsigned numLoopsIn = in->getCurrentDepth(), numLoopsOut = out->getCurrentDepth(), @@ -424,8 +424,8 @@ class Dependence { return true; } [[nodiscard]] auto isSatisfied(Arena<> alloc, - NotNull sx, - NotNull sy, + Valid sx, + Valid sy, size_t d) const -> bool { unsigned numLambda = depPoly->getNumLambda(), nLoopX = depPoly->getDim0(), nLoopY = depPoly->getDim1(), numLoopsTotal = nLoopX + nLoopY; @@ -603,14 +603,14 @@ class Dependencies { } static constexpr auto memNeeded(size_t N) -> size_t { constexpr size_t memPer = sizeof(int32_t) * 2 + sizeof(DepPoly *) + - sizeof(NotNull) * 2 + + sizeof(Valid) * 2 + sizeof(bool) + sizeof(uint8_t); return N * memPer; } - void timelessCheck(Arena<> *alloc, NotNull dxy, NotNull x, - NotNull y, - std::array, 2> pair, bool isFwd) { + void timelessCheck(Arena<> *alloc, Valid dxy, Valid x, + Valid y, + std::array, 2> pair, bool isFwd) { const size_t numLambda = dxy->getNumLambda(); invariant(dxy->getTimeDim(), unsigned(0)); if (!isFwd) { @@ -620,9 +620,9 @@ class Dependencies { pair[0]->truncateVars(1 + numLambda + dxy->getNumScheduleCoef()); addEdge(alloc, Dependence{dxy, pair, x, y, isFwd}); } - void timelessCheck(Arena<> *alloc, NotNull dxy, NotNull x, - NotNull y, - std::array, 2> pair) { + void timelessCheck(Arena<> *alloc, Valid dxy, Valid x, + Valid y, + std::array, 2> pair) { return timelessCheck(alloc, dxy, x, y, pair, checkDirection(*alloc, pair, x, y, dxy->getNumLambda(), dxy->getNumVar() + 1)); @@ -630,16 +630,16 @@ class Dependencies { // emplaces dependencies with repeat accesses to the same memory across // time - void timeCheck(Arena<> *alloc, NotNull dxy, NotNull x, - NotNull y, - std::array, 2> pair) { + void timeCheck(Arena<> *alloc, Valid dxy, Valid x, + Valid y, + std::array, 2> pair) { bool isFwd = checkDirection(*alloc, pair, x, y, dxy->getNumLambda(), dxy->getA().numCol() - dxy->getTimeDim()); timeCheck(alloc, dxy, x, y, pair, isFwd); } - void timeCheck(Arena<> *alloc, NotNull dxy, NotNull x, - NotNull y, - std::array, 2> pair, bool isFwd) { + void timeCheck(Arena<> *alloc, Valid dxy, Valid x, + Valid y, + std::array, 2> pair, bool isFwd) { const unsigned numInequalityConstraintsOld = dxy->getNumInequalityConstraints(), numEqualityConstraintsOld = dxy->getNumEqualityConstraints(), @@ -649,9 +649,9 @@ class Dependencies { numScheduleCoefs = dxy->getNumScheduleCoef(); invariant(numLambda, dxy->getNumLambda()); // copy backup - std::array, 2> farkasBackups{pair[0]->copy(alloc), + std::array, 2> farkasBackups{pair[0]->copy(alloc), pair[1]->copy(alloc)}; - NotNull in = x, out = y; + Valid in = x, out = y; if (isFwd) { std::swap(farkasBackups[0], farkasBackups[1]); } else { @@ -750,11 +750,11 @@ class Dependencies { addEdge(alloc, dep1); } static auto checkDirection(Arena<> alloc, - const std::array, 2> &p, - NotNull x, - NotNull y, - NotNull xSchedule, - NotNull ySchedule, + const std::array, 2> &p, + Valid x, + Valid y, + Valid xSchedule, + Valid ySchedule, unsigned numLambda, Col nonTimeDim) -> bool { const auto &[fxy, fyx] = p; unsigned numLoopsX = x->getCurrentDepth(), numLoopsY = y->getCurrentDepth(), @@ -803,9 +803,9 @@ class Dependencies { } // returns `true` if forward, x->y static auto checkDirection(Arena<> alloc, - const std::array, 2> &p, - NotNull x, - NotNull y, unsigned numLambda, + const std::array, 2> &p, + Valid x, + Valid y, unsigned numLambda, Col nonTimeDim) -> bool { const auto &[fxy, fyx] = p; unsigned numLoopsX = x->getCurrentDepth(), nTD = unsigned(nonTimeDim); @@ -881,7 +881,7 @@ class Dependencies { return prevEdgeInOffset() + sizeof(int32_t); } [[nodiscard]] static constexpr auto depPolyOffset() -> size_t { - return depSatBndOffset() + sizeof(std::array, 2>); + return depSatBndOffset() + sizeof(std::array, 2>); } [[nodiscard]] static constexpr auto satLevelsOffset() -> size_t { return depPolyOffset() + sizeof(DepPoly *); @@ -938,14 +938,14 @@ class Dependencies { const void *p = data + prevEdgeInOffset() * getCapacity(); return static_cast(p); } - constexpr auto depSatBndPtr() -> std::array, 2> * { + constexpr auto depSatBndPtr() -> std::array, 2> * { void *p = data + depSatBndOffset() * getCapacity(); - return static_cast, 2> *>(p); + return static_cast, 2> *>(p); } [[nodiscard]] constexpr auto depSatBndPtr() const - -> const std::array, 2> * { + -> const std::array, 2> * { const void *p = data + depSatBndOffset() * getCapacity(); - return static_cast, 2> *>(p); + return static_cast, 2> *>(p); } constexpr auto depPolyPtr() -> DepPoly ** { void *p = data + depPolyOffset() * getCapacity(); @@ -1031,12 +1031,12 @@ class Dependencies { constexpr auto prevOut(ID i) -> int32_t & { return prevOutEdgePtr()[i.id]; } constexpr auto nextIn(ID i) -> int32_t & { return inEdgePtr()[i.id]; } constexpr auto prevIn(ID i) -> int32_t & { return prevInEdgePtr()[i.id]; } - constexpr auto depSatBnd(ID i) -> std::array, 2> & { + constexpr auto depSatBnd(ID i) -> std::array, 2> & { return depSatBndPtr()[i.id]; } constexpr auto depPoly(ID i) -> DepPoly *& { return depPolyPtr()[i.id]; } [[nodiscard]] constexpr auto depSatBnd(ID i) const - -> std::array, 2> { + -> std::array, 2> { return depSatBndPtr()[i.id]; } [[nodiscard]] constexpr auto depPoly(ID i) const -> DepPoly * { @@ -1076,7 +1076,7 @@ class Dependencies { } }; - void check(Arena<> *alloc, NotNull x, NotNull y) { + void check(Arena<> *alloc, Valid x, Valid y) { // TODO: implement gcd test // if (x.gcdKnownIndependent(y)) return {}; DepPoly *dxy{DepPoly::dependence(alloc, x, y)}; @@ -1088,16 +1088,16 @@ class Dependencies { // note that we set boundAbove=true, so we reverse the // dependence direction for the dependency we week, we'll // discard the program variables x then y - std::array, 2> pair(dxy->farkasPair(alloc)); + std::array, 2> pair(dxy->farkasPair(alloc)); if (dxy->getTimeDim()) timeCheck(alloc, dxy, x, y, pair); else timelessCheck(alloc, dxy, x, y, pair); } inline void copyDependencies(Arena<> *alloc, IR::Addr *src, IR::Addr *dst); // reload store `x` - auto reload(Arena<> *alloc, NotNull store) -> NotNull { - NotNull dxy{DepPoly::self(alloc, store)}; - std::array, 2> pair(dxy->farkasPair(alloc)); - NotNull load = store->reload(alloc); + auto reload(Arena<> *alloc, Valid store) -> Valid { + Valid dxy{DepPoly::self(alloc, store)}; + std::array, 2> pair(dxy->farkasPair(alloc)); + Valid load = store->reload(alloc); copyDependencies(alloc, store, load); if (dxy->getTimeDim()) timeCheck(alloc, dxy, store, load, pair, true); else timelessCheck(alloc, dxy, store, load, pair, true); diff --git a/include/Polyhedra/DependencyPolyhedra.hpp b/include/Polyhedra/DependencyPolyhedra.hpp index 81ddc9ce4..6a3a00a75 100644 --- a/include/Polyhedra/DependencyPolyhedra.hpp +++ b/include/Polyhedra/DependencyPolyhedra.hpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include #include @@ -270,7 +270,7 @@ class DepPoly : public BasePolyhedra { return std::distance( x.begin(), std::mismatch(x.begin(), x.end(), y.begin(), y.end()).first); } - static auto nullSpace(NotNull x, NotNull y) + static auto nullSpace(Valid x, Valid y) -> math::DenseMatrix { unsigned numLoopsCommon = findFirstNonEqual(x->getFusionOmega(), y->getFusionOmega()), @@ -288,7 +288,7 @@ class DepPoly : public BasePolyhedra { // returns rank x num loops return orthogonalNullSpace(std::move(A)); } - static auto nullSpace(NotNull x) + static auto nullSpace(Valid x) -> math::DenseMatrix { unsigned numLoopsCommon = x->getCurrentDepth(), dim = x->getArrayDim(), natDepth = x->getNaturalDepth(); @@ -338,19 +338,19 @@ class DepPoly : public BasePolyhedra { ((conCapacity + eqConCapacity) * (getNumVar() + 1) + timeDim) + sizeof(const llvm::SCEV *) * numDynSym; } - auto copy(Arena<> *alloc) const -> NotNull { + auto copy(Arena<> *alloc) const -> Valid { auto *p = alloc->template allocate(neededBytes()); std::memcpy(p, this, neededBytes()); - return NotNull{p}; + return Valid{p}; } - static auto dependence(Arena<> *alloc, NotNull aix, - NotNull aiy) -> DepPoly * { + static auto dependence(Arena<> *alloc, Valid aix, + Valid aiy) -> DepPoly * { assert(aix->sizesMatch(aiy)); unsigned numDep0Var = aix->getCurrentDepth(), numDep1Var = aiy->getCurrentDepth(), numVar = numDep0Var + numDep1Var; - NotNull loopx = aix->getAffLoop(); - NotNull loopy = aiy->getAffLoop(); + Valid loopx = aix->getAffLoop(); + Valid loopy = aiy->getAffLoop(); PtrMatrix Ax{loopx->getOuterA(numDep0Var)}, Ay{loopy->getOuterA(numDep1Var)}; auto Sx{loopx->getSyms()}, Sy{loopy->getSyms()}; @@ -436,9 +436,9 @@ class DepPoly : public BasePolyhedra { return nullptr; } // self dependence - static auto self(Arena<> *alloc, NotNull ai) - -> NotNull { - NotNull loop = ai->getAffLoop(); + static auto self(Arena<> *alloc, Valid ai) + -> Valid { + Valid loop = ai->getAffLoop(); unsigned numDepVar = ai->getCurrentDepth(), numVar = numDepVar + numDepVar; PtrMatrix B{loop->getOuterA(numDepVar)}; auto S{loop->getSyms()}; @@ -522,7 +522,7 @@ class DepPoly : public BasePolyhedra { // // Time parameters are carried over into farkas polys [[nodiscard]] auto farkasPair(Arena<> *alloc) const - -> std::array, 2> { + -> std::array, 2> { auto A{getA()}, E{getE()}; const ptrdiff_t numEqualityConstraintsOld = ptrdiff_t(E.numRow()); @@ -549,8 +549,8 @@ class DepPoly : public BasePolyhedra { const ptrdiff_t numLambda = posEqEnd + numEqualityConstraintsOld; const ptrdiff_t numVarNew = numVarInterest + numLambda; invariant(ptrdiff_t(getNumLambda()), numLambda); - // std::array, 2> pair; - NotNull fw = + // std::array, 2> pair; + Valid fw = math::Simplex::create(alloc, numConstraintsNew, numVarNew, 0); // Simplex &fw(pair[0]); // fw.resize(numConstraintsNew, numVarNew + 1); @@ -597,7 +597,7 @@ class DepPoly : public BasePolyhedra { // so far, both have been identical - NotNull bw = + Valid bw = math::Simplex::create(alloc, numConstraintsNew, numVarNew, 0); auto bCF{bw->getConstraints()}; bCF << fCF; @@ -630,9 +630,9 @@ class DepPoly : public BasePolyhedra { /// returns `true` if the array accesses are guaranteed independent /// conditioning on partial schedules xPhi and yPhi - [[nodiscard]] auto checkSat(Arena<> alloc, NotNull xLoop, + [[nodiscard]] auto checkSat(Arena<> alloc, Valid xLoop, const int64_t *xOff, DensePtrMatrix xPhi, - NotNull yLoop, + Valid yLoop, const int64_t *yOff, DensePtrMatrix yPhi) -> bool { // we take in loops because we might be moving deeper inside the loopnest diff --git a/include/Polyhedra/Loops.hpp b/include/Polyhedra/Loops.hpp index 10c6d14d5..5a57ce687 100644 --- a/include/Polyhedra/Loops.hpp +++ b/include/Polyhedra/Loops.hpp @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include #include #include @@ -35,7 +35,7 @@ namespace poly::poly { using math::IntMatrix, math::PtrVector, math::PtrMatrix, math::MutPtrMatrix; -using utils::Optional, utils::NotNull, utils::invariant; +using utils::Optional, utils::Valid, utils::invariant; inline auto isKnownOne(llvm::ScalarEvolution &SE, llvm::Value *v) -> bool { return v && SE.getSCEV(v)->isOne(); } @@ -359,7 +359,7 @@ class Loop : public BasePolyhedra { static inline auto construct(Arena<> *alloc, llvm::Loop *L, const llvm::SCEV *BT, llvm::ScalarEvolution &SE, llvm::OptimizationRemarkEmitter *ORE = nullptr) - -> NotNull { + -> Valid { // A holds symbols // B holds loop bounds // they're separate so we can grow them independently @@ -404,7 +404,7 @@ class Loop : public BasePolyhedra { invariant(1 + std::ssize(symbols), ptrdiff_t(A.numCol())); ptrdiff_t depth = maxDepth - minDepth; unsigned numConstraints = unsigned(A.numRow()), N = unsigned(A.numCol()); - NotNull aln{ + Valid aln{ Loop::allocate(alloc, L, numConstraints, depth, symbols, maxDepth)}; aln->getA()(_, _(0, N)) << A; // copy the included loops from B @@ -431,7 +431,7 @@ class Loop : public BasePolyhedra { /// offsets[0] = 2, then the first loop is shifted by 2. /// this shifting is applied before rotation. [[nodiscard]] auto rotate(Arena<> *alloc, DensePtrMatrix R, - const int64_t *offsets) const -> NotNull { + const int64_t *offsets) const -> Valid { // if offsets is not null, we have the equivalent of // A * O * [I 0; 0 R] // where O = I - [0 0; offsets 0], @@ -445,7 +445,7 @@ class Loop : public BasePolyhedra { auto A{getA()}; const auto [M, N] = A.size(); auto syms{getSyms()}; - NotNull aln{Loop::allocate(alloc, L, ptrdiff_t(M) + numExtraVar, + Valid aln{Loop::allocate(alloc, L, ptrdiff_t(M) + numExtraVar, numLoops, syms, nonNeg)}; auto B{aln->getA()}; invariant(B.numRow(), M + numExtraVar); @@ -477,12 +477,12 @@ class Loop : public BasePolyhedra { return aln; } [[nodiscard]] constexpr auto rotate(Arena<> *alloc, DensePtrMatrix R, - const int64_t *offsets) -> NotNull { + const int64_t *offsets) -> Valid { if (R == math::I) return this; return ((const Loop *)this)->rotate(alloc, R, offsets); } - [[nodiscard]] auto removeInnerMost(Arena<> *alloc) const -> NotNull { + [[nodiscard]] auto removeInnerMost(Arena<> *alloc) const -> Valid { // order is outer<->inner auto A{getA()}; auto ret = Loop::allocate(alloc, L->getParentLoop(), unsigned(A.numRow()), @@ -556,7 +556,7 @@ class Loop : public BasePolyhedra { -> PtrVector { return getA()(j, _(0, getNumSymbols())); } - [[nodiscard]] auto copy(Arena<> *alloc) const -> NotNull { + [[nodiscard]] auto copy(Arena<> *alloc) const -> Valid { auto ret = Loop::allocate(alloc, L, numConstraints, numLoops, getSyms(), isNonNegative()); ret->getA() << getA(); @@ -892,7 +892,7 @@ class Loop : public BasePolyhedra { [[nodiscard]] static auto allocate(Arena<> *alloc, llvm::Loop *L, unsigned numCon, unsigned numLoops, llvm::ArrayRef syms, - bool nonNegative) -> NotNull { + bool nonNegative) -> Valid { unsigned numDynSym = syms.size(); unsigned N = numLoops + numDynSym + 1; // extra capacity for adding 0 lower bounds later, see @@ -905,7 +905,7 @@ class Loop : public BasePolyhedra { auto *mem = (Loop *)alloc->allocate(sizeof(Loop) + memNeeded); auto *aln = std::construct_at(mem, L, numCon, numLoops, numDynSym, M); std::copy_n(syms.begin(), numDynSym, aln->getSyms().begin()); - return NotNull{aln}; + return Valid{aln}; } explicit constexpr Loop(llvm::Loop *loop, unsigned _numConstraints, unsigned _numLoops, unsigned _numDynSymbols, diff --git a/include/Polyhedra/Polyhedra.hpp b/include/Polyhedra/Polyhedra.hpp index 00e7857d5..4975acbf8 100644 --- a/include/Polyhedra/Polyhedra.hpp +++ b/include/Polyhedra/Polyhedra.hpp @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include #include #include @@ -21,7 +21,7 @@ namespace poly::poly { using math::DensePtrMatrix, math::MutDensePtrMatrix, math::EmptyMatrix, math::Row, math::Col, math::vector, math::matrix, math::_, math::end, math::last, math::operator<<; -using utils::Arena; +using alloc::Arena; inline auto printPositive(std::ostream &os, ptrdiff_t stop) -> std::ostream & { for (ptrdiff_t i = 0; i < stop; ++i) os << "v_" << i << " >= 0\n"; return os; diff --git a/include/Polyhedra/Schedule.hpp b/include/Polyhedra/Schedule.hpp index bf50d6ba1..2ac89eebd 100644 --- a/include/Polyhedra/Schedule.hpp +++ b/include/Polyhedra/Schedule.hpp @@ -1,7 +1,7 @@ #pragma once #include "Math/Array.hpp" -#include "Utilities/Allocators.hpp" +#include "Alloc/Arena.hpp" #include #include #include @@ -46,11 +46,11 @@ struct AffineSchedule { constexpr AffineSchedule() : mem(nullptr) {} constexpr AffineSchedule(int64_t *m) : mem(m) {} - constexpr AffineSchedule(utils::Arena<> *alloc, unsigned nL) + constexpr AffineSchedule(alloc::Arena<> *alloc, unsigned nL) : mem(alloc->allocate(requiredScheduleStorage(nL))) { mem[0] = nL; } - constexpr auto copy(utils::Arena<> *alloc) const -> AffineSchedule { + constexpr auto copy(alloc::Arena<> *alloc) const -> AffineSchedule { size_t reqMem = requiredScheduleStorage(getNumLoops()); AffineSchedule res{alloc->allocate(reqMem)}; std::copy_n(mem, reqMem, res.mem); diff --git a/include/TurboLoop.hpp b/include/TurboLoop.hpp index 807cbda85..e7832ef55 100644 --- a/include/TurboLoop.hpp +++ b/include/TurboLoop.hpp @@ -183,7 +183,7 @@ class TurboLoop { // we'd have to make sure none of the allocated instructions // can be referenced again (e.g., through the free list) // auto p = lalloc.checkpoint(); - NotNull AL = + Valid AL = poly::Loop::construct(lalloc, L, nwr.visit(BT), *SE); IR::TreeResult tr = parseExitBlocks(L); tr.rejectDepth = std::max(tr.rejectDepth, omega.size() - AL->getNumLoops()); diff --git a/test/ArrayReference.hpp b/test/ArrayReference.hpp index 2af5f1b00..0e1305b25 100644 --- a/test/ArrayReference.hpp +++ b/test/ArrayReference.hpp @@ -8,8 +8,8 @@ namespace poly { -using math::DenseMatrix, math::PtrMatrix, math::MutPtrMatrix, utils::Arena, - math::PtrVector, math::DenseDims, utils::NotNull; +using math::DenseMatrix, math::PtrMatrix, math::MutPtrMatrix, alloc::Arena, + math::PtrVector, math::DenseDims, utils::Valid; struct ArrayReference { const llvm::SCEVUnknown *basePointer; @@ -36,7 +36,7 @@ struct ArrayReference { // inline auto createMemAccess(Arena<> *alloc, ArrayReference &ar, // llvm::Instruction *IC, PtrVector // omegas) -// -> NotNull { +// -> Valid { // math::IntMatrix indMatT{ar.indMat.transpose()}; // return IR::Addr::construct(alloc, ar.basePointer, *ar.loop, IC, indMatT, diff --git a/test/TestUtilities.hpp b/test/TestUtilities.hpp index dcd3a196d..426e7c655 100644 --- a/test/TestUtilities.hpp +++ b/test/TestUtilities.hpp @@ -1,6 +1,6 @@ #pragma once #include "Polyhedra/Loops.hpp" -#include +#include #include #include #include @@ -44,7 +44,7 @@ class TestLoopFunction { size_t ptrIntOffset{0}; public: - auto getAlloc() -> utils::Arena<> * { return &alloc; } + auto getAlloc() -> alloc::Arena<> * { return &alloc; } auto getLoopNest(size_t i) -> poly::Loop * { return alns[i]; } auto getNumLoopNests() -> size_t { return alns.size(); } void addLoop(PtrMatrix A, size_t numLoops) { diff --git a/test/compat_test.cpp b/test/compat_test.cpp index 1dd02c051..234e9a6b2 100644 --- a/test/compat_test.cpp +++ b/test/compat_test.cpp @@ -150,7 +150,7 @@ TEST(AffineTest0, BasicAssertions) { llvm::errs() << "About to run first set of bounds tests\n"; llvm::errs() << "\nPermuting loops 1 and 2\n"; utils::OwningArena<> allocator; - utils::NotNull affp021ptr{ + utils::Valid affp021ptr{ aff.rotate(&allocator, "[1 0 0; 0 0 1; 0 1 0]"_mat, nullptr)}; poly::Loop &affp021 = *affp021ptr; // Now that we've swapped loops 1 and 2, we should have @@ -200,7 +200,7 @@ TEST(NonUnimodularExperiment, BasicAssertions) { poly::Loop &aff2 = *tlf.getLoopNest(tlf.getNumLoopNests() - 1); EXPECT_FALSE(aff2.isEmpty()); utils::OwningArena<> allocator; - utils::NotNull affp10{ + utils::Valid affp10{ aff2.rotate(&allocator, "[0 1; 1 0]"_mat, nullptr)}; llvm::errs() << "Swapped order:\n"; diff --git a/test/orthogonalize_test.cpp b/test/orthogonalize_test.cpp index d20446c09..6e12f4d91 100644 --- a/test/orthogonalize_test.cpp +++ b/test/orthogonalize_test.cpp @@ -29,7 +29,7 @@ using math::DenseMatrix, math::DenseDims, math::PtrMatrix, math::MutPtrMatrix, math::Col, math::end, math::_, utils::operator""_mat; namespace { -auto orthogonalize(utils::Arena<> *alloc, +auto orthogonalize(alloc::Arena<> *alloc, llvm::SmallVectorImpl const &ai) -> std::optional< std::pair>> { From f3e1ef2ed04f861428205ffdea884072648f0e41 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Sat, 14 Oct 2023 03:02:16 -0400 Subject: [PATCH 034/112] Mallocator --- include/Polyhedra/Comparators.hpp | 26 ++++++++++++++------------ include/Polyhedra/Polyhedra.hpp | 2 +- test/comparator_test.cpp | 2 +- tools/prettyprinters.py | 2 +- 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/include/Polyhedra/Comparators.hpp b/include/Polyhedra/Comparators.hpp index 1e0c1387d..5706b9014 100644 --- a/include/Polyhedra/Comparators.hpp +++ b/include/Polyhedra/Comparators.hpp @@ -1,6 +1,8 @@ #pragma once #include "Utilities/Optional.hpp" +#include +#include #include #include #include @@ -9,13 +11,11 @@ #include #include #include -#include #include #include #include #include #include -#include namespace poly::comparator { using math::PtrVector, math::MutPtrVector, math::Vector, math::_, math::Row, @@ -682,14 +682,14 @@ struct LinearSymbolicComparator static constexpr auto construct(PtrMatrix Ap, bool pos0) -> LinearSymbolicComparator { LinearSymbolicComparator cmp; - std::allocator alloc{}; + alloc::Mallocator alloc{}; cmp.init(alloc, Ap, pos0); return cmp; }; static constexpr auto construct(PtrMatrix Ap, PtrMatrix Ep, bool pos0) -> LinearSymbolicComparator { LinearSymbolicComparator cmp; - std::allocator alloc{}; + alloc::Mallocator alloc{}; cmp.init(alloc, Ap, Ep, pos0); return cmp; }; @@ -703,7 +703,7 @@ struct LinearSymbolicComparator ptrdiff_t numNonNeg) -> LinearSymbolicComparator { LinearSymbolicComparator cmp; - std::allocator alloc{}; + alloc::Mallocator alloc{}; cmp.initNonNegative(alloc, Ap, numNonNeg); return cmp; }; @@ -712,7 +712,7 @@ struct LinearSymbolicComparator ptrdiff_t numNonNeg) -> LinearSymbolicComparator { LinearSymbolicComparator cmp; - std::allocator alloc{}; + alloc::Mallocator alloc{}; cmp.initNonNegative(alloc, Ap, Ep, numNonNeg); return cmp; }; @@ -865,7 +865,7 @@ constexpr void moveEqualities(DenseMatrix &A, math::IntMatrix &E, } // NOLINTNEXTLINE(performance-unnecessary-value-param) -constexpr auto linear(std::allocator, PtrMatrix A, +constexpr auto linear(alloc::Mallocator, PtrMatrix A, EmptyMatrix, bool pos0) { return LinearSymbolicComparator::construct(A, pos0); } @@ -874,7 +874,7 @@ constexpr auto linear(Arena<> *alloc, PtrMatrix A, return PtrSymbolicComparator::construct(alloc, A, pos0); } // NOLINTNEXTLINE(performance-unnecessary-value-param) -constexpr auto linear(std::allocator, PtrMatrix A, +constexpr auto linear(alloc::Mallocator, PtrMatrix A, PtrMatrix E, bool pos0) { return LinearSymbolicComparator::construct(A, E, pos0); } @@ -884,8 +884,9 @@ constexpr auto linear(Arena<> *alloc, PtrMatrix A, } // NOLINTNEXTLINE(performance-unnecessary-value-param) -constexpr auto linearNonNegative(std::allocator, PtrMatrix A, - EmptyMatrix, ptrdiff_t numNonNeg) { +constexpr auto linearNonNegative(alloc::Mallocator, + PtrMatrix A, EmptyMatrix, + ptrdiff_t numNonNeg) { return LinearSymbolicComparator::constructNonNeg(A, numNonNeg); } constexpr auto linearNonNegative(Arena<> *alloc, PtrMatrix A, @@ -893,8 +894,9 @@ constexpr auto linearNonNegative(Arena<> *alloc, PtrMatrix A, return PtrSymbolicComparator::constructNonNeg(alloc, A, numNonNeg); } // NOLINTNEXTLINE(performance-unnecessary-value-param) -constexpr auto linearNonNegative(std::allocator, PtrMatrix A, - PtrMatrix E, ptrdiff_t numNonNeg) { +constexpr auto linearNonNegative(alloc::Mallocator, + PtrMatrix A, PtrMatrix E, + ptrdiff_t numNonNeg) { return LinearSymbolicComparator::constructNonNeg(A, E, numNonNeg); } constexpr auto linearNonNegative(Arena<> *alloc, PtrMatrix A, diff --git a/include/Polyhedra/Polyhedra.hpp b/include/Polyhedra/Polyhedra.hpp index 4975acbf8..2f1de3600 100644 --- a/include/Polyhedra/Polyhedra.hpp +++ b/include/Polyhedra/Polyhedra.hpp @@ -90,7 +90,7 @@ struct BasePolyhedra { if constexpr (HasEqualities) static_cast

(this)->truncNumEqCon(r); } [[nodiscard]] constexpr auto - initializeComparator(std::allocator alloc = + initializeComparator(alloc::Mallocator alloc = {}) // NOLINT(performance-unnecessary-value-param) -> comparator::LinearSymbolicComparator { if constexpr (MaybeNonNeg) diff --git a/test/comparator_test.cpp b/test/comparator_test.cpp index 4f42507c5..5df6100a5 100644 --- a/test/comparator_test.cpp +++ b/test/comparator_test.cpp @@ -23,7 +23,7 @@ TEST(BasicCompare, BasicAssertions) { // 0 0 -1 1 0 // 0 0 -1 0 1 ] IntMatrix A = "[-1 0 1 0 0; 0 -1 1 0 0; 0 0 -1 1 0; 0 0 -1 0 1]"_mat; - auto comp = poly::comparator::linear(std::allocator{}, A, + auto comp = poly::comparator::linear(alloc::Mallocator{}, A, EmptyMatrix{}, false); Vector query{{-1, 0, 0, 1, 0}}; diff --git a/tools/prettyprinters.py b/tools/prettyprinters.py index 9d041f8e9..b1cdcb207 100644 --- a/tools/prettyprinters.py +++ b/tools/prettyprinters.py @@ -100,7 +100,7 @@ def __init__(self, val): pp = gdb.printing.RegexpCollectionPrettyPrinter("LoopModels") pp.add_printer("poly::math::Array", "^poly::math::Array<.*, unsigned int>$", VectorPrinter) -pp.add_printer("poly::math::::ManagedArray", "^poly::math::ManagedArray<.*, unsigned int, .*, std::allocator<.*>, .*>$", VectorPrinter) +pp.add_printer("poly::math::::ManagedArray", "^poly::math::ManagedArray<.*, unsigned int, .*, alloc::Mallocator<.*>, .*>$", VectorPrinter) pp.add_printer( "poly::math::::Array", "^poly::math::::Array<.*, poly::math::::SquareDims>$", From 8885f40474ae2fdcd2de509206348c72ba503493 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Sun, 15 Oct 2023 02:42:18 -0400 Subject: [PATCH 035/112] More updates, and add a simplier inline trie --- include/Dicts/BumpMapSet.hpp | 2 +- include/Dicts/BumpVector.hpp | 2 +- include/Dicts/Trie.hpp | 79 +++++++++++++++++++++++++++++++++-- include/IR/Users.hpp | 1 - include/Support/Iterators.hpp | 2 - test/bumpmap_test.cpp | 2 +- 6 files changed, 79 insertions(+), 9 deletions(-) diff --git a/include/Dicts/BumpMapSet.hpp b/include/Dicts/BumpMapSet.hpp index d14f87be2..5fc93d8b3 100644 --- a/include/Dicts/BumpMapSet.hpp +++ b/include/Dicts/BumpMapSet.hpp @@ -35,6 +35,6 @@ struct aset // NOLINT(readability-identifier-naming) static_assert(std::same_as::value_container_type, math::BumpPtrVector>>); static_assert(std::same_as::allocator_type, - utils::WArena, 16384, true>>); + alloc::WArena, 16384, true>>); } // namespace poly::dict diff --git a/include/Dicts/BumpVector.hpp b/include/Dicts/BumpVector.hpp index 7d36231a9..ac6861755 100644 --- a/include/Dicts/BumpVector.hpp +++ b/include/Dicts/BumpVector.hpp @@ -7,7 +7,7 @@ // In include/Dicts, as it primarily serves to support amap/aset namespace poly { -using utils::WArena, alloc::Arena; +using alloc::WArena, alloc::Arena; } // namespace poly namespace poly::math { diff --git a/include/Dicts/Trie.hpp b/include/Dicts/Trie.hpp index 7f175eb69..5f03b1f3c 100644 --- a/include/Dicts/Trie.hpp +++ b/include/Dicts/Trie.hpp @@ -1,5 +1,6 @@ #pragma once #include +#include #include #include #include @@ -44,8 +45,7 @@ template struct TrieMapNode { auto findChild(const K &k) -> Child { if (k == first) return {this, nullptr, 0}; TrieMapNode *p = this, *c = nullptr; - uint64_t h = ankerl::unordered_dense::hash{}(k); - for (;; h <<= 2) { + for (uint64_t h = ankerl::unordered_dense::hash{}(k);; h <<= 2) { c = p->children[h >> 62]; if (!c || (c->first == k)) return {c, p, h >> 62}; p = c; @@ -84,7 +84,7 @@ struct TrieMap : TrieMapNode { NodeT *list{nullptr}; // TODO: implement using `list` to avoid allocs void erase(const K &k) { - NodeT* erased = this->eraseImpl(k); + NodeT *erased = this->eraseImpl(k); erased->children[0] = list; list = erased; } @@ -113,6 +113,79 @@ static_assert(sizeof(TrieMap) == sizeof(TrieMapNode)); static_assert(sizeof(TrieMap) == sizeof(TrieMapNode) + sizeof(TrieMapNode *)); + +// Optional can be specialized for types to add dead-values without requiring +// extra space. E.g., `sizeof(utils::Optional) == sizeof(T*)`, as `nullptr` +// indicates empty. +template struct InlineTrie { + InlineTrie *children[4]; + utils::Optional keys[4]; + V values[4]; + + // Returns an optional pointer to the value. + constexpr auto find(const K &k) -> utils::Optional { + Child c = findChild(this, k); + return (c.subIndex) ? nullptr : &c.node->values[c.index]; + } + + auto operator[](utils::Valid> alloc, const K &k) -> V & { + Child c = findChild(this, k); + if (c.subIndex) { + c.node = c.node->children[*c.subIndex] = + alloc->create>(); + c.node->keys[c.index] = k; + } + return c.node->values[c.index]; + } + + void eraseImpl(const K &k) { + Child c = findChild(this, k); + if (c.subIndex) return; // was not found + // We now find a leaf key/value pair, and move them here. + InlineTrie *descendent = c.node[c.index]; + if (!descendent) { + c.node->keys[c.index] = {}; // set to null + return; + } + for (;;) { + int i = 0; + for (; i < 4; ++i) + if (!descendent->children[i]) break; + if (i != 4) { // we found one + c.node->keys[c.index] = std::move(descendent->keys[i]); + c.node->values[c.index] = std::move(descendent->values[i]); + descendent->keys[i] = {}; + return; + } + descendent = descendent->children[0]; + } + } + +private: + struct Child { + InlineTrie *node; + size_t index; + utils::Optional subIndex; + }; + + template + static constexpr auto findChild(InlineTrie *node, const K &k) -> Child { + for (uint64_t h = ankerl::unordered_dense::hash{}(k);;) { + uint64_t ind = h >> 62; + bool noKey = !node->keys[ind]; + if constexpr (Insert) { + if (noKey) node->keys[ind] = k; + } else { + if (noKey) return {node, ind, ind}; + } + if (noKey || (*node->keys[ind] == k)) return {node, ind, {}}; + h <<= 2; + if (!node->children[ind]) return {node, h >> 62, ind}; + node = node->children[ind]; + } + }; +}; + // static_assert(sizeof(std::array*,0 >)==1); } // namespace poly::dict diff --git a/include/IR/Users.hpp b/include/IR/Users.hpp index 4c8733689..4f542f431 100644 --- a/include/IR/Users.hpp +++ b/include/IR/Users.hpp @@ -2,7 +2,6 @@ #include "Utilities/Invariant.hpp" #include -#include #include namespace poly::IR { diff --git a/include/Support/Iterators.hpp b/include/Support/Iterators.hpp index d312dbf9c..9d1063a52 100644 --- a/include/Support/Iterators.hpp +++ b/include/Support/Iterators.hpp @@ -1,8 +1,6 @@ #pragma once #include #include -#include -#include #include #include diff --git a/test/bumpmap_test.cpp b/test/bumpmap_test.cpp index a6d9a5710..dcee1bd12 100644 --- a/test/bumpmap_test.cpp +++ b/test/bumpmap_test.cpp @@ -21,7 +21,7 @@ TEST(BumpDownMapTest, BasicAssertions) { static_assert( std::same_as< M::allocator_type, - poly::utils::WArena, 16384, true>>); + poly::alloc::WArena, 16384, true>>); poly::utils::OwningArena<> alloc; M::allocator_type walloc{&alloc}; From f7c87d6920383cb1b78105903bb0c46607699a4b Mon Sep 17 00:00:00 2001 From: chriselrod Date: Sun, 15 Oct 2023 18:50:38 -0400 Subject: [PATCH 036/112] Some progress updating for breakages in Math --- benchmark/CMakeLists.txt | 9 +- .../include/constraint_pruning_benchmark.hpp | 93 ++++++++++--------- benchmark/include/map_benchmark.hpp | 3 +- benchmark/include/simplex_benchmark.hpp | 21 +++-- include/IR/Cache.hpp | 2 +- include/IR/InstructionCost.hpp | 2 + include/LinearProgramming/LoopBlock.hpp | 2 +- include/Polyhedra/Comparators.hpp | 86 ++++++++--------- include/Polyhedra/Loops.hpp | 72 +++++++------- include/Polyhedra/Polyhedra.hpp | 2 +- test/TestUtilities.hpp | 2 +- test/bumpmap_test.cpp | 2 +- test/compat_test.cpp | 4 +- test/dependence_test.cpp | 12 +-- 14 files changed, 160 insertions(+), 152 deletions(-) diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt index 45aa4c9ae..540e41ba3 100644 --- a/benchmark/CMakeLists.txt +++ b/benchmark/CMakeLists.txt @@ -33,6 +33,13 @@ CPMAddPackage( GIT_TAG fnoexceptions SYSTEM TRUE ) +FetchContent_Declare( + Math + GIT_REPOSITORY git@github.com:LoopModels/Math.git + GIT_TAG origin/main +) +FetchContent_MakeAvailable(Math) + # file(GLOB_RECURSE headers CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/include/*.hpp) file(GLOB benchmarks CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) @@ -52,7 +59,7 @@ target_include_directories( ) find_package(OpenMP) target_link_libraries( - ${PROJECT_NAME} PRIVATE benchmark::benchmark LLVM unordered_dense::unordered_dense + ${PROJECT_NAME} PRIVATE benchmark::benchmark LLVM unordered_dense::unordered_dense Math OpenMP::OpenMP_CXX ) diff --git a/benchmark/include/constraint_pruning_benchmark.hpp b/benchmark/include/constraint_pruning_benchmark.hpp index 06210a395..2f61f6660 100644 --- a/benchmark/include/constraint_pruning_benchmark.hpp +++ b/benchmark/include/constraint_pruning_benchmark.hpp @@ -1,63 +1,65 @@ #pragma once -#include "Math/NormalForm.hpp" -#include "Math/Orthogonalize.hpp" -#include "MatrixStringParse.hpp" +#include +#include +#include #include #include #include #include +using poly::math::Vector,poly::math::IntMatrix, poly::math::Row, poly::math::Col, + poly::math::DenseDims, poly::math::_, poly::utils::operator""_mat; static void BM_NullSpace(benchmark::State &state) { - IntMatrix B(DenseDims{Row{6}, Col{3}}); - B(0, 0) = 1; - B(1, 0) = 0; - B(2, 0) = -3; - B(3, 0) = 0; - B(4, 0) = 2; - B(5, 0) = -8; + IntMatrix<> B(poly::math::DenseDims{Row{6}, Col{3}}); + B[0, 0] = 1; + B[1, 0] = 0; + B[2, 0] = -3; + B[3, 0] = 0; + B[4, 0] = 2; + B[5, 0] = -8; - B(0, 1) = 0; - B(1, 1) = 1; - B(2, 1) = 5; - B(3, 1) = 0; - B(4, 1) = -1; - B(5, 1) = 4; + B[0, 1] = 0; + B[1, 1] = 1; + B[2, 1] = 5; + B[3, 1] = 0; + B[4, 1] = -1; + B[5, 1] = 4; - B(0, 2) = 0; - B(1, 2) = 0; - B(2, 2) = 0; - B(3, 2) = 1; - B(4, 2) = 7; - B(5, 2) = -9; + B[0, 2] = 0; + B[1, 2] = 0; + B[2, 2] = 0; + B[3, 2] = 1; + B[4, 2] = 7; + B[5, 2] = -9; // fourth row is 0 // std::cout << "B=\n" << B << "\nnullSpace(B) =\n" << // NormalForm::nullSpace(B) << std::endl; - IntMatrix A; - for (auto b : state) A = NormalForm::nullSpace(B); + poly::math::IntMatrix<> A; + for (auto b : state) A = poly::math::NormalForm::nullSpace(B); } // Register the function as a benchmark BENCHMARK(BM_NullSpace); static void BM_NullSpace2000(benchmark::State &state) { const size_t N = 20; - IntMatrix A(DenseDims{Row{N}, Col{N}}); + IntMatrix<> A(DenseDims{Row{N}, Col{N}}); A << 0; - A(0, 0) = 2; + A[0, 0] = 2; for (size_t i = 1; i < N; ++i) { - A(i - 1, i) = -1; - A(i, i) = 2; - A(i, i - 1) = -1; + A[i - 1, i] = -1; + A[i, i] = 2; + A[i, i - 1] = -1; } for (size_t j = 0; j < N; j += 8) { - A(j, _) << 0; - for (size_t i = 0; i < N; i += 7) A(j, _) += ((i & 1) ? 1 : -1) * A(i, _); + A[j, _] << 0; + for (size_t i = 0; i < N; i += 7) A[j, _] += ((i & 1) ? 1 : -1) * A[i, _]; } // fourth row is 0 - IntMatrix NS; - for (auto b : state) NS = NormalForm::nullSpace(A); + IntMatrix<> NS; + for (auto b : state) NS = poly::math::NormalForm::nullSpace(A); // std::cout << "NS.size() = (" << NS.numRow() << ", " << NS.numCol() << ")" // << std::endl; } @@ -65,39 +67,38 @@ static void BM_NullSpace2000(benchmark::State &state) { BENCHMARK(BM_NullSpace2000); static void BM_Orthogonalize(benchmark::State &state) { - IntMatrix A = + IntMatrix<> A = "[-2 2 0 1 1 1 2; 3 -3 2 3 2 3 2; -3 0 2 3 -2 0 1; 2 1 0 -1 3 -1 1; 1 -3 -3 -2 2 -2 2; 0 0 1 2 -3 -2 -2; 0 -3 -2 -1 1 0 1]"_mat; - IntMatrix B; + IntMatrix<> B; for (auto b : state) B = orthogonalize(A); } BENCHMARK(BM_Orthogonalize); static void BM_Bareiss2000(benchmark::State &state) { const size_t N = 20; - IntMatrix A(DenseDims{Row{N}, Col{N}}); + IntMatrix<> A(DenseDims{Row{N}, Col{N}}); A << 0; - A(0, 0) = 2; + A[0, 0] = 2; for (size_t i = 1; i < N; ++i) { - A(i - 1, i) = -1; - A(i, i) = 2; - A(i, i - 1) = -1; + A[i - 1, i] = -1; + A[i, i] = 2; + A[i, i - 1] = -1; } for (size_t j = 0; j < N; j += 8) { - // A(j,:) - for (size_t i = 0; i < N; ++i) A(j, i) = 0; + A[j,_] << 0; for (size_t i = 0; i < N; i += 7) { int64_t s = (i & 1) ? 1 : -1; - for (size_t k = 0; k < N; ++k) A(j, k) += s * A(i, k); + A[j,_] += s * A[i,_]; } } // std::cout << A << std::endl; // fourth row is 0 - Vector pivots(N); - IntMatrix B; + Vector pivots(N); + IntMatrix<> B; for (auto b : state) { B = A; - NormalForm::bareiss(B, pivots); + poly::math::NormalForm::bareiss(B, pivots); } // std::cout << "NS.size() = (" << NS.numRow() << ", " << NS.numCol() << ")" // << std::endl; diff --git a/benchmark/include/map_benchmark.hpp b/benchmark/include/map_benchmark.hpp index 6d487382f..871a23d4f 100644 --- a/benchmark/include/map_benchmark.hpp +++ b/benchmark/include/map_benchmark.hpp @@ -1,8 +1,9 @@ #pragma once + +#include "Alloc/Arena.hpp" #include "Dicts/BumpMapSet.hpp" #include "Dicts/BumpVector.hpp" #include "Dicts/Trie.hpp" -#include "Alloc/Arena.hpp" #include #include #include diff --git a/benchmark/include/simplex_benchmark.hpp b/benchmark/include/simplex_benchmark.hpp index 09af7becd..6f144a9b7 100644 --- a/benchmark/include/simplex_benchmark.hpp +++ b/benchmark/include/simplex_benchmark.hpp @@ -1,10 +1,12 @@ #pragma once -#include "Math/Simplex.hpp" -#include "MatrixStringParse.hpp" +#include +#include #include +using poly::utils::operator""_mat, poly::math::_; + static void BM_Simplex0(benchmark::State &state) { - math::DenseMatrix tableau{ + poly::math::DenseMatrix tableau{ "[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " @@ -871,15 +873,16 @@ static void BM_Simplex0(benchmark::State &state) { "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 " "1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ]"_mat}; - tableau(0, _) << -5859553999884210514; - OwningArena<> alloc; + tableau[0, _] << -5859553999884210514; + poly::alloc::OwningArena<> alloc; unsigned numCon = unsigned(tableau.numRow()) - 1; unsigned numVar = unsigned(tableau.numCol()) - 1; - Valid simpBackup{Simplex::create(alloc, numCon, numVar, 0)}; + poly::utils::Valid simpBackup{ + poly::math::Simplex::create(alloc, numCon, numVar)}; simpBackup->getTableau() << tableau; // Simplex simpBackup{tableau}; - Valid simp{Simplex::create(alloc, simpBackup->getNumCons(), - simpBackup->getNumVars(), 0)}; + poly::utils::Valid simp{poly::math::Simplex::create( + alloc, simpBackup->getNumCons(), simpBackup->getNumVars())}; // Vector sol(37); for (auto b : state) { *simp << *simpBackup; @@ -1117,7 +1120,7 @@ static void BM_Simplex1(benchmark::State &state) { Valid simpBackup{Simplex::create(alloc, numCon, numVar, 0)}; simpBackup->getTableau() << tableau; Valid simp{Simplex::create(alloc, simpBackup->getNumCons(), - simpBackup->getNumVars(), 0)}; + simpBackup->getNumVars(), 0)}; for (auto b : state) { *simp << *simpBackup; bool fail = simp->initiateFeasible(); diff --git a/include/IR/Cache.hpp b/include/IR/Cache.hpp index de0a0d20f..ab45ee17b 100644 --- a/include/IR/Cache.hpp +++ b/include/IR/Cache.hpp @@ -176,7 +176,7 @@ class Cache { map llvmToInternalMap; map instCSEMap; map constMap; - utils::OwningArena<> alloc; + alloc::OwningArena<> alloc; llvm::LoopInfo *LI; llvm::ScalarEvolution *SE; Compute *freeInstList{nullptr}; // positive numOps/complete, but empty diff --git a/include/IR/InstructionCost.hpp b/include/IR/InstructionCost.hpp index 8198ab7fa..f801e6cb7 100644 --- a/include/IR/InstructionCost.hpp +++ b/include/IR/InstructionCost.hpp @@ -2,6 +2,8 @@ #include #include #include +#include +#include #include namespace poly::IR::cost { diff --git a/include/LinearProgramming/LoopBlock.hpp b/include/LinearProgramming/LoopBlock.hpp index b411d4a43..e09ca5358 100644 --- a/include/LinearProgramming/LoopBlock.hpp +++ b/include/LinearProgramming/LoopBlock.hpp @@ -139,7 +139,7 @@ class LoopBlock { // dict::set visited{}; // llvm::LoopInfo *LI; IR::Dependencies deps; - utils::OwningArena<> allocator{}; + alloc::OwningArena<> allocator{}; // we may turn off edges because we've exceeded its loop depth // or because the dependence has already been satisfied at an // earlier level. diff --git a/include/Polyhedra/Comparators.hpp b/include/Polyhedra/Comparators.hpp index 5706b9014..1fe4427fc 100644 --- a/include/Polyhedra/Comparators.hpp +++ b/include/Polyhedra/Comparators.hpp @@ -327,7 +327,7 @@ struct BaseSymbolicComparator : BaseComparator> { /// auto B = getV(rowV, colV); std::fill_n(B.begin(), B.numRow() * B.numCol(), 0); - B(0, 0) = 1; + B[0, 0] = 1; // B = [ A_0 A_1 // 0 I ] // V = [B' 0 @@ -335,12 +335,12 @@ struct BaseSymbolicComparator : BaseComparator> { // V = [A_0' 0 0 // A_1' I 0 // S_0 S_1 I] - B(_(begin, numVar), _(1, numConExplicit)) << A.transpose(); + B[_(begin, numVar), _(1, numConExplicit)] << A.transpose(); for (ptrdiff_t j = 0; j < numNonNegative; ++j) - B(j + numVar - numNonNegative, numConExplicit + j) = 1; + B[j + numVar - numNonNegative, numConExplicit + j] = 1; for (ptrdiff_t j = 0; j < numConTotal; ++j) { - B(j + numVar, j) = -1; - B(j + numVar, j + numConTotal) = 1; + B[j + numVar, j] = -1; + B[j + numVar, j + numConTotal] = 1; } numEquations = numConTotal; initCore(alloc); @@ -358,7 +358,7 @@ struct BaseSymbolicComparator : BaseComparator> { Col colV = Col{2 * numInEqConTotal + numEqCon}; auto B = getV(rowV, colV); std::fill_n(B.begin(), B.numRow() * B.numCol(), 0); - B(0, 0) = 1; + B[0, 0] = 1; // B is `A` augmented with the implicit non-negative constraints // B = [ A_0 A_1 // 0 I ] @@ -368,17 +368,17 @@ struct BaseSymbolicComparator : BaseComparator> { // A_1' I E_1' 0 // S_0 S_1 0 I] numEquations = numInEqConTotal + numEqCon; - B(_(begin, numVar), _(1, numInEqConExplicit)) << A.transpose(); - B(_(begin, numVar), _(numInEqConTotal, numInEqConTotal + numEqCon)) + B[_(begin, numVar), _(1, numInEqConExplicit)] << A.transpose(); + B[_(begin, numVar), _(numInEqConTotal, numInEqConTotal + numEqCon)] << E.transpose(); if (numNonNegative) - B(_(numVar - numNonNegative, numVar), - _(numInEqConExplicit, numInEqConExplicit + numNonNegative)) + B[_(numVar - numNonNegative, numVar), + _(numInEqConExplicit, numInEqConExplicit + numNonNegative)] .diag() << 1; for (ptrdiff_t j = 0; j < numInEqConTotal; ++j) { - B(j + numVar, j) = -1; - B(j + numVar, j + numEquations) = 1; + B[j + numVar, j] = -1; + B[j + numVar, j + numEquations] = 1; } initCore(alloc); } @@ -429,13 +429,13 @@ struct BaseSymbolicComparator : BaseComparator> { Col colV = 2 * numCon; auto B = getV(rowV, colV); std::fill_n(B.begin(), B.numRow() * B.numCol(), 0); - B(0, 0) = pos0; + B[0, 0] = pos0; // V = [A' 0 // S I] - B(_(begin, numVar), _(pos0, numCon)) << A.transpose(); + B[_(begin, numVar), _(pos0, numCon)] << A.transpose(); for (ptrdiff_t j = 0; j < numCon; ++j) { - B(j + numVar, j) = -1; - B(j + numVar, j + numCon) = 1; + B[j + numVar, j] = -1; + B[j + numVar, j + numCon] = 1; } numEquations = numCon; initCore(alloc); @@ -455,15 +455,15 @@ struct BaseSymbolicComparator : BaseComparator> { B << 0; // V = [A' E' 0 // S 0 I] - B(0, 0) = pos0; - B(_(begin, numVar), _(pos0, numInEqCon)) << A.transpose(); + B[0, 0] = pos0; + B[_(begin, numVar), _(pos0, numInEqCon)] << A.transpose(); // A(_, _(pos0, end)).transpose(); - B(_(begin, numVar), _(numInEqCon, numInEqCon + numEqCon)) << E.transpose(); + B[_(begin, numVar), _(numInEqCon, numInEqCon + numEqCon)] << E.transpose(); numEquations = numInEqCon + numEqCon; for (ptrdiff_t j = 0; j < numInEqCon; ++j) { - B(j + numVar, j) = -1; - B(j + numVar, j + numEquations) = 1; + B[j + numVar, j] = -1; + B[j + numVar, j + numEquations] = 1; } initCore(alloc); } @@ -477,7 +477,7 @@ struct BaseSymbolicComparator : BaseComparator> { U.diag() << 1; // We will have query of the form Ax = q; simplifySystemsImpl({B, U}); - while ((R) && allZero(B(R - 1, _))) --R; + while ((R) && allZero(B[R - 1, _])) --R; setURank(R); ptrdiff_t numColB = ptrdiff_t(B.numCol()); // upper bounded by numVar + numInEq x numVar + numInEq @@ -491,7 +491,7 @@ struct BaseSymbolicComparator : BaseComparator> { // Ht.numRow() > Ht.numCol() = R // (2*numInEq + numEq) x R auto Ht = matrix(alloc, Row{numColB}, Col{ptrdiff_t(R)}); - Ht << B(_(0, R), _).transpose(); + Ht << B[_(0, R), _].transpose(); solveSystem(Ht, Vt); // upper bounded by numVar + numInEq // rows/cols, but of rank R @@ -507,23 +507,18 @@ struct BaseSymbolicComparator : BaseComparator> { auto V = getV(); auto U = getU(); auto d = getD(); - StridedVector b{U(_, 0)}; + StridedVector b{U[_, 0]}; if (d.empty()) { if (!allZero(b[_(V.numRow(), end)])) return false; Col oldn = V.numCol(); auto H{matrix(&alloc, V.numRow(), oldn + 1)}; // IntMatrix H{V.numRow(), oldn + 1}; - H(_, _(0, oldn)) << V; - H(_, oldn) << -b; + H[_, _(0, oldn)] << V; + H[_, oldn] << -b; solveSystem(H); - bool ret = true; for (ptrdiff_t i = numEquations; i < H.numRow(); ++i) - if (auto rhs = H(i, oldn)) - if ((rhs > 0) != (H(i, i) > 0)) { - ret = false; - break; - } - return ret; + if ((H[i, oldn] > 0) != (H[i, i] > 0)) return false; + return true; } // Column rank deficient case Row numSlack = V.numRow() - numEquations; @@ -536,7 +531,7 @@ struct BaseSymbolicComparator : BaseComparator> { // Vector b2 = -b * Dlcm / d; ptrdiff_t numRowTrunc = ptrdiff_t(U.numRow()); auto c{vector(&alloc, ptrdiff_t(V.numRow() - numEquations))}; - c << V(_(numEquations, end), _(begin, numRowTrunc)) * b2; + c << V[_(numEquations, end), _(begin, numRowTrunc)] * b2; // Vector c = V(_(numEquations, end), _(begin, numRowTrunc)) * // b2; auto dimNS = V.numCol() - numRowTrunc; @@ -545,23 +540,23 @@ struct BaseSymbolicComparator : BaseComparator> { // where y2 = y2+ - y2- auto expandW{matrix(&alloc, Row{numSlack}, Col{dimNS * 2 + 1})}; for (ptrdiff_t i = 0; i < numSlack; ++i) { - expandW(i, 0) = c[i]; + expandW[i, 0] = c[i]; // expandW(i, 0) *= Dlcm; for (ptrdiff_t j = 0; j < dimNS; ++j) { - auto val = V(i + numEquations, numRowTrunc + j) * lcmD; - expandW(i, j + 1) = -val; - expandW(i, dimNS + 1 + j) = val; + auto val = V[i + numEquations, numRowTrunc + j] * lcmD; + expandW[i, j + 1] = -val; + expandW[i, dimNS + 1 + j] = val; } } return Simplex::positiveVariables(&alloc, expandW).hasValue(); } [[nodiscard]] constexpr auto isEmpty() const -> bool { - utils::OwningArena<> alloc; + alloc::OwningArena<> alloc; return isEmpty(alloc); } [[nodiscard]] constexpr auto greaterEqual(PtrVector query) const -> bool { - utils::OwningArena<> alloc; + alloc::OwningArena<> alloc; return greaterEqual(alloc, query); } [[nodiscard]] constexpr auto greaterEqualFullRank(Arena<> *alloc, @@ -577,8 +572,7 @@ struct BaseSymbolicComparator : BaseComparator> { H(_, oldn) << b; solveSystem(H); for (ptrdiff_t i = numEquations; i < H.numRow(); ++i) - if (auto rhs = H(i, oldn)) - if ((rhs > 0) != (H(i, i) > 0)) return false; + if ((H(i, oldn) > 0) != (H(i, i) > 0)) return false; return true; } [[nodiscard]] constexpr auto @@ -839,7 +833,7 @@ static_assert(Comparator); constexpr void moveEqualities(DenseMatrix &, EmptyMatrix, const Comparator auto &) {} -constexpr void moveEqualities(DenseMatrix &A, math::IntMatrix &E, +constexpr void moveEqualities(DenseMatrix &A, math::IntMatrix<> &E, const Comparator auto &C) { const ptrdiff_t numVar = ptrdiff_t(E.numCol()); assert(A.numCol() == numVar); @@ -848,15 +842,15 @@ constexpr void moveEqualities(DenseMatrix &A, math::IntMatrix &E, for (ptrdiff_t i = o--; i < A.numRow(); ++i) { bool isNeg = true; for (ptrdiff_t v = 0; v < numVar; ++v) { - if (A(i, v) != -A(o, v)) { + if (A[i, v] != -A[o, v]) { isNeg = false; break; } } - if (isNeg && C.equalNegative(A(i, _), A(o, _))) { + if (isNeg && C.equalNegative(A[i, _], A[o, _])) { ptrdiff_t e = ptrdiff_t(E.numRow()); E.resize(e + 1, numVar); - for (ptrdiff_t v = 0; v < numVar; ++v) E(e, v) = A(i, v); + for (ptrdiff_t v = 0; v < numVar; ++v) E[e, v] = A[i, v]; eraseConstraint(A, i, o); break; } diff --git a/include/Polyhedra/Loops.hpp b/include/Polyhedra/Loops.hpp index 5a57ce687..da4fb7e38 100644 --- a/include/Polyhedra/Loops.hpp +++ b/include/Polyhedra/Loops.hpp @@ -3,13 +3,13 @@ #include "Polyhedra/Comparators.hpp" #include "Polyhedra/Polyhedra.hpp" #include "RemarkAnalysis.hpp" +#include #include #include #include #include #include #include -#include #include #include #include @@ -167,34 +167,34 @@ namespace loopNestCtor { /// we try to break down value `v`, so that adding /// N, N - 1, N - 3 only adds the variable `N`, and adds the constant /// offsets -inline void addSymbol(IntMatrix &A, +inline void addSymbol(IntMatrix &A, llvm::SmallVectorImpl &symbols, const llvm::SCEV *v, math::Range lu, int64_t mlt) { assert(lu.size()); symbols.push_back(v); A.resize(A.numCol() + 1); - A(lu, symbols.size()) << mlt; + A[lu, symbols.size()] << mlt; } inline auto addRecMatchesLoop(const llvm::SCEV *S, llvm::Loop *L) -> bool { if (const auto *x = llvm::dyn_cast(S)) return x->getLoop() == L; return false; } -[[nodiscard]] inline auto -addSymbol(std::array &AB, // NOLINT(misc-no-recursion) - llvm::SmallVectorImpl &symbols, llvm::Loop *L, - const llvm::SCEV *v, llvm::ScalarEvolution &SE, - math::Range lu, int64_t mlt, ptrdiff_t minDepth) +[[nodiscard]] inline auto addSymbol( + std::array, 2> &AB, // NOLINT(misc-no-recursion) + llvm::SmallVectorImpl &symbols, llvm::Loop *L, + const llvm::SCEV *v, llvm::ScalarEvolution &SE, + math::Range lu, int64_t mlt, ptrdiff_t minDepth) -> ptrdiff_t { auto &[A, B] = AB; // first, we check if `v` in `Symbols` if (ptrdiff_t i = findSymbolicIndex(symbols, v)) { - A(lu, i) += mlt; + A[lu, i] += mlt; return minDepth; } if (std::optional c = getConstantInt(v)) { - A(lu, 0) += mlt * (*c); + A[lu, 0] += mlt * (*c); return minDepth; } if (const auto *ar = llvm::dyn_cast(v)) { @@ -221,7 +221,7 @@ addSymbol(std::array &AB, // NOLINT(misc-no-recursion) addSymbol(AB, symbols, L, x->getOperand(0), SE, lu, mlt, minDepth); if (auto opc = getConstantInt(x->getOperand(1))) { // swap order vs recDepth to go inner<->outer - B(lu, recDepth - 1) << mlt * (*opc); + B[lu, recDepth - 1] << mlt * (*opc); return minDepth; } v = SE.getAddRecExpr(SE.getZero(x->getOperand(0)->getType()), @@ -244,8 +244,8 @@ addSymbol(std::array &AB, // NOLINT(misc-no-recursion) Row Mp = M + std::ssize(lu); A.resize(Mp); B.resize(Mp); - A(_(M, Mp), _) = A(lu, _); - B(_(M, Mp), _) = B(lu, _); + A[_(M, Mp), _] = A[lu, _]; + B[_(M, Mp), _] = B[lu, _]; minDepth = addSymbol(AB, symbols, L, op0, SE, lu, mlt, minDepth); minDepth = addSymbol(AB, symbols, L, op1, SE, _(M, Mp), mlt, minDepth); } else if (addRecMatchesLoop(op0, L)) { @@ -259,16 +259,16 @@ addSymbol(std::array &AB, // NOLINT(misc-no-recursion) return minDepth; } inline auto -areSymbolsLoopInvariant(IntMatrix &A, +areSymbolsLoopInvariant(IntMatrix<> &A, llvm::SmallVectorImpl &symbols, llvm::Loop *L, llvm::ScalarEvolution &SE) -> bool { for (ptrdiff_t i = 0; i < std::ssize(symbols); ++i) - if ((!allZero(A(_, i + 1))) && (!SE.isLoopInvariant(symbols[i], L))) + if ((!allZero(A[_, i + 1])) && (!SE.isLoopInvariant(symbols[i], L))) return false; return true; } inline auto // NOLINTNEXTLINE(misc-no-recursion) -addBackedgeTakenCount(std::array &AB, +addBackedgeTakenCount(std::array, 2> &AB, llvm::SmallVectorImpl &symbols, llvm::Loop *L, const llvm::SCEV *BT, llvm::ScalarEvolution &SE, ptrdiff_t minDepth, @@ -281,7 +281,7 @@ addBackedgeTakenCount(std::array &AB, minDepth = addSymbol(AB, symbols, L, BT, SE, _(M, M + 1), 1, minDepth); assert(A.numRow() == B.numRow()); ptrdiff_t depth = L->getLoopDepth() - 1; - for (auto m = ptrdiff_t(M); m < A.numRow(); ++m) B(m, depth) = -1; // indvar + for (auto m = ptrdiff_t(M); m < A.numRow(); ++m) B[m, depth] = -1; // indvar // recurse, if possible to add an outer layer if (llvm::Loop *P = L->getParentLoop()) { if (areSymbolsLoopInvariant(A, symbols, P, SE)) { @@ -363,7 +363,7 @@ class Loop : public BasePolyhedra { // A holds symbols // B holds loop bounds // they're separate so we can grow them independently - std::array AB; + std::array, 2> AB; auto &[A, B] = AB; // once we're done assembling these, we'll concatenate A and B unsigned maxDepth = L->getLoopDepth(); @@ -386,7 +386,7 @@ class Loop : public BasePolyhedra { // search B(_,d) for references for (ptrdiff_t i = 0; i < B.numRow(); ++i) { // TODO; confirm `last` vs `end` - if (int64_t Bid = B(i, d)) { + if (int64_t Bid = B[i, d]) { if (!P) { // find P P = L; for (ptrdiff_t r = d + 1; r < maxDepth; ++r) P = P->getParentLoop(); @@ -406,10 +406,10 @@ class Loop : public BasePolyhedra { unsigned numConstraints = unsigned(A.numRow()), N = unsigned(A.numCol()); Valid aln{ Loop::allocate(alloc, L, numConstraints, depth, symbols, maxDepth)}; - aln->getA()(_, _(0, N)) << A; + aln->getA()[_, _(0, N)] << A; // copy the included loops from B // we use outer <-> inner order, so we skip unsupported outer loops. - aln->getA()(_, _(N, N + depth)) << B(_, _(end - depth, end)); + aln->getA()[_, _(N, N + depth)] << B[_, _(end - depth, end)]; return aln; // addZeroLowerBounds(); // NOTE: pruneBounds() is not legal here if we wish to use @@ -446,15 +446,15 @@ class Loop : public BasePolyhedra { const auto [M, N] = A.size(); auto syms{getSyms()}; Valid aln{Loop::allocate(alloc, L, ptrdiff_t(M) + numExtraVar, - numLoops, syms, nonNeg)}; + numLoops, syms, nonNeg)}; auto B{aln->getA()}; invariant(B.numRow(), M + numExtraVar); invariant(B.numCol(), N); - B(_(0, M), _(0, numConst)) << A(_, _(0, numConst)); - B(_(0, M), _(numConst, end)) << A(_, _(numConst, end)) * R; + B[_(0, M), _(0, numConst)] << A[_, _(0, numConst)]; + B[_(0, M), _(numConst, end)] << A[_, _(numConst, end)] * R; if (addExtra) { - B(_(M, end), _(0, numConst)) << 0; - B(_(M, end), _(numConst, end)) << R; + B[_(M, end), _(0, numConst)] << 0; + B[_(M, end), _(numConst, end)] << R; } // A * O * [I 0; 0 R] = A * [I 0; 0 R] - A * [0 0; offs 0] * [I 0; 0 R] // above, we computed `A * [I 0; 0 R]`, now if offsets != nullptr, @@ -468,8 +468,8 @@ class Loop : public BasePolyhedra { if (offsets) { for (ptrdiff_t l = 0, D = getNumLoops(); l < D; ++l) { if (int64_t mlt = offsets[l]) { - B(_(0, M), 0) -= mlt * A(_, numConst + l); - if (addExtra) B(M + l, 0) = -mlt; + B[_(0, M), 0] -= mlt * A[_, numConst + l]; + if (addExtra) B[M + l, 0] = -mlt; } } } @@ -488,12 +488,12 @@ class Loop : public BasePolyhedra { auto ret = Loop::allocate(alloc, L->getParentLoop(), unsigned(A.numRow()), getNumLoops() - 1, getSyms(), isNonNegative()); MutPtrMatrix B{ret->getA()}; - B << A(_, _(0, last)); + B << A[_, _(0, last)]; // no loop may be conditioned on the innermost loop, so we should be able to // safely remove all constraints that reference it for (Row m = B.numRow(); m--;) { - if (A(m, last)) { - if (m != B.numRow() - 1) B(m, _) << B(last, _); + if (A[m, last]) { + if (m != B.numRow() - 1) B[m, _] << B[last, _]; B.truncate(B.numRow() - 1); } } @@ -547,14 +547,14 @@ class Loop : public BasePolyhedra { ptrdiff_t M = numConstraints; numConstraints += numLoops; auto A{getA()}; - A(_(M, end), _) << 0; - for (ptrdiff_t i = 0; i < numLoops; ++i) A(M + i, end - numLoops + i) = 1; + A[_(M, end), _] << 0; + for (ptrdiff_t i = 0; i < numLoops; ++i) A[M + i, end - numLoops + i] = 1; // this->pruneBounds(alloc); } [[nodiscard]] constexpr auto getProgVars(ptrdiff_t j) const -> PtrVector { - return getA()(j, _(0, getNumSymbols())); + return getA()[j, _(0, getNumSymbols())]; } [[nodiscard]] auto copy(Arena<> *alloc) const -> Valid { auto ret = Loop::allocate(alloc, L, numConstraints, numLoops, getSyms(), @@ -565,7 +565,7 @@ class Loop : public BasePolyhedra { [[nodiscard]] auto removeLoop(Arena<> *alloc, ptrdiff_t v) const -> Loop * { auto A{getA()}; v += getNumSymbols(); - auto zeroNegPos = indsZeroNegPos(A(_, v)); + auto zeroNegPos = indsZeroNegPos(A[_, v]); auto &[zer, neg, pos] = zeroNegPos; unsigned numCon = unsigned(A.numRow()) - pos.size() + neg.size() * pos.size(); @@ -820,7 +820,7 @@ class Loop : public BasePolyhedra { // We pop off the outer most loop on every iteration. friend inline auto operator<<(llvm::raw_ostream &os, const Loop &aln) -> llvm::raw_ostream & { - utils::OwningArena<> alloc; + alloc::OwningArena<> alloc; aln.dump(os, &alloc); return os; } diff --git a/include/Polyhedra/Polyhedra.hpp b/include/Polyhedra/Polyhedra.hpp index 2f1de3600..d130c7308 100644 --- a/include/Polyhedra/Polyhedra.hpp +++ b/include/Polyhedra/Polyhedra.hpp @@ -134,7 +134,7 @@ struct BasePolyhedra { pruneBoundsCore(&alloc); } constexpr void pruneBounds() { - utils::OwningArena<> alloc; + alloc::OwningArena<> alloc; pruneBounds(alloc); } constexpr void eraseConstraint(ptrdiff_t constraint) { diff --git a/test/TestUtilities.hpp b/test/TestUtilities.hpp index 426e7c655..05a66f2ec 100644 --- a/test/TestUtilities.hpp +++ b/test/TestUtilities.hpp @@ -23,7 +23,7 @@ namespace poly { using math::PtrMatrix; class TestLoopFunction { - utils::OwningArena<> alloc; + alloc::OwningArena<> alloc; llvm::LLVMContext ctx; llvm::Module *mod; llvm::LoopInfo LI{}; diff --git a/test/bumpmap_test.cpp b/test/bumpmap_test.cpp index dcee1bd12..65828b7f5 100644 --- a/test/bumpmap_test.cpp +++ b/test/bumpmap_test.cpp @@ -23,7 +23,7 @@ TEST(BumpDownMapTest, BasicAssertions) { M::allocator_type, poly::alloc::WArena, 16384, true>>); - poly::utils::OwningArena<> alloc; + poly::alloc::OwningArena<> alloc; M::allocator_type walloc{&alloc}; M::value_container_type mvals{walloc}; // poly::math::BumpPtrVector vec{&alloc}; diff --git a/test/compat_test.cpp b/test/compat_test.cpp index 234e9a6b2..96895f969 100644 --- a/test/compat_test.cpp +++ b/test/compat_test.cpp @@ -149,7 +149,7 @@ TEST(AffineTest0, BasicAssertions) { #endif llvm::errs() << "About to run first set of bounds tests\n"; llvm::errs() << "\nPermuting loops 1 and 2\n"; - utils::OwningArena<> allocator; + alloc::OwningArena<> allocator; utils::Valid affp021ptr{ aff.rotate(&allocator, "[1 0 0; 0 0 1; 0 1 0]"_mat, nullptr)}; poly::Loop &affp021 = *affp021ptr; @@ -199,7 +199,7 @@ TEST(NonUnimodularExperiment, BasicAssertions) { tlf.addLoop(std::move(B), 2); poly::Loop &aff2 = *tlf.getLoopNest(tlf.getNumLoopNests() - 1); EXPECT_FALSE(aff2.isEmpty()); - utils::OwningArena<> allocator; + alloc::OwningArena<> allocator; utils::Valid affp10{ aff2.rotate(&allocator, "[0 1; 1 0]"_mat, nullptr)}; diff --git a/test/dependence_test.cpp b/test/dependence_test.cpp index e738f487e..745310fd9 100644 --- a/test/dependence_test.cpp +++ b/test/dependence_test.cpp @@ -129,7 +129,7 @@ TEST(DependenceTest, BasicAssertions) { Vector schLoad0(3, 0); Vector schStore(3, 0); schStore[2] = 2; - utils::OwningArena<> alloc; + alloc::OwningArena<> alloc; IR::Addr *msrc{createMemAccess(&alloc, srcA, storeA11, schStore)}; IR::Addr *mtgt01{createMemAccess(&alloc, tgtA01, loadA01, schLoad0)}; poly::DepPoly *dep0{poly::DepPoly::dependence(&alloc, *msrc, *mtgt01)}; @@ -256,7 +256,7 @@ TEST(SymmetricIndependentTest, BasicAssertions) { Vector schLoad(3, 0); Vector schStore(3, 0); schStore[2] = 1; - utils::OwningArena<> alloc; + alloc::OwningArena<> alloc; IR::Addr *msrc{createMemAccess(&alloc, srcA, storeAij, schStore)}; IR::Addr *mtgt{createMemAccess(&alloc, tgtA, loadAji, schLoad)}; poly::DepPoly *dep{poly::DepPoly::dependence(&alloc, *msrc, *mtgt)}; @@ -341,7 +341,7 @@ TEST(RankDeficientLoad, BasicAssertions) { Vector schLoad(2 + 1, 0); Vector schStore(2 + 1, 0); schStore[2] = 1; - utils::OwningArena<> alloc; + alloc::OwningArena<> alloc; IR::Addr *msrc{createMemAccess(&alloc, srcA, storeAij, schStore)}; IR::Addr *mtgt{createMemAccess(&alloc, tgtA, loadAii, schLoad)}; @@ -437,7 +437,7 @@ TEST(TimeHidingInRankDeficiency, BasicAssertions) { Vector schLoad(3 + 1, 0); Vector schStore(3 + 1, 0); schStore[3] = 1; - utils::OwningArena<> alloc; + alloc::OwningArena<> alloc; IR::Addr *msrc{createMemAccess(&alloc, refA, storeA, schStore)}; IR::Addr *mtgt{createMemAccess(&alloc, refA, loadA, schLoad)}; @@ -652,7 +652,7 @@ TEST(TriangularExampleTest, BasicAssertions) { IR::AddrChain addr; Vector sch2t0t0(2 + 1, 0); Vector sch2t0t1{sch2t0t0}; - utils::OwningArena<> alloc; + alloc::OwningArena<> alloc; // A(n,m) = -> B(n,m) <- IR::Addr *mSch2t0t0(createMemAccess(&alloc, indBmn, loadB, sch2t0t0)); addr.addAddr(mSch2t0t0); @@ -1140,7 +1140,7 @@ TEST(MeanStDevTest0, BasicAssertions) { lp::LoopBlock iOuterLoopNest; llvm::SmallVector iOuterMem; - utils::OwningArena<> alloc; + alloc::OwningArena<> alloc; iOuterMem.emplace_back(createMemAccess(&alloc, xInd1, storeX0, sch0t0)); // 0 iOuterMem.emplace_back( From 903699b925aad3b5fd77d51c06ad82d622d6ea96 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Mon, 16 Oct 2023 02:28:48 -0400 Subject: [PATCH 037/112] Large number of updates/fixes --- benchmark/CMakeLists.txt | 17 +- benchmark/include/map_benchmark.hpp | 160 ++++++++++------- benchmark/include/matrix_exp.hpp | 186 ++++---------------- benchmark/include/simplex_benchmark.hpp | 15 +- configure.benchmark | 4 +- configure.debug | 2 +- configure.nosan | 2 +- configure.reldeb | 2 +- include/Dicts/BumpMapSet.hpp | 1 - include/Dicts/BumpVector.hpp | 20 +-- include/Dicts/MapVector.hpp | 6 +- include/Dicts/Trie.hpp | 33 ++-- include/Graphs/Bipartite.hpp | 4 +- include/IR/Address.hpp | 28 +-- include/IR/BBPredPath.hpp | 2 +- include/IR/Cache.hpp | 34 ++-- include/IR/ControlFlowMerging.hpp | 7 +- include/IR/Instruction.hpp | 4 +- include/IR/Node.hpp | 4 +- include/IR/OptimizationPossibilities.hpp | 2 +- include/LinearProgramming/LoopBlock.hpp | 175 +++++++++--------- include/LinearProgramming/ScheduledNode.hpp | 8 +- include/Polyhedra/Comparators.hpp | 18 +- include/Polyhedra/Dependence.hpp | 66 +++---- include/Polyhedra/DependencyPolyhedra.hpp | 166 ++++++++--------- include/Polyhedra/Loops.hpp | 49 +++--- include/Polyhedra/Polyhedra.hpp | 12 +- include/Polyhedra/Schedule.hpp | 8 +- test/CMakeLists.txt | 37 ++-- test/bumpmap_test.cpp | 4 +- test/orthogonalize_test.cpp | 10 +- 31 files changed, 503 insertions(+), 583 deletions(-) diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt index 540e41ba3..13ffd9b66 100644 --- a/benchmark/CMakeLists.txt +++ b/benchmark/CMakeLists.txt @@ -3,6 +3,7 @@ cmake_minimum_required(VERSION 3.23) project(LoopModelsBenchmarks LANGUAGES C CXX) option(ENABLE_NATIVE_COMPILATION "Compile with -march=native" ON) +option(ENABLE_OPENMP "Use OpenMP for a multithreading benchmark" OFF) # --- Import tools ---- @@ -57,10 +58,12 @@ target_include_directories(${PROJECT_NAME} SYSTEM PRIVATE ${LLVM_INCLUDE_DIRS}) target_include_directories( ${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/../include ${PROJECT_SOURCE_DIR}/include ) -find_package(OpenMP) +if(ENABLE_OPENMP) + find_package(OpenMP) + target_link_libraries(${PROJECT_NAME} OpenMP::OpenMP_CXX) +endif() target_link_libraries( ${PROJECT_NAME} PRIVATE benchmark::benchmark LLVM unordered_dense::unordered_dense Math - OpenMP::OpenMP_CXX ) if((CMAKE_CXX_COMPILER_ID MATCHES "Clang") OR (CMAKE_CXX_COMPILER_ID MATCHES "IntelLLVM")) @@ -110,10 +113,12 @@ target_compile_options( -Wextra -save-temps ) -if(CMAKE_CXX_COMPILER_ID MATCHES "IntelLLVM") - target_compile_options(${PROJECT_NAME} PRIVATE -fiopenmp) -else() - target_compile_options(${PROJECT_NAME} PRIVATE -fopenmp) +if(ENABLE_OPENMP) + if(CMAKE_CXX_COMPILER_ID MATCHES "IntelLLVM") + target_compile_options(${PROJECT_NAME} PRIVATE -fiopenmp) + else() + target_compile_options(${PROJECT_NAME} PRIVATE -fopenmp) + endif() endif() if(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)") target_compile_options(${PROJECT_NAME} PRIVATE -masm=intel) diff --git a/benchmark/include/map_benchmark.hpp b/benchmark/include/map_benchmark.hpp index 871a23d4f..56150e89a 100644 --- a/benchmark/include/map_benchmark.hpp +++ b/benchmark/include/map_benchmark.hpp @@ -11,170 +11,204 @@ #include #include +template struct TrieWrap { + D d; + poly::alloc::Arena<> *alloc; + + template auto operator[](const K &k) -> auto & { + return d[alloc, k]; + }; + template void erase(const K &k) { d.erase(k); } +}; + template -void InsertLookup2(std::mt19937_64 &mt, D &map, uint64_t mask) { +void InsertLookup2(std::mt19937_64 &rng, D &map, uint64_t mask) { for (uint64_t i = 0; i < 256; ++i) { - map[reinterpret_cast(mt() & mask)] += - i + map[reinterpret_cast(mt() & mask)]; + map[reinterpret_cast(rng() & mask)] += + i + map[reinterpret_cast(rng() & mask)]; } } template -void InsertErase(std::mt19937_64 &mt, D &map, uint64_t mask) { +void InsertErase(std::mt19937_64 &rng, D &map, uint64_t mask) { for (uint64_t i = 0; i < 256; ++i) { - map[reinterpret_cast(mt() & mask)] = i; - map.erase(reinterpret_cast(mt() & mask)); + map[reinterpret_cast(rng() & mask)] = i; + map.erase(reinterpret_cast(rng() & mask)); } } template -void InsertLookup3(std::mt19937_64 &mt, D &map, uint64_t mask) { +void InsertLookup3(std::mt19937_64 &rng, D &map, uint64_t mask) { for (uint64_t i = 0; i < 256; ++i) { - map[reinterpret_cast(mt() & mask)] += - map[reinterpret_cast(mt() & mask)] + - map[reinterpret_cast(mt() & mask)]; + map[reinterpret_cast(rng() & mask)] += + map[reinterpret_cast(rng() & mask)] + + map[reinterpret_cast(rng() & mask)]; } } static void BM_llvmDenseMapInsertErase(benchmark::State &state) { - uint64_t mask = ((1ull << state.range(0)) - 1) << 3ull; - std::mt19937_64 mt; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + std::mt19937_64 rng{}; for (auto b : state) { llvm::DenseMap map{}; - InsertErase(mt, map, mask); + InsertErase(rng, map, mask); } } BENCHMARK(BM_llvmDenseMapInsertErase)->DenseRange(2, 8, 1); static void BM_llvmSmallDenseMapInsertErase(benchmark::State &state) { - uint64_t mask = ((1ull << state.range(0)) - 1) << 3ull; - std::mt19937_64 mt; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + std::mt19937_64 rng; for (auto b : state) { llvm::SmallDenseMap map{}; - InsertErase(mt, map, mask); + InsertErase(rng, map, mask); } } BENCHMARK(BM_llvmSmallDenseMapInsertErase)->DenseRange(2, 8, 1); static void BM_BumpMapInsertErase(benchmark::State &state) { - OwningArena<> alloc; - uint64_t mask = ((1ull << state.range(0)) - 1) << 3ull; - std::mt19937_64 mt; + poly::alloc::OwningArena<> alloc; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + std::mt19937_64 rng; for (auto b : state) { - amap map{alloc}; - InsertErase(mt, map, mask); + poly::dict::amap map{&alloc}; + InsertErase(rng, map, mask); alloc.reset(); } } BENCHMARK(BM_BumpMapInsertErase)->DenseRange(2, 8, 1); +static void BM_TrieInsertErase(benchmark::State &state) { + poly::alloc::OwningArena<> alloc; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + std::mt19937_64 rng; + for (auto b : state) { + TrieWrap> map{{},&alloc}; + InsertErase(rng, map, mask); + alloc.reset(); + } +} +BENCHMARK(BM_TrieInsertErase)->DenseRange(2, 8, 1); + +static void BM_InlineTrieInsertErase(benchmark::State &state) { + poly::alloc::OwningArena<> alloc; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + std::mt19937_64 rng; + for (auto b : state) { + TrieWrap> map{{},&alloc}; + InsertErase(rng, map, mask); + alloc.reset(); + } +} +BENCHMARK(BM_InlineTrieInsertErase)->DenseRange(2, 8, 1); + static void BM_ankerlMapInsertErase(benchmark::State &state) { - uint64_t mask = ((1ull << state.range(0)) - 1) << 3ull; - std::mt19937_64 mt; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + std::mt19937_64 rng; for (auto b : state) { ankerl::unordered_dense::map map; - InsertErase(mt, map, mask); + InsertErase(rng, map, mask); } } BENCHMARK(BM_ankerlMapInsertErase)->DenseRange(2, 8, 1); static void BM_stdUnorderedMapInsertErase(benchmark::State &state) { - uint64_t mask = ((1ull << state.range(0)) - 1) << 3ull; - std::mt19937_64 mt; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + std::mt19937_64 rng; for (auto b : state) { std::unordered_map map; - InsertErase(mt, map, mask); + InsertErase(rng, map, mask); } } BENCHMARK(BM_stdUnorderedMapInsertErase)->DenseRange(2, 8, 1); static void BM_llvmDenseMapInsertLookup(benchmark::State &state) { - uint64_t mask = ((1ull << state.range(0)) - 1) << 3ull; - std::mt19937_64 mt; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + std::mt19937_64 rng; for (auto b : state) { llvm::DenseMap map{}; - InsertLookup2(mt, map, mask); + InsertLookup2(rng, map, mask); } } BENCHMARK(BM_llvmDenseMapInsertLookup)->DenseRange(2, 8, 1); static void BM_llvmSmallDenseMapInsertLookup(benchmark::State &state) { - uint64_t mask = ((1ull << state.range(0)) - 1) << 3ull; - std::mt19937_64 mt; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + std::mt19937_64 rng; for (auto b : state) { llvm::SmallDenseMap map{}; - InsertLookup2(mt, map, mask); + InsertLookup2(rng, map, mask); } } BENCHMARK(BM_llvmSmallDenseMapInsertLookup)->DenseRange(2, 8, 1); static void BM_BumpMapInsertLookup(benchmark::State &state) { - OwningArena<> alloc; - uint64_t mask = ((1ull << state.range(0)) - 1) << 3ull; - std::mt19937_64 mt; + poly::alloc::OwningArena<> alloc; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + std::mt19937_64 rng; for (auto b : state) { - amap map{alloc}; - InsertLookup2(mt, map, mask); + poly::dict::amap map{&alloc}; + InsertLookup2(rng, map, mask); alloc.reset(); } } BENCHMARK(BM_BumpMapInsertLookup)->DenseRange(2, 8, 1); static void BM_ankerlMapInsertLookup(benchmark::State &state) { - uint64_t mask = ((1ull << state.range(0)) - 1) << 3ull; - std::mt19937_64 mt; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + std::mt19937_64 rng; for (auto b : state) { ankerl::unordered_dense::map map; - InsertLookup2(mt, map, mask); + InsertLookup2(rng, map, mask); } } BENCHMARK(BM_ankerlMapInsertLookup)->DenseRange(2, 8, 1); static void BM_stdUnorderedMapInsertLookup(benchmark::State &state) { - uint64_t mask = ((1ull << state.range(0)) - 1) << 3ull; - std::mt19937_64 mt; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + std::mt19937_64 rng; for (auto b : state) { std::unordered_map map; - InsertLookup2(mt, map, mask); + InsertLookup2(rng, map, mask); } } BENCHMARK(BM_stdUnorderedMapInsertLookup)->DenseRange(2, 8, 1); static void BM_llvmDenseMapInsertLookup3(benchmark::State &state) { - uint64_t mask = ((1ull << state.range(0)) - 1) << 3ull; - std::mt19937_64 mt; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + std::mt19937_64 rng; for (auto b : state) { llvm::DenseMap map{}; - InsertLookup3(mt, map, mask); + InsertLookup3(rng, map, mask); } } BENCHMARK(BM_llvmDenseMapInsertLookup3)->DenseRange(2, 8, 1); static void BM_llvmSmallDenseMapInsertLookup3(benchmark::State &state) { - uint64_t mask = ((1ull << state.range(0)) - 1) << 3ull; - std::mt19937_64 mt; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + std::mt19937_64 rng; for (auto b : state) { llvm::SmallDenseMap map{}; - InsertLookup3(mt, map, mask); + InsertLookup3(rng, map, mask); } } BENCHMARK(BM_llvmSmallDenseMapInsertLookup3)->DenseRange(2, 8, 1); static void BM_BumpMapInsertLookup3(benchmark::State &state) { - OwningArena<> alloc; - uint64_t mask = ((1ull << state.range(0)) - 1) << 3ull; - std::mt19937_64 mt; + poly::alloc::OwningArena<> alloc; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + std::mt19937_64 rng; for (auto b : state) { - amap map{alloc}; - InsertLookup3(mt, map, mask); + poly::dict::amap map{&alloc}; + InsertLookup3(rng, map, mask); alloc.reset(); } } BENCHMARK(BM_BumpMapInsertLookup3)->DenseRange(2, 8, 1); static void BM_ankerlMapInsertLookup3(benchmark::State &state) { - uint64_t mask = ((1ull << state.range(0)) - 1) << 3ull; - std::mt19937_64 mt; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + std::mt19937_64 rng; for (auto b : state) { ankerl::unordered_dense::map map; - InsertLookup3(mt, map, mask); + InsertLookup3(rng, map, mask); } } BENCHMARK(BM_ankerlMapInsertLookup3)->DenseRange(2, 8, 1); static void BM_stdUnorderedMapInsertLookup3(benchmark::State &state) { - uint64_t mask = ((1ull << state.range(0)) - 1) << 3ull; - std::mt19937_64 mt; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + std::mt19937_64 rng; for (auto b : state) { std::unordered_map map; - InsertLookup3(mt, map, mask); + InsertLookup3(rng, map, mask); } } BENCHMARK(BM_stdUnorderedMapInsertLookup3)->DenseRange(2, 8, 1); @@ -204,9 +238,9 @@ static void BM_llvmSmallDenseMapSeq(benchmark::State &state) { BENCHMARK(BM_llvmSmallDenseMapSeq)->RangeMultiplier(2)->Range(1 << 2, 1 << 10); static void BM_BumpMapSeq(benchmark::State &state) { - OwningArena<> alloc; + poly::alloc::OwningArena<> alloc; for (auto b : state) { - amap map{alloc}; + poly::dict::amap map{&alloc}; for (uint64_t i = 1; i <= uint64_t(state.range(0)); ++i) map[reinterpret_cast(8 * i)] = i; for (uint64_t i = 1; i <= uint64_t(state.range(0)); ++i) diff --git a/benchmark/include/matrix_exp.hpp b/benchmark/include/matrix_exp.hpp index 213499ad8..379b62322 100644 --- a/benchmark/include/matrix_exp.hpp +++ b/benchmark/include/matrix_exp.hpp @@ -1,11 +1,12 @@ #pragma once -#include "Containers/TinyVector.hpp" -#include "Math/Array.hpp" -#include "Math/LinearAlgebra.hpp" -#include "Math/Matrix.hpp" -#include "Math/StaticArrays.hpp" -#include "Utilities/Invariant.hpp" +#include +#include +#include +#include +#include +#include +#include #include #include #include @@ -13,154 +14,27 @@ #include #include -template class Dual { - T val{}; - SVector partials{}; +using poly::math::Dual, poly::math::Vector, poly::containers::TinyVector, poly::math::SquareMatrix, poly::math::AbstractMatrix, poly::math::SquareDims, poly::math::I, poly::utils::eltype_t, poly::utils::invariant; -public: - using val_type = T; - static constexpr size_t num_partials = N; - constexpr Dual() = default; - constexpr Dual(T v) : val(v) {} - constexpr Dual(T v, size_t n) : val(v) { partials[n] = T{1}; } - constexpr Dual(T v, SVector g) : val(v), partials(g) {} - constexpr Dual(std::integral auto v) : val(v) {} - constexpr Dual(std::floating_point auto v) : val(v) {} - constexpr auto value() -> T & { return val; } - constexpr auto gradient() -> SVector & { return partials; } - [[nodiscard]] constexpr auto value() const -> const T & { return val; } - [[nodiscard]] constexpr auto gradient() const -> const SVector & { - return partials; - } - // constexpr auto operator[](size_t i) const -> T { return grad[i]; } - // constexpr auto operator[](size_t i) -> T & { return grad[i]; } - constexpr auto operator-() const -> Dual { return Dual(-val, -partials); } - constexpr auto operator+(const Dual &other) const -> Dual { - return {val + other.val, partials + other.partials}; - } - constexpr auto operator-(const Dual &other) const -> Dual { - return {val - other.val, partials - other.partials}; - } - constexpr auto operator*(const Dual &other) const -> Dual { - return {val * other.val, val * other.partials + other.val * partials}; - } - constexpr auto operator/(const Dual &other) const -> Dual { - return {val / other.val, (other.val * partials - val * other.partials) / - (other.val * other.val)}; - } - constexpr auto operator+=(const Dual &other) -> Dual & { - val += other.val; - partials += other.partials; - return *this; - } - constexpr auto operator-=(const Dual &other) -> Dual & { - val -= other.val; - partials -= other.partials; - return *this; - } - constexpr auto operator*=(const Dual &other) -> Dual & { - val *= other.val; - partials = val * other.partials + other.val * partials; - return *this; - } - constexpr auto operator/=(const Dual &other) -> Dual & { - val /= other.val; - partials = - (other.val * partials - val * other.partials) / (other.val * other.val); - return *this; - } - constexpr auto operator+(double other) const -> Dual { - return {val + other, partials}; - } - constexpr auto operator-(double other) const -> Dual { - return {val - other, partials}; - } - constexpr auto operator*(double other) const -> Dual { - return {val * other, other * partials}; - } - constexpr auto operator/(double other) const -> Dual { - return {val / other, partials / other}; - } - constexpr auto operator+=(double other) -> Dual & { - val += other; - return *this; - } - constexpr auto operator-=(double other) -> Dual & { - val -= other; - return *this; - } - constexpr auto operator*=(double other) -> Dual & { - val *= other; - partials *= other; - return *this; - } - constexpr auto operator/=(double other) -> Dual & { - val /= other; - partials /= other; - return *this; - } - constexpr auto operator==(const Dual &other) const -> bool { - return val == other.val; // && grad == other.grad; - } - constexpr auto operator!=(const Dual &other) const -> bool { - return val != other.val; // || grad != other.grad; - } - constexpr auto operator==(double other) const -> bool { return val == other; } - constexpr auto operator!=(double other) const -> bool { return val != other; } - constexpr auto operator<(double other) const -> bool { return val < other; } - constexpr auto operator>(double other) const -> bool { return val > other; } - constexpr auto operator<=(double other) const -> bool { return val <= other; } - constexpr auto operator>=(double other) const -> bool { return val >= other; } - constexpr auto operator<(const Dual &other) const -> bool { - return val < other.val; - } - constexpr auto operator>(const Dual &other) const -> bool { - return val > other.val; - } - constexpr auto operator<=(const Dual &other) const -> bool { - return val <= other.val; - } - constexpr auto operator>=(const Dual &other) const -> bool { - return val >= other.val; - } -}; -template Dual(T, SVector) -> Dual; - -template -constexpr auto operator+(double other, Dual x) -> Dual { - return {x.value() + other, x.gradient()}; -} -template -constexpr auto operator-(double other, Dual x) -> Dual { - return {x.value() - other, -x.gradient()}; -} -template -constexpr auto operator*(double other, Dual x) -> Dual { - return {x.value() * other, other * x.gradient()}; -} -template -constexpr auto operator/(double other, Dual x) -> Dual { - return {other / x.value(), -other * x.gradient() / (x.value() * x.value())}; -} -static_assert(ElementOf, 2>>>); // auto x = Dual, 2>{1.0}; // auto y = x * 3.4; static_assert(std::convertible_to>); static_assert(std::convertible_to, 2>>); -template struct URand { - using T = typename D::val_type; - static constexpr size_t N = D::num_partials; - auto operator()(std::mt19937_64 &mt) -> D { - Dual x{URand{}(mt)}; - for (size_t i = 0; i < N; ++i) x.gradient()[i] = URand{}(mt); +template struct URand { +}; + +template struct URand> { + auto operator()(std::mt19937_64 &rng) -> Dual { + Dual x{URand{}(rng)}; + for (size_t i = 0; i < N; ++i) x.gradient()[i] = URand{}(rng); return x; } }; template <> struct URand { - auto operator()(std::mt19937_64 &mt) -> double { - return std::uniform_real_distribution(-2, 2)(mt); + auto operator()(std::mt19937_64 &rng) -> double { + return std::uniform_real_distribution(-2, 2)(rng); } }; @@ -207,10 +81,10 @@ template constexpr auto opnorm1(const T &A) { v.resizeForOverwrite(n); invariant(A.numRow() > 0); for (size_t j = 0; j < n; ++j) - v[j] = std::abs(extractDualValRecurse(A(0, j))); + v[j] = std::abs(extractDualValRecurse(A[0, j])); for (size_t i = 1; i < n; ++i) for (size_t j = 0; j < n; ++j) - v[j] += std::abs(extractDualValRecurse(A(i, j))); + v[j] += std::abs(extractDualValRecurse(A[i, j])); return *std::max_element(v.begin(), v.end()); } @@ -262,7 +136,7 @@ template constexpr auto expm(const T &A) { *v += *u; } // return (V - U) \ (V + U); - LU::fact(std::move(A2)).ldiv(MutPtrMatrix(V)); + poly::math::LU::fact(std::move(A2)).ldiv(poly::math::MutPtrMatrix(V)); for (; s--;) { U = V * V; std::swap(U, V); @@ -286,28 +160,28 @@ void expbench(const auto &A) { static void BM_expm(benchmark::State &state) { unsigned dim = state.range(0); - std::mt19937_64 mt(0); + std::mt19937_64 rng0; SquareMatrix A{SquareDims{dim}}; - for (auto &a : A) a = URand{}(mt); + for (auto &a : A) a = URand{}(rng0); for (auto b : state) expbench(A); } BENCHMARK(BM_expm)->DenseRange(2, 10, 1); static void BM_expm_dual4(benchmark::State &state) { unsigned dim = state.range(0); - std::mt19937_64 mt(0); + std::mt19937_64 rng0; using D = Dual; SquareMatrix A{SquareDims{dim}}; - for (auto &a : A) a = URand{}(mt); + for (auto &a : A) a = URand{}(rng0); for (auto b : state) expbench(A); } BENCHMARK(BM_expm_dual4)->DenseRange(2, 10, 1); static void BM_expm_dual4x2(benchmark::State &state) { unsigned dim = state.range(0); - std::mt19937_64 mt(0); + std::mt19937_64 rng0; using D = Dual, 2>; SquareMatrix A{SquareDims{dim}}; - for (auto &a : A) a = URand{}(mt); + for (auto &a : A) a = URand{}(rng0); for (auto b : state) expbench(A); } BENCHMARK(BM_expm_dual4x2)->DenseRange(2, 10, 1); @@ -315,19 +189,19 @@ BENCHMARK(BM_expm_dual4x2)->DenseRange(2, 10, 1); using D4D2 = Dual, 2>; using SMDD = SquareMatrix; #ifdef __INTEL_LLVM_COMPILER -using SMDD0 = math::ManagedArray; +using SMDD0 = poly::math::ManagedArray; #else -using SMDD0 = math::ManagedArray; +using SMDD0 = poly::math::ManagedArray; #endif #pragma omp declare reduction(+ : SMDD0 : omp_out += omp_in) \ initializer(omp_priv = SMDD0{omp_orig.dim(), D4D2{}}) static void BM_expm_dual4x2_threads(benchmark::State &state) { unsigned dim = state.range(0); - std::mt19937_64 mt(0); + std::mt19937_64 rng0; using D = Dual, 2>; SquareMatrix A{SquareDims{dim}}; - for (auto &a : A) a = URand{}(mt); + for (auto &a : A) a = URand{}(rng0); for (auto bch : state) { SMDD0 B{SquareDims{dim}}; B.fill(D{0}); diff --git a/benchmark/include/simplex_benchmark.hpp b/benchmark/include/simplex_benchmark.hpp index 6f144a9b7..a9da9843c 100644 --- a/benchmark/include/simplex_benchmark.hpp +++ b/benchmark/include/simplex_benchmark.hpp @@ -878,11 +878,11 @@ static void BM_Simplex0(benchmark::State &state) { unsigned numCon = unsigned(tableau.numRow()) - 1; unsigned numVar = unsigned(tableau.numCol()) - 1; poly::utils::Valid simpBackup{ - poly::math::Simplex::create(alloc, numCon, numVar)}; + poly::math::Simplex::create(&alloc, numCon, numVar)}; simpBackup->getTableau() << tableau; // Simplex simpBackup{tableau}; poly::utils::Valid simp{poly::math::Simplex::create( - alloc, simpBackup->getNumCons(), simpBackup->getNumVars())}; + &alloc, simpBackup->getNumCons(), simpBackup->getNumVars())}; // Vector sol(37); for (auto b : state) { *simp << *simpBackup; @@ -895,7 +895,7 @@ static void BM_Simplex0(benchmark::State &state) { BENCHMARK(BM_Simplex0); static void BM_Simplex1(benchmark::State &state) { - IntMatrix tableau{ + poly::math::IntMatrix<> tableau{ "[0 0 0 1 0 -1 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 1 0 -1 0 0 725849473193 " "94205055327856 11 11 11 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 -1 0 0 0 0 0 " "0 0 0 0 0 0 0 0 0 0 0 1 0 -1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 " @@ -1114,13 +1114,14 @@ static void BM_Simplex1(benchmark::State &state) { "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 " "0 0 0 0 0 0 0 0 0 ]"_mat}; - OwningArena<> alloc; + poly::alloc::OwningArena<> alloc; unsigned numCon = unsigned(tableau.numRow()) - 1; unsigned numVar = unsigned(tableau.numCol()) - 1; - Valid simpBackup{Simplex::create(alloc, numCon, numVar, 0)}; + poly::utils::Valid simpBackup{ + poly::math::Simplex::create(&alloc, numCon, numVar, 0)}; simpBackup->getTableau() << tableau; - Valid simp{Simplex::create(alloc, simpBackup->getNumCons(), - simpBackup->getNumVars(), 0)}; + poly::utils::Valid simp{poly::math::Simplex::create( + &alloc, simpBackup->getNumCons(), simpBackup->getNumVars(), 0)}; for (auto b : state) { *simp << *simpBackup; bool fail = simp->initiateFeasible(); diff --git a/configure.benchmark b/configure.benchmark index df0652ce6..615e7d7b7 100755 --- a/configure.benchmark +++ b/configure.benchmark @@ -1,9 +1,9 @@ #!/bin/sh CXXFLAGS="" CXX=g++ cmake -S benchmark buildgcc/benchmark -DCMAKE_BUILD_TYPE=Release -CXXFLAGS="" CXX=/usr/bin/clang++ cmake -S benchmark buildclang/benchmark -DCMAKE_BUILD_TYPE=Release +CXXFLAGS="" CXX=clang++ cmake -S benchmark buildclang/benchmark -DCMAKE_BUILD_TYPE=Release CXXFLAGS="" CXX=g++ cmake -S test buildgcc/testrelease -DCMAKE_BUILD_TYPE=Release -CXXFLAGS="" CXX=/usr/bin/clang++ cmake -S test buildclang/testrelease -DCMAKE_BUILD_TYPE=Release +CXXFLAGS="" CXX=clang++ cmake -S test buildclang/testrelease -DCMAKE_BUILD_TYPE=Release if ! test -z "$icpx" then CXXFLAGS="" CXX=icpx cmake -S benchmark buildintel/benchmark -DCMAKE_BUILD_TYPE=Release diff --git a/configure.debug b/configure.debug index 2d3bda4fa..456f4a378 100755 --- a/configure.debug +++ b/configure.debug @@ -3,4 +3,4 @@ # sanitizers='Undefined' sanitizers='Address;Undefined' CXXFLAGS="" CXX=g++ cmake -S test -B buildgcc/test -DCMAKE_BUILD_TYPE=Debug -DUSE_SANITIZER=$sanitizers -DENABLE_TEST_COVERAGE=1 "$@" -CXXFLAGS="" CXX=/usr/bin/clang++ cmake -S test -B buildclang/test -DCMAKE_BUILD_TYPE=Debug -DUSE_SANITIZER=$sanitizers "$@" +CXXFLAGS="" CXX=clang++ cmake -S test -B buildclang/test -DCMAKE_BUILD_TYPE=Debug -DUSE_SANITIZER=$sanitizers "$@" diff --git a/configure.nosan b/configure.nosan index 0a230216f..217217f30 100755 --- a/configure.nosan +++ b/configure.nosan @@ -1,4 +1,4 @@ #!/bin/sh CXXFLAGS="" CXX=g++ cmake -S test -B buildgcc/nosan -DCMAKE_BUILD_TYPE=Debug "$@" -CXXFLAGS="" CXX=/usr/bin/clang++ cmake -S test -B buildclang/nosan -DCMAKE_BUILD_TYPE=Debug "$@" +CXXFLAGS="" CXX=clang++ cmake -S test -B buildclang/nosan -DCMAKE_BUILD_TYPE=Debug "$@" diff --git a/configure.reldeb b/configure.reldeb index 07c7a499e..91499a7a3 100755 --- a/configure.reldeb +++ b/configure.reldeb @@ -4,4 +4,4 @@ # CXXFLAGS="" CXX=g++ cmake -S test -B buildgcc/testreldeb -DCMAKE_BUILD_TYPE=RelWithDebInfo -DUSE_SANITIZER=$sanitizers "$@" # CXXFLAGS="" CXX=clang++ cmake -S test -B buildclang/testreldeb -DCMAKE_BUILD_TYPE=RelWithDebInfo -DUSE_SANITIZER=$ CXXFLAGS="" CXX=g++ cmake -S test -B buildgcc/testreldeb -DCMAKE_BUILD_TYPE=RelWithDebInfo "$@" -CXXFLAGS="" CXX=/usr/bin/clang++ cmake -S test -B buildclang/testreldeb -DCMAKE_BUILD_TYPE=RelWithDebInfo "$@" +CXXFLAGS="" CXX=clang++ cmake -S test -B buildclang/testreldeb -DCMAKE_BUILD_TYPE=RelWithDebInfo "$@" diff --git a/include/Dicts/BumpMapSet.hpp b/include/Dicts/BumpMapSet.hpp index 5fc93d8b3..681173eb8 100644 --- a/include/Dicts/BumpMapSet.hpp +++ b/include/Dicts/BumpMapSet.hpp @@ -3,7 +3,6 @@ #include #include #include -#include namespace poly::dict { diff --git a/include/Dicts/BumpVector.hpp b/include/Dicts/BumpVector.hpp index ac6861755..9f869163e 100644 --- a/include/Dicts/BumpVector.hpp +++ b/include/Dicts/BumpVector.hpp @@ -90,19 +90,19 @@ template struct BumpPtrVector { return mem[canonicalize(i, Size)]; } [[nodiscard]] constexpr auto front() -> T & { - assert(Size > 0); + invariant(Size > 0); return mem[0]; } [[nodiscard]] constexpr auto back() -> T & { - assert(Size > 0); + invariant(Size > 0); return mem[Size - 1]; } [[nodiscard]] constexpr auto front() const -> const T & { - assert(Size > 0); + invariant(Size > 0); return mem[0]; } [[nodiscard]] constexpr auto back() const -> const T & { - assert(Size > 0); + invariant(Size > 0); return mem[Size - 1]; } [[nodiscard]] constexpr auto isEmpty() const -> bool { return Size == 0; } @@ -114,13 +114,13 @@ template struct BumpPtrVector { // : mem(x.data()), N(x.size()) {} // constexpr MutPtrVector(T *pt, size_t NN) : mem(pt), N(NN) {} constexpr auto operator[](Range i) -> MutPtrVector { - assert(i.b <= i.e); - assert(i.e <= Size); + invariant(i.b <= i.e); + invariant(i.e <= Size); return MutPtrVector{mem + i.b, i.e - i.b}; } constexpr auto operator[](Range i) const -> PtrVector { - assert(i.b <= i.e); - assert(i.e <= Size); + invariant(i.b <= i.e); + invariant(i.e <= Size); return PtrVector{mem + i.b, i.e - i.b}; } template @@ -228,7 +228,7 @@ template struct BumpPtrVector { Capacity = N; } constexpr void truncate(size_t N) { - assert(N <= Capacity); + invariant(N <= Capacity); Size = N; } constexpr void resize(size_t N) { @@ -267,7 +267,7 @@ template struct BumpPtrVector { [[nodiscard]] constexpr auto empty() const -> bool { return Size == 0; } constexpr void pop_back() { --Size; } constexpr void erase(T *x) { - assert(x >= mem && x < mem + Size); + invariant(x >= mem && x < mem + Size); std::destroy_at(x); std::copy_n(x + 1, Size, x); --Size; diff --git a/include/Dicts/MapVector.hpp b/include/Dicts/MapVector.hpp index e5e1ce47d..4b375e19d 100644 --- a/include/Dicts/MapVector.hpp +++ b/include/Dicts/MapVector.hpp @@ -7,8 +7,8 @@ namespace poly::dict { template class OrderedMap { amap map; - // math::BumpPtrVector> vector; - math::ResizeableView, unsigned> vector; + // math::BumpPtrVector> vector; + math::ResizeableView, unsigned> vector; public: constexpr OrderedMap(Arena<> *alloc) : map(alloc), vector() {} @@ -67,7 +67,7 @@ template class OrderedMap { vector.reserve((map.get_allocator().get_allocator()), std::max(8, 2 * i)); } - constexpr void insert(std::pair &&value) { + constexpr void insert(containers::Pair &&value) { insert(std::move(value.first), std::move(value.second)); } constexpr void clear() { diff --git a/include/Dicts/Trie.hpp b/include/Dicts/Trie.hpp index 5f03b1f3c..d680df8ec 100644 --- a/include/Dicts/Trie.hpp +++ b/include/Dicts/Trie.hpp @@ -1,11 +1,13 @@ #pragma once #include +#include #include #include #include #include namespace poly::dict { +using utils::invariant; // Idea from from https://nullprogram.com/blog/2023/09/30/ template struct TrieMapNode { K first; @@ -17,7 +19,7 @@ template struct TrieMapNode { } auto operator[](utils::Valid> alloc, const K &k) -> V & { Child c = findChild(k); - if (c.child) return c.second; + if (c.child) return c.child->second; invariant(c.parent != nullptr); invariant(c.index < 4); c.parent[c.index] = alloc->create(); @@ -32,7 +34,7 @@ template struct TrieMapNode { uint64_t index; // child == parent->children[index]; }; constexpr auto firstChild() -> Child { - for (int i = 0; i < 4; ++i) + for (unsigned int i = 0; i < 4; ++i) if (TrieMapNode *c = children[i]) return Child{c, this, i}; return Child{nullptr, this, 0}; } @@ -63,10 +65,10 @@ template struct TrieMapNode { if (!n.child) break; l = n; } - l.parent.children[l.index] = nullptr; // leaf is moved up - l.child.children = child.child.children; // leaf takes child's children + l.parent->children[l.index] = nullptr; // leaf is moved up + l.child->children = child.child->children; // leaf takes child's children } - child.parent[child.index] = l.child; // leaf replaces deleted + child.parent->children[child.index] = l.child; // leaf replaces deleted return child.child; } @@ -85,22 +87,21 @@ struct TrieMap : TrieMapNode { // TODO: implement using `list` to avoid allocs void erase(const K &k) { NodeT *erased = this->eraseImpl(k); - erased->children[0] = list; - list = erased; + erased->children[0] = std::exchange(list, erased); } auto operator[](utils::Valid> alloc, const K &k) -> V & { - typename NodeT::Child c = findChild(k); - if (c.child) return c.second; + typename NodeT::Child c = this->findChild(k); + if (c.child) return c.child->second; invariant(c.parent != nullptr); invariant(c.index < 4); if (list) { - c.parent[c.index] = list; - list = list->children[0]; + c.parent->children[c.index] = list; + list = std::exchange(list->children[0], nullptr); } else { - c.parent[c.index] = alloc->create(); + c.parent->children[c.index] = alloc->create(); } - c.parent[c.index]->first = k; - return c.parent[c.index]->second; + c.parent->children[c.index]->first = k; + return c.parent->children[c.index]->second; } }; @@ -138,11 +139,11 @@ template struct InlineTrie { return c.node->values[c.index]; } - void eraseImpl(const K &k) { + void erase(const K &k) { Child c = findChild(this, k); if (c.subIndex) return; // was not found // We now find a leaf key/value pair, and move them here. - InlineTrie *descendent = c.node[c.index]; + InlineTrie *descendent = c.node->children[c.index]; if (!descendent) { c.node->keys[c.index] = {}; // set to null return; diff --git a/include/Graphs/Bipartite.hpp b/include/Graphs/Bipartite.hpp index 059b8c9f6..8cdeaba6d 100644 --- a/include/Graphs/Bipartite.hpp +++ b/include/Graphs/Bipartite.hpp @@ -31,7 +31,7 @@ inline auto bipartiteMatch(Matrix &bpGraph, int u, /// Returns maximum number /// of matching from M to N inline auto maxBipartiteMatch(Matrix &bpGraph) - -> std::pair> { + -> containers::Pair> { // An array to keep track of the // applicants assigned to jobs. // The value of matchR[i] is the @@ -39,7 +39,7 @@ inline auto maxBipartiteMatch(Matrix &bpGraph) // the value -1 indicates nobody is // assigned. auto [N, M] = bpGraph.size(); - std::pair> res{0, {unsigned(N), -1}}; + containers::Pair> res{0, {unsigned(N), -1}}; size_t &result = res.first; Vector &matchR{res.second}; if (M) { diff --git a/include/IR/Address.hpp b/include/IR/Address.hpp index 4ff07d9d4..c251a3709 100644 --- a/include/IR/Address.hpp +++ b/include/IR/Address.hpp @@ -180,8 +180,8 @@ class Addr : public Instruction { unsigned newNatDepth = 0; for (ptrdiff_t d = getArrayDim(); d--;) { buff << 0; - for (ptrdiff_t k = 0; k < oldNatDepth; ++k) buff += M(d, k) * Pinv(k, _); - mStar(d, _) << buff; + for (ptrdiff_t k = 0; k < oldNatDepth; ++k) buff += M[d, k] * Pinv[k, _]; + mStar[d, _] << buff; if (newNatDepth == depth) continue; // find last auto range = std::ranges::reverse_view{buff[_(newNatDepth, depth)]}; @@ -196,7 +196,7 @@ class Addr : public Instruction { this->naturalDepth = newNatDepth; MutDensePtrMatrix indMat{this->indexMatrix()}; for (ptrdiff_t d = 1; d < getArrayDim(); ++d) - indMat(d, _) << mStar(d, _(0, newNatDepth)); + indMat[d, _] << mStar[d, _(0, newNatDepth)]; this->naturalDepth = newNatDepth; } // NOTE: this requires `nodeOrDepth` to be set to innmost loop depth @@ -291,13 +291,13 @@ class Addr : public Instruction { alloc->allocate(arrayDim + nOff + numLoops - 1); unsigned natDepth = numLoops; for (; natDepth; --natDepth) - if (math::anyNEZero(indMat(_, natDepth - 1))) break; + if (math::anyNEZero(indMat[_, natDepth - 1])) break; auto *ma = new (mem) Addr(arrayPtr, user, offsets, syms, std::array{arrayDim, nOff}, numLoops, natDepth, maxNumLoops); std::copy_n(szOff[0].begin(), arrayDim, syms); std::copy_n(szOff[1].begin(), nOff, syms + arrayDim); - ma->indexMatrix() << indMat(_, _(0, natDepth)); // naturalDepth + ma->indexMatrix() << indMat[_, _(0, natDepth)]; // naturalDepth ma->getOffsetOmega() << coffsets; return ma; } @@ -344,7 +344,7 @@ class Addr : public Instruction { } [[nodiscard]] constexpr auto dependsOnIndVars(size_t d) -> bool { for (size_t i = 0, D = getArrayDim(); i < D; ++i) - if (anyNEZero(indexMatrix()(i, _(d, end)))) return true; + if (anyNEZero(indexMatrix()[i, _(d, end)])) return true; return false; } [[nodiscard]] constexpr auto getAffLoop() const -> Valid { @@ -395,22 +395,22 @@ class Addr : public Instruction { MutPtrVector sym{getSymbolicOffsets()}; offSym = alloc->allocate(size_t(numDynSym) * numDim); MutDensePtrMatrix offsMat{offsetMatrix()}; - if (dynSymInd) offsMat(_, _(0, dynSymInd)) << oldOffsMat; + if (dynSymInd) offsMat[_, _(0, dynSymInd)] << oldOffsMat; llvm::Loop *L = loop->getLLVMLoop(); for (unsigned d = loop->getNumLoops() - numToPeel; d--;) L = L->getParentLoop(); for (size_t i = numToPeel; i;) { L = L->getParentLoop(); - if (allZero(Rt(_, --i))) continue; + if (allZero(Rt[_, --i])) continue; // push the SCEV auto *iTyp = L->getInductionVariable(*SE)->getType(); const llvm::SCEV *S = SE->getAddRecExpr( SE->getZero(iTyp), SE->getOne(iTyp), L, llvm::SCEV::NoWrapMask); if (const llvm::SCEV **j = std::ranges::find(sym, S); j != sym.end()) { --numDynSym; - offsMat(_, std::distance(sym.begin(), j)) += Rt(_, i); + offsMat[_, std::distance(sym.begin(), j)] += Rt[_, i]; } else { - offsMat(_, dynSymInd) << Rt(_, i); + offsMat[_, dynSymInd] << Rt[_, i]; sym[dynSymInd++] = S; } } @@ -548,7 +548,7 @@ class Addr : public Instruction { if (i) os << ", "; bool printPlus = false; for (ptrdiff_t j = 0; j < numLoops; ++j) { - if (int64_t Aji = A(i, j)) { + if (int64_t Aji = A[i, j]) { if (printPlus) { if (Aji <= 0) { Aji *= -1; @@ -561,7 +561,7 @@ class Addr : public Instruction { } } for (ptrdiff_t j = 0; j < B.numCol(); ++j) { - if (int64_t offij = j ? B(i, j) : b[i]) { + if (int64_t offij = j ? B[i, j] : b[i]) { if (printPlus) { if (offij <= 0) { offij *= -1; @@ -603,7 +603,7 @@ inline auto operator<<(llvm::raw_ostream &os, const Addr &m) if (i) os << ", "; bool printPlus = false; for (ptrdiff_t j = 0; j < numLoops; ++j) { - if (int64_t Aji = A(i, j)) { + if (int64_t Aji = A[i, j]) { if (printPlus) { if (Aji <= 0) { Aji *= -1; @@ -616,7 +616,7 @@ inline auto operator<<(llvm::raw_ostream &os, const Addr &m) } } for (ptrdiff_t j = 0; j < offs.numCol(); ++j) { - if (int64_t offij = offs(i, j)) { + if (int64_t offij = offs[i, j]) { if (printPlus) { if (offij <= 0) { offij *= -1; diff --git a/include/IR/BBPredPath.hpp b/include/IR/BBPredPath.hpp index d0121a5d7..22ca821f1 100644 --- a/include/IR/BBPredPath.hpp +++ b/include/IR/BBPredPath.hpp @@ -55,7 +55,7 @@ class Map { [[nodiscard]] auto operator[](llvm::Instruction *inst) -> std::optional { return (*this)[inst->getParent()]; } - void insert(std::pair &&pair) { + void insert(containers::Pair &&pair) { map.insert(std::move(pair)); } [[nodiscard]] auto contains(llvm::BasicBlock *BB) const -> bool { diff --git a/include/IR/Cache.hpp b/include/IR/Cache.hpp index ab45ee17b..694b07819 100644 --- a/include/IR/Cache.hpp +++ b/include/IR/Cache.hpp @@ -196,7 +196,7 @@ class Cache { auto getCSE(Compute *I) -> Compute *& { return instCSEMap[InstByValue{I}]; } // NOLINTNEXTLINE(misc-no-recursion) auto createValue(llvm::Value *v, Predicate::Map *M, TreeResult tr, Value *&n) - -> std::pair { + -> containers::Pair { if (auto *i = llvm::dyn_cast(v)) return createInstruction(i, M, tr, n); if (auto *c = llvm::dyn_cast(v)) @@ -343,8 +343,8 @@ class Cache { math::Col C) { MutDensePtrMatrix B{matrix(alloc, A.numRow(), C)}; for (ptrdiff_t j = 0; j < R; ++j) { - B(j, _(0, A.numCol())) << A(j, _); - B(j, _(A.numCol(), end)) << 0; + B[j, _(0, A.numCol())] << A[j, _]; + B[j, _(A.numCol(), end)] << 0; } std::swap(A, B); } @@ -365,7 +365,7 @@ class Cache { /// complete the operands // NOLINTNEXTLINE(misc-no-recursion) auto complete(Compute *I, Predicate::Map *M, TreeResult tr) - -> std::pair { + -> containers::Pair { auto *i = I->getLLVMInstruction(); unsigned nOps = I->numCompleteOps(); auto ops = I->getOperands(); @@ -380,7 +380,7 @@ class Cache { } // update list of incomplets inline auto completeInstructions(Predicate::Map *M, TreeResult tr) - -> std::pair { + -> containers::Pair { Compute *completed = nullptr; for (Compute *I = tr.incomplete; I; I = static_cast(I->getNext())) { @@ -439,21 +439,21 @@ class Cache { /// `nullptr`, then all operands will be left incomplete. // NOLINTNEXTLINE(misc-no-recursion) auto getValue(llvm::Value *v, Predicate::Map *M, TreeResult tr) - -> std::pair { + -> containers::Pair { Value *&n = llvmToInternalMap[v]; if (n) return {n, tr}; // by reference, so we can update in creation return createValue(v, M, tr, n); } auto getValue(llvm::Instruction *I, Predicate::Map *M, TreeResult tr) - -> std::pair { + -> containers::Pair { auto [v, tret] = getValue(static_cast(I), M, tr); return {llvm::cast(v), tret}; } // NOLINTNEXTLINE(misc-no-recursion) auto createInstruction(llvm::Instruction *I, Predicate::Map *M, TreeResult tr, - Value *&t) -> std::pair { + Value *&t) -> containers::Pair { auto *load = llvm::dyn_cast(I); auto *store = llvm::dyn_cast(I); if (!load && !store) return createCompute(I, M, tr, t); @@ -473,7 +473,7 @@ class Cache { // NOLINTNEXTLINE(misc-no-recursion) auto createCompute(llvm::Instruction *I, Predicate::Map *M, TreeResult tr, - Value *&t) -> std::pair { + Value *&t) -> containers::Pair { auto [id, kind] = Compute::getIDKind(I); int numOps = int(I->getNumOperands()); Compute *n = std::construct_at(allocateInst(numOps), kind, I, id, -numOps); @@ -494,7 +494,7 @@ class Cache { // create Addr auto getArrayRef(llvm::Instruction *loadOrStore, llvm::Loop *L, llvm::Value *ptr, TreeResult tr) - -> std::pair { + -> containers::Pair { Value *&n = llvmToInternalMap[loadOrStore]; if (n) return {n, tr}; auto ret = createArrayRef(loadOrStore, L, ptr, tr); @@ -503,14 +503,14 @@ class Cache { } // create Addr auto createArrayRef(llvm::Instruction *loadOrStore, llvm::Value *ptr, - TreeResult tr) -> std::pair { + TreeResult tr) -> containers::Pair { llvm::Loop *L = LI->getLoopFor(loadOrStore->getParent()); return createArrayRef(loadOrStore, L, ptr, tr); } // create Addr auto createArrayRef(llvm::Instruction *loadOrStore, llvm::Loop *L, llvm::Value *ptr, TreeResult tr) - -> std::pair { + -> containers::Pair { const auto *elSz = SE->getElementSize(loadOrStore); const llvm::SCEV *accessFn = SE->getSCEVAtScope(ptr, L); unsigned numLoops = L->getLoopDepth(); @@ -523,7 +523,7 @@ class Cache { auto createArrayRef(llvm::Instruction *loadOrStore, const llvm::SCEV *accessFn, unsigned numLoops, const llvm::SCEV *elSz, TreeResult tr) - -> std::pair { + -> containers::Pair { // https://llvm.org/doxygen/Delinearization_8cpp_source.html#l00582 const llvm::SCEV *pb = SE->getPointerBase(accessFn); @@ -541,7 +541,7 @@ class Cache { if (numDims == 0) return {zeroDimRef(loadOrStore, arrayPtr, 0), tr}; unsigned numPeeled = tr.rejectDepth; numLoops -= numPeeled; - math::IntMatrix Rt{math::StridedDims{numDims, numLoops}, 0}; + math::IntMatrix Rt{math::StridedDims{numDims, numLoops}, 0}; llvm::SmallVector symbolicOffsets; uint64_t blackList{0}; math::Vector coffsets{unsigned(numDims), 0}; @@ -551,17 +551,17 @@ class Cache { for (ptrdiff_t i = 0; i < numDims; ++i) { offsets << 0; blackList |= - fillAffineIndices(Rt(i, _), &coffsets[i], offsets, symbolicOffsets, + fillAffineIndices(Rt[i, _], &coffsets[i], offsets, symbolicOffsets, subscripts[i], 1, numPeeled); if (offsets.size() > offsMat.numCol()) extendDensePtrMatCols(&alloc, offsMat, math::Row{i}, math::Col{offsets.size()}); - offsMat(i, _) << offsets; + offsMat[i, _] << offsets; } } size_t numExtraLoopsToPeel = 64 - std::countl_zero(blackList); Addr *op = Addr::construct(&alloc, arrayPtr, loadOrStore, - Rt(_, _(numExtraLoopsToPeel, end)), + Rt[_, _(numExtraLoopsToPeel, end)], {std::move(sizes), std::move(symbolicOffsets)}, coffsets, offsMat.data(), numLoops, tr.maxDepth); tr.addAddr(op); diff --git a/include/IR/ControlFlowMerging.hpp b/include/IR/ControlFlowMerging.hpp index b4b52423a..a275c437a 100644 --- a/include/IR/ControlFlowMerging.hpp +++ b/include/IR/ControlFlowMerging.hpp @@ -7,6 +7,7 @@ #include "IR/Predicate.hpp" #include "Alloc/Arena.hpp" #include +#include #include #include #include @@ -57,7 +58,7 @@ struct MergingCost { // that is, if we're fusing c and d, we can make each point toward // what the other one was pointing to, in order to link the chains. amap mergeMap; - math::BumpPtrVector> mergeList; + math::BumpPtrVector> mergeList; amap *> ancestorMap; llvm::InstructionCost cost; @@ -146,8 +147,8 @@ struct MergingCost { H = mergeMap[H]; } } - static constexpr auto popBit(uint8_t x) -> std::pair { - return {x & 1, x >> 1}; + static constexpr auto popBit(uint8_t x) -> containers::Pair { + return {bool(x & 1), uint8_t(x >> 1)}; } struct Allocate { diff --git a/include/IR/Instruction.hpp b/include/IR/Instruction.hpp index c56d15e7d..f51156cfc 100644 --- a/include/IR/Instruction.hpp +++ b/include/IR/Instruction.hpp @@ -9,10 +9,8 @@ #include #include #include -#include #include #include -#include #include #include #include @@ -120,7 +118,7 @@ class Compute : public Instruction { return inst; } static auto getIDKind(llvm::Instruction *I) - -> std::pair { + -> containers::Pair { if (auto *c = llvm::dyn_cast(I)) { if (auto *J = llvm::dyn_cast(c)) return {J->getIntrinsicID(), VK_Call}; diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index c8539045e..407599eae 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -1,11 +1,11 @@ #pragma once +#include "Alloc/Arena.hpp" #include "Containers/UnrolledList.hpp" #include "IR/InstructionCost.hpp" #include "IR/Users.hpp" #include "Polyhedra/Loops.hpp" #include "Support/Iterators.hpp" -#include "Alloc/Arena.hpp" #include "Utilities/ListRanges.hpp" #include #include @@ -496,11 +496,13 @@ class Instruction : public Value { llvm::Intrinsic::ID ID; Node::ValKind kind; llvm::Type *type; + constexpr auto operator==(const Identifier &other) const -> bool = default; }; // declarations [[nodiscard]] auto getIdentifier() const -> Identifier; inline void setOperands(Arena<> *alloc, math::PtrVector); }; +static_assert(std::is_copy_assignable_v); /// CVal /// A constant value w/ respect to the loopnest. diff --git a/include/IR/OptimizationPossibilities.hpp b/include/IR/OptimizationPossibilities.hpp index db0b5d564..06b3f5253 100644 --- a/include/IR/OptimizationPossibilities.hpp +++ b/include/IR/OptimizationPossibilities.hpp @@ -441,7 +441,7 @@ class LoopDependencies { }; constexpr auto begin() -> Iterator { return {this, offset}; } constexpr auto end() -> Iterator { return {this, size()}; } - constexpr auto findShared(IR::Addr *a) -> std::pair * { + constexpr auto findShared(IR::Addr *a) -> containers::Pair * { return addrMap.find(ArrayIndex{a}); } // constexpr auto getShared(IR::Addr *a) -> int32_t & { diff --git a/include/LinearProgramming/LoopBlock.hpp b/include/LinearProgramming/LoopBlock.hpp index e09ca5358..56068d05e 100644 --- a/include/LinearProgramming/LoopBlock.hpp +++ b/include/LinearProgramming/LoopBlock.hpp @@ -9,6 +9,7 @@ #include "Polyhedra/DependencyPolyhedra.hpp" #include "Polyhedra/Loops.hpp" #include "Polyhedra/Schedule.hpp" +#include #include #include #include @@ -17,12 +18,10 @@ #include #include #include -#include #include #include #include #include -#include #include #include #include @@ -322,7 +321,7 @@ class LoopBlock { auto p1 = allocator.checkpoint(); MutSquarePtrMatrix A = math::matrix(&allocator, nLoops + 1); - // BumpPtrVector> omegaOffsets{allocator}; + // BumpPtrVector> omegaOffsets{allocator}; // // we check all memory accesses in the node, to see if applying the same // omega offsets can zero dependence offsets. If so, we apply the shift. // we look for offsets, then try and validate that the shift @@ -345,18 +344,18 @@ class LoopBlock { // input and output, no relative shift of shared loops possible // but indices may of course differ. for (ptrdiff_t d = 0; d < E.numRow(); ++d) { - MutPtrVector x = A(rank, _); - x[last] = E(d, 0); + MutPtrVector x = A[rank, _]; + x[last] = E[d, 0]; foundNonZeroOffset |= x[last] != 0; ptrdiff_t j = 0; for (; j < depCommon; ++j) - x[L - j] = E(d, j + numSyms) + E(d, j + numSyms + dep0); + x[L - j] = E[d, j + numSyms] + E[d, j + numSyms + dep0]; if (dep0 != dep1) { ptrdiff_t offset = dep0 > dep1 ? numSyms : numSyms + dep0; - for (; j < depMax; ++j) x[L - j] = E(d, j + offset); + for (; j < depMax; ++j) x[L - j] = E[d, j + offset]; } for (; j < nLoops; ++j) x[L - j] = 0; - rank = math::NormalForm::updateForNewRow(A(_(0, rank + 1), _)); + rank = math::NormalForm::updateForNewRow(A[_(0, rank + 1), _]); } } else { // dep between nodes @@ -364,13 +363,13 @@ class LoopBlock { unsigned offset = dep.isForward() ? numSyms + dep0 : numSyms, numDep = dep.isForward() ? dep1 : dep0; for (ptrdiff_t d = 0; d < E.numRow(); ++d) { - MutPtrVector x = A(rank, _); - x[last] = E(d, 0); + MutPtrVector x = A[rank, _]; + x[last] = E[d, 0]; foundNonZeroOffset |= x[last] != 0; ptrdiff_t j = 0; - for (; j < numDep; ++j) x[L - j] = E(d, j + offset); + for (; j < numDep; ++j) x[L - j] = E[d, j + offset]; for (; j < nLoops; ++j) x[L - j] = 0; - rank = math::NormalForm::updateForNewRow(A(_(0, rank + 1), _)); + rank = math::NormalForm::updateForNewRow(A[_(0, rank + 1), _]); } } } @@ -384,13 +383,13 @@ class LoopBlock { unsigned offset = dep.isForward() ? numSyms : numSyms + dep0, numDep = dep.isForward() ? dep0 : dep1; for (ptrdiff_t d = 0; d < E.numRow(); ++d) { - MutPtrVector x = A(rank, _); - x[last] = E(d, 0); + MutPtrVector x = A[rank, _]; + x[last] = E[d, 0]; foundNonZeroOffset |= x[last] != 0; ptrdiff_t j = 0; - for (; j < numDep; ++j) x[L - j] = E(d, j + offset); + for (; j < numDep; ++j) x[L - j] = E[d, j + offset]; for (; j < nLoops; ++j) x[L - j] = 0; - rank = math::NormalForm::updateForNewRow(A(_(0, rank + 1), _)); + rank = math::NormalForm::updateForNewRow(A[_(0, rank + 1), _]); } } } @@ -400,14 +399,14 @@ class LoopBlock { // matrix A is reasonably diagonalized, should indicate ptrdiff_t c = 0; for (ptrdiff_t r = 0; r < rank; ++r) { - int64_t off = A(r, last); + int64_t off = A[r, last]; if (off == 0) continue; for (; c < nLoops; ++c) { - if (A(r, c) != 0) break; + if (A[r, c] != 0) break; offs[L - c] = 0; } if (c == nLoops) return; - int64_t Arc = A(r, c), x = off / Arc; + int64_t Arc = A[r, c], x = off / Arc; if (x * Arc != off) continue; offs[L - c++] = x; // decrement loop `L-c` by `x` nonZero = true; @@ -436,8 +435,8 @@ class LoopBlock { for (ptrdiff_t l = 0; l < numDep; ++l) { int64_t mlt = offs[l]; if (mlt == 0) continue; - satL(0, _) -= mlt * satL(offset + l, _); - bndL(0, _) -= mlt * bndL(offset + l, _); + satL[0, _] -= mlt * satL[offset + l, _]; + bndL[0, _] -= mlt * bndL[offset + l, _]; } if (!repeat) break; repeat = false; @@ -457,8 +456,8 @@ class LoopBlock { for (size_t l = 0; l < numDep; ++l) { int64_t mlt = offs[l]; if (mlt == 0) continue; - satL(0, _) -= mlt * satL(offset + l, _); - bndL(0, _) -= mlt * bndL(offset + l, _); + satL[0, _] -= mlt * satL[offset + l, _]; + bndL[0, _] -= mlt * bndL[offset + l, _]; } } } @@ -511,10 +510,10 @@ class LoopBlock { return params; } using BackupSchedule = - math::ResizeableView, + math::ResizeableView, unsigned>; using BackupSat = math::ResizeableView, unsigned>; - using Backup = std::pair; + using Backup = containers::Pair; static constexpr auto setScheduleMemoryOffsets(Dependencies deps, ScheduledNode *nodes, unsigned d) @@ -613,7 +612,7 @@ class LoopBlock { } // auto s = allocator->scope(); // TODO: use bumpalloc DenseMatrix nullSpace; // d x lfull - DenseMatrix A{node->getPhi()(_(0, depth), _).transpose()}; + DenseMatrix A{node->getPhi()[_(0, depth), _].transpose()}; math::NormalForm::nullSpace11(nullSpace, A); invariant(unsigned(nullSpace.numRow()), node->getNumLoops() - depth); // Now, we search index matrices for schedules not in the null space of @@ -629,22 +628,22 @@ class LoopBlock { PtrMatrix indMat = mem->indexMatrix(); // lsub x d A.resizeForOverwrite( math::DenseDims{nullSpace.numRow(), indMat.numCol()}); - A = nullSpace(_, _(0, indMat.numRow())) * indMat; + A = nullSpace[_, _(0, indMat.numRow())] * indMat; // we search A for rows that aren't all zero for (ptrdiff_t d = 0; d < A.numCol(); ++d) { - if (allZero(A(_, d))) continue; - indv << indMat(_, d); + if (allZero(A[_, d])) continue; + indv << indMat[_, d]; bool found = false; for (ptrdiff_t j = 0; j < candidates.numRow(); ++j) { - if (candidates(j, _(0, last)) != indv) continue; + if (candidates[j, _(0, last)] != indv) continue; found = true; - ++candidates(j, 0); + ++candidates[j, 0]; break; } if (!found) { candidates.resize(candidates.numRow() + 1); - assert(candidates(last, 0) == 0); - candidates(last, _(1, end)) << indv; + assert((candidates[last, 0]) == 0); + candidates[last, _(1, end)] << indv; } } } @@ -653,15 +652,15 @@ class LoopBlock { // number of repetitions (which were placed in first index) ptrdiff_t i = 0; for (ptrdiff_t j = 1; j < candidates.numRow(); ++j) - if (candidates(j, _) > candidates(i, _)) i = j; - node->getSchedule(depth) << candidates(i, _(1, end)); + if (candidates[j, _] > candidates[i, _]) i = j; + node->getSchedule(depth) << candidates[i, _(1, end)]; return; } // do we want to pick the outermost original loop, // or do we want to pick the outermost lex null space? node->getSchedule(depth) << 0; for (ptrdiff_t c = 0; c < nullSpace.numCol(); ++c) { - if (allZero(nullSpace(_, c))) continue; + if (allZero(nullSpace[_, c])) continue; node->getSchedule(depth)[c] = 1; return; } @@ -708,7 +707,7 @@ class LoopBlock { if (!node->phiIsScheduled(depth)) { int64_t l = sol[node->getPhiOffsetRange() + o].denomLCM(); for (ptrdiff_t i = 0; i < node->getPhi().numCol(); ++i) - assert(node->getPhi()(depth, i) == + assert((node->getPhi()[depth, i]) == sol[node->getPhiOffsetRange() + o][i] * l); } #endif @@ -743,9 +742,9 @@ class LoopBlock { result = Result::dependent(); } else { ScheduledNode *inNode = edge.input()->getNode(); - DensePtrMatrix inPhi = inNode->getPhi()(_(0, depth + 1), _), + DensePtrMatrix inPhi = inNode->getPhi()[_(0, depth + 1), _], outPhi = - outNode->getPhi()(_(0, depth + 1), _); + outNode->getPhi()[_(0, depth + 1), _]; edge.checkEmptySat(&allocator, inNode->getLoopNest(), inNode->getOffset(), inPhi, outNode->getLoopNest(), outNode->getOffset(), outPhi); @@ -761,8 +760,8 @@ class LoopBlock { if (edge.isSat(depth)) continue; ScheduledNode *inNode = edge.input()->getNode(); invariant(edge.output()->getNode(), outNode); - DensePtrMatrix inPhi = inNode->getPhi()(_(0, depth + 1), _), - outPhi = outNode->getPhi()(_(0, depth + 1), _); + DensePtrMatrix inPhi = inNode->getPhi()[_(0, depth + 1), _], + outPhi = outNode->getPhi()[_(0, depth + 1), _]; edge.checkEmptySat(&allocator, inNode->getLoopNest(), inNode->getOffset(), inPhi, outNode->getLoopNest(), outNode->getOffset(), outPhi); @@ -959,18 +958,18 @@ class LoopBlock { Col ll = l + satL.numCol(); Col lll = ll + bndL.numCol(); - C(_(c, cc), _(l, ll)) << satL; - C(_(cc, ccc), _(ll, lll)) << bndL; + C[_(c, cc), _(l, ll)] << satL; + C[_(cc, ccc), _(ll, lll)] << bndL; l = lll; // bounding - C(_(cc, ccc), w++) << bndWU(_, 0); + C[_(cc, ccc), w++] << bndWU[_, 0]; Col uu = u + bndWU.numCol() - 1; - C(_(cc, ccc), _(u, uu)) << bndWU(_, _(1, end)); + C[_(cc, ccc), _(u, uu)] << bndWU[_, _(1, end)]; u = uu; if (!satisfyDeps || !edge.stashedPreventsReordering(d)) - C(_(c, cc), 0) << satC; - else C(_(c, cc), 0) << satC + satW; - C(_(cc, ccc), 0) << bndC; + C[_(c, cc), 0] << satC; + else C[_(c, cc), 0] << satC + satW; + C[_(cc, ccc), 0] << bndC; // now, handle Phi and Omega // phis are not constrained to be 0 if (outNode == inNode) { @@ -979,17 +978,17 @@ class LoopBlock { if (outNode->phiIsScheduled(d)) { // add it constants auto sch = outNode->getSchedule(d); - C(_(c, cc), 0) -= + C[_(c, cc), 0] -= satPc * sch[_(0, nPc)] + satPp * sch[_(0, nPp)]; - C(_(cc, ccc), 0) -= + C[_(cc, ccc), 0] -= bndPc * sch[_(0, nPc)] + bndPp * sch[_(0, nPp)]; } else { // FIXME: phiChild = [14:18), 4 cols // while Dependence seems to indicate 2 // loops why the disagreement? auto po = outNode->getPhiOffset() + p; - C(_(c, cc), _(po, po + nPc)) << satPc + satPp; - C(_(cc, ccc), _(po, po + nPc)) << bndPc + bndPp; + C[_(c, cc), _(po, po + nPc)] << satPc + satPp; + C[_(cc, ccc), _(po, po + nPc)] << bndPc + bndPp; } } else if (outNode->phiIsScheduled(d)) { // add it constants @@ -999,28 +998,28 @@ class LoopBlock { auto sch = outNode->getSchedule(d); auto schP = sch[_(0, nPp)]; auto schC = sch[_(0, nPc)]; - C(_(c, cc), 0) -= satPc * schC + satPp * schP; - C(_(cc, ccc), 0) -= bndPc * schC + bndPp * schP; + C[_(c, cc), 0] -= satPc * schC + satPp * schP; + C[_(cc, ccc), 0] -= bndPc * schC + bndPp * schP; } else if (nPc < nPp) { // Pp has more cols, so outer/leftmost overlap auto po = outNode->getPhiOffset() + p, poc = po + nPc, pop = po + nPp; - C(_(c, cc), _(po, poc)) << satPc + satPp(_, _(0, nPc)); - C(_(cc, ccc), _(po, poc)) << bndPc + bndPp(_, _(0, nPc)); - C(_(c, cc), _(poc, pop)) << satPp(_, _(nPc, end)); - C(_(cc, ccc), _(poc, pop)) << bndPp(_, _(nPc, end)); + C[_(c, cc), _(po, poc)] << satPc + satPp[_, _(0, nPc)]; + C[_(cc, ccc), _(po, poc)] << bndPc + bndPp[_, _(0, nPc)]; + C[_(c, cc), _(poc, pop)] << satPp[_, _(nPc, end)]; + C[_(cc, ccc), _(poc, pop)] << bndPp[_, _(nPc, end)]; } else /* if (nPc > nPp) */ { auto po = outNode->getPhiOffset() + p, poc = po + nPc, pop = po + nPp; - C(_(c, cc), _(po, pop)) << satPc(_, _(0, nPp)) + satPp; - C(_(cc, ccc), _(po, pop)) << bndPc(_, _(0, nPp)) + bndPp; - C(_(c, cc), _(pop, poc)) << satPc(_, _(nPp, end)); - C(_(cc, ccc), _(pop, poc)) << bndPc(_, _(nPp, end)); + C[_(c, cc), _(po, pop)] << satPc[_, _(0, nPp)] + satPp; + C[_(cc, ccc), _(po, pop)] << bndPc[_, _(0, nPp)] + bndPp; + C[_(c, cc), _(pop, poc)] << satPc[_, _(nPp, end)]; + C[_(cc, ccc), _(pop, poc)] << bndPc[_, _(nPp, end)]; } - C(_(c, cc), outNode->getOmegaOffset() + o) - << satO(_, 0) + satO(_, 1); - C(_(cc, ccc), outNode->getOmegaOffset() + o) - << bndO(_, 0) + bndO(_, 1); + C[_(c, cc), outNode->getOmegaOffset() + o] + << satO[_, 0] + satO[_, 1]; + C[_(cc, ccc), outNode->getOmegaOffset() + o] + << bndO[_, 0] + bndO[_, 1]; } } else { if (d < edge.getOutCurrentDepth()) @@ -1036,16 +1035,16 @@ class LoopBlock { if (d < edge.getOutCurrentDepth()) { if (d < edge.getInCurrentDepth()) invariant(inNode->getOmegaOffset() != outNode->getOmegaOffset()); - C(_(c, cc), outNode->getOmegaOffset() + o) - << satO(_, edge.isForward()); - C(_(cc, ccc), outNode->getOmegaOffset() + o) - << bndO(_, edge.isForward()); + C[_(c, cc), outNode->getOmegaOffset() + o] + << satO[_, edge.isForward()]; + C[_(cc, ccc), outNode->getOmegaOffset() + o] + << bndO[_, edge.isForward()]; } if (d < edge.getInCurrentDepth()) { - C(_(c, cc), inNode->getOmegaOffset() + o) - << satO(_, !edge.isForward()); - C(_(cc, ccc), inNode->getOmegaOffset() + o) - << bndO(_, !edge.isForward()); + C[_(c, cc), inNode->getOmegaOffset() + o] + << satO[_, !edge.isForward()]; + C[_(cc, ccc), inNode->getOmegaOffset() + o] + << bndO[_, !edge.isForward()]; } } c = ccc; @@ -1066,13 +1065,13 @@ class LoopBlock { auto sch = node->getSchedule(d)[_(0, sat.numCol())]; // order is inner <-> outer // so we need the end of schedule if it is larger - C(_(c, cc), 0) -= sat * sch; - C(_(cc, ccc), 0) -= bnd * sch; + C[_(c, cc), 0] -= sat * sch; + C[_(cc, ccc), 0] -= bnd * sch; } else { // add it to C auto po = node->getPhiOffset() + p; - C(_(c, cc), _(po, po + sat.numCol())) << sat; - C(_(cc, ccc), _(po, po + bnd.numCol())) << bnd; + C[_(c, cc), _(po, po + sat.numCol())] << sat; + C[_(cc, ccc), _(po, po + bnd.numCol())] << bnd; } } void addIndependentSolutionConstraints(Valid omniSimplex, @@ -1089,9 +1088,9 @@ class LoopBlock { for (const ScheduledNode *node : nodes->getVertices()) { if (node->phiIsScheduled(d) || (!node->hasActiveEdges(deps, d))) continue; - C(i, 0) = 1; - C(i, node->getPhiOffsetRange() + o) << 1; - C(i++, ++s) = -1; // for >= + C[i, 0] = 1; + C[i, node->getPhiOffsetRange() + o] << 1; + C[i++, ++s] = -1; // for >= } } else { DenseMatrix A, N; @@ -1100,20 +1099,20 @@ class LoopBlock { (!node->hasActiveEdges(deps, d))) continue; A.resizeForOverwrite(Row{ptrdiff_t(node->getPhi().numCol())}, Col{d}); - A << node->getPhi()(_(0, d), _).transpose(); + A << node->getPhi()[_(0, d), _].transpose(); math::NormalForm::nullSpace11(N, A); // we add sum(NullSpace,dims=1) >= 1 // via 1 = sum(NullSpace,dims=1) - s, s >= 0 - C(i, 0) = 1; - MutPtrVector cc{C(i, node->getPhiOffsetRange() + o)}; + C[i, 0] = 1; + MutPtrVector cc{C[i, node->getPhiOffsetRange() + o]}; // sum(N,dims=1) >= 1 after flipping row signs to be lex > 0 for (ptrdiff_t m = 0; m < N.numRow(); ++m) - cc += N(m, _) * lexSign(N(m, _)); - C(i++, ++s) = -1; // for >= + cc += N[m, _] * lexSign(N[m, _]); + C[i++, ++s] = -1; // for >= } } invariant(ptrdiff_t(omniSimplex->getNumCons()), i); - assert(!allZero(omniSimplex->getConstraints()(last, _))); + assert(!allZero(omniSimplex->getConstraints()[last, _])); } [[nodiscard]] static constexpr auto lexSign(PtrVector x) -> int64_t { for (auto a : x) @@ -1146,7 +1145,7 @@ class LoopBlock { } }; inline auto operator<<(llvm::raw_ostream &os, - std::pair nodesdeps) + containers::Pair nodesdeps) -> llvm::raw_ostream & { auto [nodes, deps] = nodesdeps; os << "\nLoopBlock graph:\n"; diff --git a/include/LinearProgramming/ScheduledNode.hpp b/include/LinearProgramming/ScheduledNode.hpp index a869fabe4..8e306a858 100644 --- a/include/LinearProgramming/ScheduledNode.hpp +++ b/include/LinearProgramming/ScheduledNode.hpp @@ -406,11 +406,11 @@ class ScheduledNode { /// getSchedule, loops are always indexed from outer to inner [[nodiscard]] constexpr auto getSchedule(ptrdiff_t d) const -> PtrVector { - return getPhi()(d, _); + return getPhi()[d, _]; } [[nodiscard]] constexpr auto getSchedule(ptrdiff_t d) -> MutPtrVector { - return getPhi()(d, _); + return getPhi()[d, _]; } [[nodiscard]] constexpr auto getFusionOmega(ptrdiff_t i) const -> int64_t { return (mem + 1)[getNumLoopsSquared() + i]; @@ -452,8 +452,8 @@ class ScheduledNode { MutSquarePtrMatrix phi = getPhi(); ptrdiff_t indR = ptrdiff_t(indMat.numCol()); for (ptrdiff_t i = 0; i < r; ++i) { - phi(i, _(0, indR)) << indMat(i, _); - phi(i, _(indR, end)) << 0; + phi[i, _(0, indR)] << indMat[i, _]; + phi[i, _(indR, end)] << 0; } rank = r; } diff --git a/include/Polyhedra/Comparators.hpp b/include/Polyhedra/Comparators.hpp index 1fe4427fc..06c16973a 100644 --- a/include/Polyhedra/Comparators.hpp +++ b/include/Polyhedra/Comparators.hpp @@ -566,13 +566,13 @@ struct BaseSymbolicComparator : BaseComparator> { if (!allZero(b[_(V.numRow(), end)])) return false; auto H = matrix(alloc, V.numRow(), V.numCol() + 1); Col oldn = V.numCol(); - H(_, _(0, oldn)) << V; + H[_, _(0, oldn)] << V; // H.numRow() == b.size(), because we're only here if dimD == 0, // in which case V.numRow() == U.numRow() == b.size() - H(_, oldn) << b; + H[_, oldn] << b; solveSystem(H); for (ptrdiff_t i = numEquations; i < H.numRow(); ++i) - if ((H(i, oldn) > 0) != (H(i, i) > 0)) return false; + if ((H[i, oldn] > 0) != (H[i, i] > 0)) return false; return true; } [[nodiscard]] constexpr auto @@ -593,19 +593,19 @@ struct BaseSymbolicComparator : BaseComparator> { } ptrdiff_t numRowTrunc = getURank(); auto c = vector(alloc, unsigned(V.numRow() - numEquations)); - c << V(_(numEquations, end), _(begin, numRowTrunc)) * b; + c << V[_(numEquations, end), _(begin, numRowTrunc)] * b; auto dimNS = V.numCol() - numRowTrunc; // expand W stores [c -JV2 JV2] // we use simplex to solve [-JV2 JV2][y2+ y2-]' <= JV1D^(-1)Uq // where y2 = y2+ - y2- auto expandW = matrix(alloc, numSlack, dimNS * 2 + 1); for (ptrdiff_t i = 0; i < numSlack; ++i) { - expandW(i, 0) = c[i]; + expandW[i, 0] = c[i]; // expandW(i, 0) *= Dlcm; for (ptrdiff_t j = 0; j < dimNS;) { - auto val = V(i + numEquations, numRowTrunc + j++) * lcmD; - expandW(i, j) = -val; - expandW(i, dimNS + j) = val; + auto val = V[i + numEquations, numRowTrunc + j++] * lcmD; + expandW[i, j] = -val; + expandW[i, dimNS + j] = val; } } Optional optS{Simplex::positiveVariables(alloc, expandW)}; @@ -616,7 +616,7 @@ struct BaseSymbolicComparator : BaseComparator> { -> bool { auto U = getU(); auto b = vector(&alloc, unsigned(U.numRow())); - b << U(_, _(begin, query.size())) * query; + b << U[_, _(begin, query.size())] * query; return getD().size() ? greaterEqualRankDeficient(&alloc, b) : greaterEqualFullRank(&alloc, b); } diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index eec6250a1..d0fff5c93 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -269,52 +269,52 @@ class Dependence { return dependenceBounding->getConstraints(); } [[nodiscard]] auto getSatLambda() const -> PtrMatrix { - return getSatConstraints()(_, _(1, 1 + depPoly->getNumLambda())); + return getSatConstraints()[_, _(1, 1 + depPoly->getNumLambda())]; } [[nodiscard]] auto getBndLambda() const -> PtrMatrix { - return getBndConstraints()(_, _(1, 1 + depPoly->getNumLambda())); + return getBndConstraints()[_, _(1, 1 + depPoly->getNumLambda())]; } [[nodiscard]] auto getSatPhiCoefs() const -> PtrMatrix { auto l = 3 + depPoly->getNumLambda(); - return getSatConstraints()(_, _(l, l + getNumPhiCoefficients())); + return getSatConstraints()[_, _(l, l + getNumPhiCoefficients())]; } [[nodiscard]] auto getSatPhi0Coefs() const -> PtrMatrix { auto l = 3 + depPoly->getNumLambda(); - return getSatConstraints()(_, _(l, l + depPoly->getDim0())); + return getSatConstraints()[_, _(l, l + depPoly->getDim0())]; } [[nodiscard]] auto getSatPhi1Coefs() const -> PtrMatrix { auto l = 3 + depPoly->getNumLambda() + depPoly->getDim0(); - return getSatConstraints()(_, _(l, l + depPoly->getDim1())); + return getSatConstraints()[_, _(l, l + depPoly->getDim1())]; } [[nodiscard]] auto getBndPhiCoefs() const -> PtrMatrix { auto l = 3 + depPoly->getNumLambda(); - return getBndConstraints()(_, _(l, l + getNumPhiCoefficients())); + return getBndConstraints()[_, _(l, l + getNumPhiCoefficients())]; } [[nodiscard]] auto getBndPhi0Coefs() const -> PtrMatrix { auto l = 3 + depPoly->getNumLambda(); - return getBndConstraints()(_, _(l, l + depPoly->getDim0())); + return getBndConstraints()[_, _(l, l + depPoly->getDim0())]; } [[nodiscard]] auto getBndPhi1Coefs() const -> PtrMatrix { auto l = 3 + depPoly->getNumLambda() + depPoly->getDim0(); - return getBndConstraints()(_, _(l, l + depPoly->getDim1())); + return getBndConstraints()[_, _(l, l + depPoly->getDim1())]; } [[nodiscard]] auto getSatOmegaCoefs() const -> PtrMatrix { auto l = 1 + depPoly->getNumLambda(); - return getSatConstraints()(_, _(l, l + getNumOmegaCoefficients())); + return getSatConstraints()[_, _(l, l + getNumOmegaCoefficients())]; } [[nodiscard]] auto getBndOmegaCoefs() const -> PtrMatrix { auto l = 1 + depPoly->getNumLambda(); - return getBndConstraints()(_, _(l, l + getNumOmegaCoefficients())); + return getBndConstraints()[_, _(l, l + getNumOmegaCoefficients())]; } [[nodiscard]] auto getSatW() const -> math::StridedVector { - return getSatConstraints()(_, 1 + depPoly->getNumLambda() + + return getSatConstraints()[_, 1 + depPoly->getNumLambda() + getNumPhiCoefficients() + - getNumOmegaCoefficients()); + getNumOmegaCoefficients()]; } [[nodiscard]] auto getBndCoefs() const -> PtrMatrix { size_t lb = 1 + depPoly->getNumLambda() + getNumPhiCoefficients() + getNumOmegaCoefficients(); - return getBndConstraints()(_, _(lb, end)); + return getBndConstraints()[_, _(lb, end)]; } [[nodiscard]] auto satPhiCoefs() const -> std::array, 2> { PtrMatrix phiCoefsIn = getSatPhi1Coefs(), @@ -365,8 +365,8 @@ class Dependence { // forward means offset is 2nd - 1st schv[0] = outOffOmega[i]; schv[1] = inOffOmega[i]; - schv[_(2, 2 + numLoopsIn)] << inPhi(last - i, _); - schv[_(2 + numLoopsIn, 2 + numLoopsTotal)] << outPhi(last - i, _); + schv[_(2, 2 + numLoopsIn)] << inPhi[last - i, _]; + schv[_(2 + numLoopsIn, 2 + numLoopsTotal)] << outPhi[last - i, _]; // dependenceSatisfaction is phi_t - phi_s >= 0 // dependenceBounding is w + u'N - (phi_t - phi_s) >= 0 // we implicitly 0-out `w` and `u` here, @@ -679,8 +679,8 @@ class Dependencies { // insane math::Vector timeDirection(timeDim); ptrdiff_t t = 0; - auto fE{farkasBackups[0]->getConstraints()(_, _(1, end))}; - auto sE{farkasBackups[1]->getConstraints()(_, _(1, end))}; + auto fE{farkasBackups[0]->getConstraints()[_, _(1, end)]}; + auto sE{farkasBackups[1]->getConstraints()[_, _(1, end)]}; do { // set `t`th timeDim to +1/-1 // basically, what we do here is set it to `step` and pretend it was @@ -694,18 +694,18 @@ class Dependencies { int64_t Acv = dxy->getA(c, v); if (!Acv) continue; Acv *= step; - fE(0, c + 1) -= Acv; // *1 - sE(0, c + 1) -= Acv; // *1 + fE[0, c + 1] -= Acv; // *1 + sE[0, c + 1] -= Acv; // *1 } for (ptrdiff_t c = 0; c < numEqualityConstraintsOld; ++c) { // each of these actually represents 2 inds int64_t Ecv = dxy->getE(c, v); if (!Ecv) continue; Ecv *= step; - fE(0, c + ineqEnd) -= Ecv; - fE(0, c + posEqEnd) += Ecv; - sE(0, c + ineqEnd) -= Ecv; - sE(0, c + posEqEnd) += Ecv; + fE[0, c + ineqEnd] -= Ecv; + fE[0, c + posEqEnd] += Ecv; + sE[0, c + ineqEnd] -= Ecv; + sE[0, c + posEqEnd] += Ecv; } if (i++ != 0) break; // break after undoing timeDirection[t] = @@ -726,8 +726,8 @@ class Dependencies { if (!Acv) continue; Acv *= step; dxy->getA(c, 0) -= Acv; - fE(0, c + 1) -= Acv; // *1 - sE(0, c + 1) -= Acv; // *-1 + fE[0, c + 1] -= Acv; // *1 + sE[0, c + 1] -= Acv; // *-1 } for (ptrdiff_t c = 0; c < numEqualityConstraintsOld; ++c) { // each of these actually represents 2 inds @@ -735,10 +735,10 @@ class Dependencies { if (!Ecv) continue; Ecv *= step; dxy->getE(c, 0) -= Ecv; - fE(0, c + ineqEnd) -= Ecv; - fE(0, c + posEqEnd) += Ecv; - sE(0, c + ineqEnd) -= Ecv; - sE(0, c + posEqEnd) += Ecv; + fE[0, c + ineqEnd] -= Ecv; + fE[0, c + posEqEnd] += Ecv; + sE[0, c + ineqEnd] -= Ecv; + sE[0, c + posEqEnd] += Ecv; } } while (++t < timeDim); // dxy->truncateVars(numVar); @@ -786,8 +786,8 @@ class Dependencies { assert(i != numLoopsCommon); sch[0] = xOffOmega[i]; sch[1] = yOffOmega[i]; - sch[_(2, 2 + numLoopsX)] << xPhi(last - i, _); - sch[_(2 + numLoopsX, 2 + numLoopsTotal)] << yPhi(last - i, _); + sch[_(2, 2 + numLoopsX)] << xPhi[last - i, _]; + sch[_(2 + numLoopsX, 2 + numLoopsTotal)] << yPhi[last - i, _]; if (fxy->unSatisfiableZeroRem(alloc, sch, numLambda, unsigned(nonTimeDim))) { assert(!fyx->unSatisfiableZeroRem(alloc, sch, numLambda, @@ -1203,8 +1203,8 @@ inline auto Loop::getLegality(poly::Dependencies deps, ptrdiff_t loop = this->currentDepth - 1; for (int32_t id : edges(loopDeps)) { Dependence::ID i{id}; - StridedVector in = deps.input(i)->indexMatrix()(_, loop), - out = deps.output(i)->indexMatrix()(_, loop); + StridedVector in = deps.input(i)->indexMatrix()[_, loop], + out = deps.output(i)->indexMatrix()[_, loop]; invariant(in.size(), out.size()); if (in != out) return setLegal(IndexMismatch); // ptrdiff_t common = std::min(in.size(), out.size()); diff --git a/include/Polyhedra/DependencyPolyhedra.hpp b/include/Polyhedra/DependencyPolyhedra.hpp index 6a3a00a75..df7de7a1e 100644 --- a/include/Polyhedra/DependencyPolyhedra.hpp +++ b/include/Polyhedra/DependencyPolyhedra.hpp @@ -36,9 +36,9 @@ inline auto printConstraints(std::ostream &os, DensePtrMatrix A, const Row numConstraints = A.numRow(); const unsigned numSyms = syms.size() + 1; for (Row c = 0; c < numConstraints; ++c) { - printConstraint(os, A(c, _), numSyms, inequality); + printConstraint(os, A[c, _], numSyms, inequality); for (ptrdiff_t v = 1; v < numSyms; ++v) { - if (int64_t Acv = A(c, v)) { + if (int64_t Acv = A[c, v]) { os << (Acv > 0 ? " + " : " - "); Acv = math::constexpr_abs(Acv); if (Acv != 1) os << Acv << "*"; @@ -247,23 +247,23 @@ class DepPoly : public BasePolyhedra { numDynSym}; } auto getSymbols(ptrdiff_t i) -> math::MutPtrVector { - return getA()(i, _(math::begin, getNumSymbols())); + return getA()[i, _(math::begin, getNumSymbols())]; } [[nodiscard]] auto getInEqSymbols(ptrdiff_t i) const -> PtrVector { - return getA()(i, _(math::begin, getNumSymbols())); + return getA()[i, _(math::begin, getNumSymbols())]; } [[nodiscard]] auto getEqSymbols(ptrdiff_t i) const -> PtrVector { - return getE()(i, _(math::begin, getNumSymbols())); + return getE()[i, _(math::begin, getNumSymbols())]; } [[nodiscard]] auto getCompTimeInEqOffset(ptrdiff_t i) const -> std::optional { - if (!allZero(getA()(i, _(1, getNumSymbols())))) return {}; - return getA()(i, 0); + if (!allZero(getA()[i, _(1, getNumSymbols())])) return {}; + return getA()[i, 0]; } [[nodiscard]] auto getCompTimeEqOffset(ptrdiff_t i) const -> std::optional { - if (!allZero(getE()(i, _(1, getNumSymbols())))) return {}; - return getE()(i, 0); + if (!allZero(getE()[i, _(1, getNumSymbols())])) return {}; + return getE()[i, 0]; } static constexpr auto findFirstNonEqual(PtrVector x, PtrVector y) -> ptrdiff_t { @@ -281,10 +281,10 @@ class DepPoly : public BasePolyhedra { PtrMatrix indMatX = x->indexMatrix(), indMatY = y->indexMatrix(); unsigned indDepth = std::min(x->getNaturalDepth(), y->getNaturalDepth()); for (ptrdiff_t i = 0; i < std::min(numLoopsCommon, indDepth); ++i) { - A(i, _(0, xDim)) << indMatX(_, i); - A(i, _(xDim, end)) << indMatY(_, i); + A[i, _(0, xDim)] << indMatX[_, i]; + A[i, _(xDim, end)] << indMatY[_, i]; } - for (ptrdiff_t i = indDepth; i < numLoopsCommon; ++i) A(i, _) << 0; + for (ptrdiff_t i = indDepth; i < numLoopsCommon; ++i) A[i, _] << 0; // returns rank x num loops return orthogonalNullSpace(std::move(A)); } @@ -295,8 +295,8 @@ class DepPoly : public BasePolyhedra { math::DenseMatrix A(math::DenseDims{numLoopsCommon, dim}); if (!numLoopsCommon) return A; // indMats cols are [outerMostLoop,...,innerMostLoop] - A(_(0, natDepth), _) << x->indexMatrix().transpose(); - if (natDepth < numLoopsCommon) A(_(natDepth, end), _) << 0; + A[_(0, natDepth), _] << x->indexMatrix().transpose(); + if (natDepth < numLoopsCommon) A[_(natDepth, end), _] << 0; // returns rank x num loops return orthogonalNullSpace(std::move(A)); } @@ -386,7 +386,7 @@ class DepPoly : public BasePolyhedra { Row nc = nc0 + nc1; unsigned indexDim{aix->getArrayDim()}; auto nullStep{dp->getNullStep()}; - for (ptrdiff_t i = 0; i < timeDim; ++i) nullStep[i] = selfDot(NS(i, _)); + for (ptrdiff_t i = 0; i < timeDim; ++i) nullStep[i] = selfDot(NS[i, _]); // column meansing in in order // const size_t numSymbols = getNumSymbols(); auto A{dp->getA()}; @@ -397,38 +397,38 @@ class DepPoly : public BasePolyhedra { // E.resize(indexDim + nullDim, A.numCol()); // ma0 loop for (ptrdiff_t i = 0; i < nc0; ++i) { - A(i, _(0, 1 + Sx.size())) << Ax(i, _(0, 1 + Sx.size())); - A(i, _(numSym, numSym + numDep0Var)) - << Ax(i, _(1 + Sx.size(), 1 + Sx.size() + numDep0Var)); + A[i, _(0, 1 + Sx.size())] << Ax[i, _(0, 1 + Sx.size())]; + A[i, _(numSym, numSym + numDep0Var)] + << Ax[i, _(1 + Sx.size(), 1 + Sx.size() + numDep0Var)]; } for (ptrdiff_t i = 0; i < nc1; ++i) { - A(nc0 + i, 0) = Ay(i, 0); + A[nc0 + i, 0] = Ay[i, 0]; for (ptrdiff_t j = 0; j < map.size(); ++j) - A(nc0 + i, 1 + map[j]) = Ay(i, 1 + j); + A[nc0 + i, 1 + map[j]] = Ay[i, 1 + j]; for (ptrdiff_t j = 0; j < numDep1Var; ++j) - A(nc0 + i, j + numSym + numDep0Var) = Ay(i, j + 1 + Sy.size()); + A[nc0 + i, j + numSym + numDep0Var] = Ay[i, j + 1 + Sy.size()]; } - A(_(nc, end), _(numSym, numSym + numVar)).diag() << 1; + A[_(nc, end), _(numSym, numSym + numVar)].diag() << 1; // indMats are [outerMostLoop, ..., innerMostLoop] x arrayDim // offsetMats are arrayDim x numSymbols // E(i,:)* indVars = q[i] // e.g. i_0 + j_0 + off_0 = i_1 + j_1 + off_1 // i_0 + j_0 - i_1 - j_1 = off_1 - off_0 for (ptrdiff_t i = 0; i < indexDim; ++i) { - E(i, _(0, Ox.numCol())) << Ox(i, _); - E(i, _(0, Cx.numCol()) + numSym) << Cx(i, _); - E(i, 0) -= Oy(i, 0); + E[i, _(0, Ox.numCol())] << Ox[i, _]; + E[i, _(0, Cx.numCol()) + numSym] << Cx[i, _]; + E[i, 0] -= Oy[i, 0]; for (ptrdiff_t j = 0; j < Oy.numCol() - 1; ++j) - E(i, 1 + map[j]) -= Oy(i, 1 + j); - E(i, _(0, Cy.numCol()) + numSym + numDep0Var) << -Cy(i, _); + E[i, 1 + map[j]] -= Oy[i, 1 + j]; + E[i, _(0, Cy.numCol()) + numSym + numDep0Var] << -Cy[i, _]; } for (ptrdiff_t i = 0; i < timeDim; ++i) { for (ptrdiff_t j = 0; j < NS.numCol(); ++j) { - int64_t nsij = NS(i, j); - E(indexDim + i, j + numSym) = nsij; - E(indexDim + i, j + numSym + numDep0Var) = -nsij; + int64_t nsij = NS[i, j]; + E[indexDim + i, j + numSym] = nsij; + E[indexDim + i, j + numSym + numDep0Var] = -nsij; } - E(indexDim + i, numSym + numVar + i) = 1; + E[indexDim + i, numSym + numVar + i] = 1; } dp->pruneBounds(*alloc); if (dp->getNumCon()) return dp; @@ -465,7 +465,7 @@ class DepPoly : public BasePolyhedra { Row nc = nco + nco; unsigned indexDim{ai->getArrayDim()}; auto nullStep{dp->getNullStep()}; - for (ptrdiff_t i = 0; i < timeDim; ++i) nullStep[i] = selfDot(NS(i, _)); + for (ptrdiff_t i = 0; i < timeDim; ++i) nullStep[i] = selfDot(NS[i, _]); // column meansing in in order // const size_t numSymbols = getNumSymbols(); auto A{dp->getA()}; @@ -476,12 +476,12 @@ class DepPoly : public BasePolyhedra { // E.resize(indexDim + nullDim, A.numCol()); // ma0 loop for (ptrdiff_t i = 0; i < nco; ++i) { - for (ptrdiff_t j = 0; j < numSym; ++j) A(i + nco, j) = A(i, j) = B(i, j); + for (ptrdiff_t j = 0; j < numSym; ++j) A[i + nco, j] = A[i, j] = B[i, j]; for (ptrdiff_t j = 0; j < numDepVar; ++j) - A(i + nco, j + numSym + numDepVar) = A(i, j + numSym) = - B(i, j + numSym); + A[i + nco, j + numSym + numDepVar] = A[i, j + numSym] = + B[i, j + numSym]; } - A(_(nc, end), _(numSym, numSym + numVar)).diag() << 1; + A[_(nc, end), _(numSym, numSym + numVar)].diag() << 1; // L254: Assertion `col < numCol()` failed // indMats are [innerMostLoop, ..., outerMostLoop] x arrayDim // offsetMats are arrayDim x numSymbols @@ -490,18 +490,18 @@ class DepPoly : public BasePolyhedra { // i_0 + j_0 - i_1 - j_1 = off_1 - off_0 for (ptrdiff_t i = 0; i < indexDim; ++i) { for (ptrdiff_t j = 0; j < C.numCol(); ++j) { - int64_t Cji = C(i, j); - E(i, j + numSym) = Cji; - E(i, j + numSym + numDepVar) = -Cji; + int64_t Cji = C[i, j]; + E[i, j + numSym] = Cji; + E[i, j + numSym + numDepVar] = -Cji; } } for (ptrdiff_t i = 0; i < timeDim; ++i) { for (ptrdiff_t j = 0; j < NS.numCol(); ++j) { - int64_t nsij = NS(i, j); - E(indexDim + i, j + numSym) = nsij; - E(indexDim + i, j + numSym + numDepVar) = -nsij; + int64_t nsij = NS[i, j]; + E[indexDim + i, j + numSym] = nsij; + E[indexDim + i, j + numSym + numDepVar] = -nsij; } - E(indexDim + i, numSym + numVar + i) = 1; + E[indexDim + i, numSym + numVar + i] = 1; } dp->pruneBounds(*alloc); invariant(dp->getNumCon() > 0); @@ -556,11 +556,11 @@ class DepPoly : public BasePolyhedra { // fw.resize(numConstraintsNew, numVarNew + 1); auto fCF{fw->getConstraints()}; fCF << 0; - math::MutPtrMatrix fC{fCF(_, _(1, end))}; + math::MutPtrMatrix fC{fCF[_, _(1, end)]}; // fC(_, 0) << 0; - fC(0, 0) = 1; // lambda_0 - fC(_, _(1, 1 + numInequalityConstraintsOld)) - << A(_, _(math::begin, numConstraintsNew)).transpose(); + fC[0, 0] = 1; // lambda_0 + fC[_, _(1, 1 + numInequalityConstraintsOld)] + << A[_, _(math::begin, numConstraintsNew)].transpose(); // fC(_, _(ineqEnd, posEqEnd)) = E.transpose(); // fC(_, _(posEqEnd, numVarNew)) = -E.transpose(); // loading from `E` is expensive @@ -568,9 +568,9 @@ class DepPoly : public BasePolyhedra { // go through and optimize loops like this for (ptrdiff_t j = 0; j < numConstraintsNew; ++j) { for (ptrdiff_t i = 0; i < numEqualityConstraintsOld; ++i) { - int64_t Eji = E(i, j); - fC(j, i + ineqEnd) = Eji; - fC(j, i + posEqEnd) = -Eji; + int64_t Eji = E[i, j]; + fC[j, i + ineqEnd] = Eji; + fC[j, i + posEqEnd] = -Eji; } } // schedule @@ -593,7 +593,7 @@ class DepPoly : public BasePolyhedra { // ... == w + u'*N + psi // -1 as we flip sign for (ptrdiff_t i = 0; i < numBoundingCoefs; ++i) - fC(i, i + numScheduleCoefs + numLambda) = -1; + fC[i, i + numScheduleCoefs + numLambda] = -1; // so far, both have been identical @@ -602,7 +602,7 @@ class DepPoly : public BasePolyhedra { auto bCF{bw->getConstraints()}; bCF << fCF; // bCF(_, _(0, numVarNew + 1)) << fCF(_, _(0, numVarNew + 1)); - math::MutPtrMatrix bC{bCF(_, _(1, end))}; + math::MutPtrMatrix bC{bCF[_, _(1, end)]}; // equality constraints get expanded into two inequalities // a == 0 -> @@ -615,14 +615,14 @@ class DepPoly : public BasePolyhedra { // so that the ILP rLexMin on coefficients // will tend to preserve the initial order (which is // better than tending to reverse the initial order). - fC(0, numLambda) = 1; - fC(0, 1 + numLambda) = -1; - bC(0, numLambda) = -1; - bC(0, 1 + numLambda) = 1; + fC[0, numLambda] = 1; + fC[0, 1 + numLambda] = -1; + bC[0, numLambda] = -1; + bC[0, 1 + numLambda] = 1; for (ptrdiff_t i = 0; i < numPhiCoefs; ++i) { int64_t s = (2 * (i < numDep0Var) - 1); - fC(i + numBoundingCoefs, i + numLambda + 2) = s; - bC(i + numBoundingCoefs, i + numLambda + 2) = -s; + fC[i + numBoundingCoefs, i + numLambda + 2] = s; + bC[i + numBoundingCoefs, i + numLambda + 2] = -s; } // note that delta/constant coef is handled as last `s` return {fw, bw}; @@ -642,10 +642,10 @@ class DepPoly : public BasePolyhedra { DensePtrMatrix E{getE()}; unsigned xNumLoops = unsigned(xPhi.numCol()), yNumLoops = unsigned(yPhi.numCol()); - if ((numDep0Var == xNumLoops) || allZero(xPhi(_, _(numDep0Var, end)))) + if ((numDep0Var == xNumLoops) || allZero(xPhi[_, _(numDep0Var, end)])) xNumLoops = numDep0Var; else invariant(numDep0Var < xNumLoops); - if ((numDep1Var == yNumLoops) || allZero(yPhi(_, _(numDep1Var, end)))) + if ((numDep1Var == yNumLoops) || allZero(yPhi[_, _(numDep1Var, end)])) yNumLoops = numDep1Var; else invariant(numDep1Var < yNumLoops); unsigned numSym = getNumSymbols(), numSymX = numSym + xNumLoops, @@ -656,24 +656,24 @@ class DepPoly : public BasePolyhedra { // we truncate time dim if (extend || timeDim) { for (ptrdiff_t r = 0; r < numEqCon; ++r) { - B(r, _(0, numSymD0)) << E(r, _(0, numSymD0)); - B(r, _(numDep0Var, xNumLoops) + numSym) << 0; - B(r, _(0, numDep1Var) + numSymX) << E(r, _(0, numDep1Var) + numSymD0); - B(r, _(numDep1Var, yNumLoops) + numSymX) << 0; + B[r, _(0, numSymD0)] << E[r, _(0, numSymD0)]; + B[r, _(numDep0Var, xNumLoops) + numSym] << 0; + B[r, _(0, numDep1Var) + numSymX] << E[r, _(0, numDep1Var) + numSymD0]; + B[r, _(numDep1Var, yNumLoops) + numSymX] << 0; } } else std::copy_n(E.begin(), E.numRow() * E.numCol(), B.begin()); if (xOff) for (ptrdiff_t c = 0; c < numDep0Var; ++c) if (int64_t mlt = xOff[c]) - B(_(0, numEqCon), 0) -= mlt * B(_(0, numEqCon), numSym + c); + B[_(0, numEqCon), 0] -= mlt * B[_(0, numEqCon), numSym + c]; if (yOff) for (ptrdiff_t c = 0; c < numDep1Var; ++c) if (int64_t mlt = yOff[c]) - B(_(0, numEqCon), 0) -= mlt * B(_(0, numEqCon), numSymX + c); + B[_(0, numEqCon), 0] -= mlt * B[_(0, numEqCon), numSymX + c]; for (ptrdiff_t r = 0; r < numPhi; ++r) { - B(r + numEqCon, _(0, numSym)) << 0; - B(r + numEqCon, _(0, xNumLoops) + numSym) << xPhi(r, _(0, xNumLoops)); - B(r + numEqCon, _(0, yNumLoops) + numSymX) << -yPhi(r, _(0, yNumLoops)); + B[r + numEqCon, _(0, numSym)] << 0; + B[r + numEqCon, _(0, xNumLoops) + numSym] << xPhi[r, _(0, xNumLoops)]; + B[r + numEqCon, _(0, yNumLoops) + numSymX] << -yPhi[r, _(0, yNumLoops)]; } unsigned rank = unsigned(math::NormalForm::simplifySystemImpl(B)); if (rank <= numEqCon) return false; @@ -697,29 +697,29 @@ class DepPoly : public BasePolyhedra { // numSyms should be the same; we aren't pruning symbols invariant(numSym, 1 + nDS); for (ptrdiff_t r = 0; r < xCon; ++r) { - A(r, _(0, xNumSym)) << Ax(r, _(0, xNumSym)); - A(r, _(xNumSym, numSym)) << 0; - A(r, _(0, xNumLoops) + numSym) << Ax(r, _(0, xNumLoops) + xNumSym); - A(r, _(0, yNumLoops) + numSymX) << 0; + A[r, _(0, xNumSym)] << Ax[r, _(0, xNumSym)]; + A[r, _(xNumSym, numSym)] << 0; + A[r, _(0, xNumLoops) + numSym] << Ax[r, _(0, xNumLoops) + xNumSym]; + A[r, _(0, yNumLoops) + numSymX] << 0; } for (ptrdiff_t r = 0; r < yCon; ++r) { - A(r + xCon, _(0, numSym)) << 0; + A[r + xCon, _(0, numSym)] << 0; for (ptrdiff_t j = 0; j < map.size(); ++j) - A(r + xCon, 1 + map[j]) = Ay(r, 1 + j); - A(r + xCon, _(0, xNumLoops) + numSym) << 0; - A(r + xCon, _(0, yNumLoops) + numSymX) - << Ay(r, _(0, yNumLoops) + yNumSym); + A[r + xCon, 1 + map[j]] = Ay[r, 1 + j]; + A[r + xCon, _(0, xNumLoops) + numSym] << 0; + A[r + xCon, _(0, yNumLoops) + numSymX] + << Ay[r, _(0, yNumLoops) + yNumSym]; } std::fill(A.begin() + size_t(xCon + yCon) * nCol, A.end(), 0); - A(_(0, nLoop) + (xCon + yCon), _(0, nLoop) + numSym).diag() << 1; - } else dp->getA() << getA()(_, _(0, nCol)); // truncate time + A[_(0, nLoop) + (xCon + yCon), _(0, nLoop) + numSym].diag() << 1; + } else dp->getA() << getA()[_, _(0, nCol)]; // truncate time if (xOff) for (ptrdiff_t c = 0; c < xNumLoops; ++c) - if (int64_t mlt = xOff[c]) A(_, 0) -= mlt * A(_, numSym + c); + if (int64_t mlt = xOff[c]) A[_, 0] -= mlt * A[_, numSym + c]; if (yOff) for (ptrdiff_t c = 0; c < yNumLoops; ++c) - if (int64_t mlt = yOff[c]) A(_, 0) -= mlt * A(_, numSymX + c); - dp->getE() << B(_(0, rank), _); + if (int64_t mlt = yOff[c]) A[_, 0] -= mlt * A[_, numSymX + c]; + dp->getE() << B[_(0, rank), _]; dp->pruneBounds(alloc); return dp->getNumCon() == 0; } diff --git a/include/Polyhedra/Loops.hpp b/include/Polyhedra/Loops.hpp index da4fb7e38..2f4af41d3 100644 --- a/include/Polyhedra/Loops.hpp +++ b/include/Polyhedra/Loops.hpp @@ -1,5 +1,6 @@ #pragma once +#include "Containers/Pair.hpp" #include "Polyhedra/Comparators.hpp" #include "Polyhedra/Polyhedra.hpp" #include "RemarkAnalysis.hpp" @@ -112,26 +113,26 @@ findSymbolicIndex(llvm::ArrayRef symbols, [[nodiscard]] inline auto getMinMaxValueSCEV(llvm::ScalarEvolution &SE, const llvm::SCEVAddRecExpr *S) - -> std::pair { + -> containers::Pair { // if (!SE.containsAddRecurrence(S)) // return S; - if ((!S) || (!(S->isAffine()))) return std::make_pair(S, S); + if ((!S) || (!(S->isAffine()))) return {S, S}; const auto *opStart = S->getStart(); const auto *opStep = S->getStepRecurrence(SE); const auto *opFinal = SE.getSCEVAtScope(S, nullptr); // auto opFinal = SE.getSCEVAtScope(S, S->getLoop()->getParentLoop()); // FIXME: what if there are more AddRecs nested inside? - if (SE.isKnownNonNegative(opStep)) return std::make_pair(opStart, opFinal); - if (SE.isKnownNonPositive(opStep)) return std::make_pair(opFinal, opStart); - return std::make_pair(S, S); + if (SE.isKnownNonNegative(opStep)) return {opStart, opFinal}; + if (SE.isKnownNonPositive(opStep)) return {opFinal, opStart}; + return {S, S}; } // TODO: strengthen through recursion [[nodiscard]] inline auto getMinMaxValueSCEV(llvm::ScalarEvolution &SE, const llvm::SCEV *S) - -> std::pair { + -> containers::Pair { if (const auto *T = llvm::dyn_cast(S)) return getMinMaxValueSCEV(SE, T); - return std::make_pair(S, S); + return {S, S}; } [[nodiscard]] inline auto simplifyMinMax(llvm::ScalarEvolution &SE, const llvm::SCEVMinMaxExpr *S) @@ -259,7 +260,7 @@ inline auto addRecMatchesLoop(const llvm::SCEV *S, llvm::Loop *L) -> bool { return minDepth; } inline auto -areSymbolsLoopInvariant(IntMatrix<> &A, +areSymbolsLoopInvariant(IntMatrix &A, llvm::SmallVectorImpl &symbols, llvm::Loop *L, llvm::ScalarEvolution &SE) -> bool { for (ptrdiff_t i = 0; i < std::ssize(symbols); ++i) @@ -607,7 +608,7 @@ class Loop : public BasePolyhedra { const ptrdiff_t numConst = getNumSymbols(); auto A{tmp->getA()}; for (ptrdiff_t n = 0; n < A.numRow(); ++n) - if ((A(n, numConst) != 0) && (A(n, 1 + numConst) != 0)) indep = false; + if ((A[n, numConst] != 0) && (A[n, 1 + numConst] != 0)) indep = false; if (indep) return false; Loop *margi = tmp->removeLoop(&alloc, 1), *tmp2; invariant(margi->getNumLoops(), unsigned(1)); @@ -619,7 +620,7 @@ class Loop : public BasePolyhedra { auto p2 = alloc.checkpoint(); int64_t sign = 2 * extendLower - 1; // extendLower ? 1 : -1 for (ptrdiff_t c = 0; c < margi->getNumInequalityConstraints(); ++c) { - int64_t b = sign * margi->getA()(c, numConst); + int64_t b = sign * margi->getA()[c, numConst]; if (b <= 0) continue; alloc.rollback(p2); tmp2 = tmp->copy(&alloc); @@ -631,18 +632,18 @@ class Loop : public BasePolyhedra { // upper: a'x - i + b >= 0 -> i <= a'x + b // to decrease the lower bound or increase the upper, we increment // `b` - ++(margi->getA())(c, 0); + ++(margi->getA())[c, 0]; // our approach here is to set `_i` equal to the extended bound // and then check if the resulting polyhedra is empty. // if not, then we may have >0 iterations. for (ptrdiff_t cc = 0; cc < tmp2->getNumCon(); ++cc) { - if (int64_t d = tmp2->getA()(cc, numConst)) { - tmp2->getA()(cc, _(0, last)) << b * tmp2->getA()(cc, _(0, last)) - - (d * sign) * margi->getA()(c, _); + if (int64_t d = tmp2->getA()[cc, numConst]) { + tmp2->getA()[cc, _(0, last)] << b * tmp2->getA()[cc, _(0, last)] - + (d * sign) * margi->getA()[c, _]; } } for (auto cc = ptrdiff_t(tmp2->getNumCon()); cc;) - if (tmp2->getA()(--cc, 1 + numConst) == 0) tmp2->eraseConstraint(cc); + if (tmp2->getA()[--cc, 1 + numConst] == 0) tmp2->eraseConstraint(cc); if (!(tmp2->calcIsEmpty(alloc))) return false; } if (isNonNegative()) { @@ -656,16 +657,16 @@ class Loop : public BasePolyhedra { // extended bound and then check if the resulting polyhedra is // empty. if not, then we may have >0 iterations. for (ptrdiff_t cc = 0; cc < tmp->getNumCon(); ++cc) { - if (int64_t d = tmp->getA()(cc, numConst)) { + if (int64_t d = tmp->getA()[cc, numConst]) { // lower bound is i >= 0 // so setting equal to the extended lower bound now // means that i = -1 so we decrement `d` from the column - tmp->getA()(cc, 0) -= d; - tmp->getA()(cc, numConst) = 0; + tmp->getA()[cc, 0] -= d; + tmp->getA()[cc, numConst] = 0; } } for (auto cc = ptrdiff_t(tmp->getNumCon()); cc;) - if (tmp->getA()(--cc, 1 + numConst) == 0) tmp->eraseConstraint(cc); + if (tmp->getA()[--cc, 1 + numConst] == 0) tmp->eraseConstraint(cc); if (!(tmp->calcIsEmpty(alloc))) return false; } } @@ -703,7 +704,7 @@ class Loop : public BasePolyhedra { DensePtrMatrix A{getA()}; bool printed = printSymbol(os, b, -sign); for (ptrdiff_t k = 0; k < numVarMinus1; ++k) { - if (int64_t lakj = A(j, k + numConst)) { + if (int64_t lakj = A[j, k + numConst]) { if (lakj * sign > 0) os << " - "; else if (printed) os << " + "; lakj = math::constexpr_abs(lakj); @@ -727,7 +728,7 @@ class Loop : public BasePolyhedra { if (numRow > 1) os << (isUpper ? "min(" : "max("); DensePtrMatrix A{getA()}; for (ptrdiff_t j = 0, k = 0; j < A.numRow(); ++j) { - if (A(j, last) * sign <= 0) continue; + if (A[j, last] * sign <= 0) continue; if (k++) os << ", "; printBound(os, sign, numVarMinus1, numConst, j); } @@ -750,7 +751,7 @@ class Loop : public BasePolyhedra { ptrdiff_t numRow = 0; int64_t allAj = 0; for (ptrdiff_t j = 0; j < A.numRow(); ++j) { - int64_t Ajr = A(j, last), Aj = Ajr * sign; + int64_t Ajr = A[j, last], Aj = Ajr * sign; if (Aj <= 0) continue; if (allAj) allAj = allAj == Aj ? allAj : -1; else allAj = Aj; @@ -766,7 +767,7 @@ class Loop : public BasePolyhedra { if (allAj > 0) return printBoundShort(os, sign, numVarM1, numConst, allAj, numRow, true); for (ptrdiff_t j = 0; j < A.numRow(); ++j) { - int64_t Ajr = A(j, end - 1), Aj = Ajr * sign; + int64_t Ajr = A[j, end - 1], Aj = Ajr * sign; if (Aj <= 0) continue; if (hasPrintedLine) for (ptrdiff_t k = 0; k < 21; ++k) os << ' '; @@ -787,7 +788,7 @@ class Loop : public BasePolyhedra { int64_t allAj = 0; ptrdiff_t numPos = 0, numNeg = 0; for (ptrdiff_t j = 0; j < A.numRow(); ++j) { - int64_t Ajr = A(j, last); + int64_t Ajr = A[j, last]; if (Ajr == 0) continue; numPos += Ajr > 0; numNeg += Ajr < 0; diff --git a/include/Polyhedra/Polyhedra.hpp b/include/Polyhedra/Polyhedra.hpp index d130c7308..880f887e5 100644 --- a/include/Polyhedra/Polyhedra.hpp +++ b/include/Polyhedra/Polyhedra.hpp @@ -1,13 +1,13 @@ #pragma once #include "Polyhedra/Comparators.hpp" +#include #include #include #include #include #include #include -#include #include #include #include @@ -18,10 +18,10 @@ #include #endif namespace poly::poly { +using alloc::Arena; using math::DensePtrMatrix, math::MutDensePtrMatrix, math::EmptyMatrix, math::Row, math::Col, math::vector, math::matrix, math::_, math::end, math::last, math::operator<<; -using alloc::Arena; inline auto printPositive(std::ostream &os, ptrdiff_t stop) -> std::ostream & { for (ptrdiff_t i = 0; i < stop; ++i) os << "v_" << i << " >= 0\n"; return os; @@ -150,8 +150,8 @@ struct BasePolyhedra { setNumConstraints(unsigned(ar)); setNumEqConstraints(unsigned(er)); for (ptrdiff_t i = 0; i < getNumEqualityConstraints(); ++i) { - auto l = gcd(getE()(i, _)); - if (l != 1) getE()(i, _) /= l; + auto l = gcd(getE()[i, _]); + if (l != 1) getE()[i, _] /= l; } } auto C = initializeComparator(alloc); @@ -166,7 +166,7 @@ struct BasePolyhedra { bool broke = false; for (auto i = --j; i;) { if (getNumCon() <= 1) return; - diff << getA()(--i, _) - getA()(j, _); + diff << getA()[--i, _] - getA()[j, _]; if (C.greaterEqual(*alloc, diff)) { eraseConstraint(i); rollback(alloc, p); @@ -183,7 +183,7 @@ struct BasePolyhedra { if constexpr (MaybeNonNeg) { if (isNonNegative() && !broke) { for (ptrdiff_t i = 0; i < dyn; ++i) { - diff << getA()(j, _); + diff << getA()[j, _]; --diff[last - i]; if (C.greaterEqual(*alloc, diff)) { eraseConstraint(j); diff --git a/include/Polyhedra/Schedule.hpp b/include/Polyhedra/Schedule.hpp index 2ac89eebd..5e529c837 100644 --- a/include/Polyhedra/Schedule.hpp +++ b/include/Polyhedra/Schedule.hpp @@ -1,16 +1,14 @@ #pragma once -#include "Math/Array.hpp" #include "Alloc/Arena.hpp" +#include "Math/Array.hpp" #include #include #include -#include #include #include #include #include -#include namespace poly::poly { using math::_, math::PtrVector, math::MutPtrVector, math::SquarePtrMatrix, @@ -81,10 +79,10 @@ struct AffineSchedule { /// getSchedule, loops are always indexed from outer to inner [[nodiscard]] constexpr auto getSchedule(size_t d) const -> math::PtrVector { - return getPhi()(d, _); + return getPhi()[d, _]; } [[nodiscard]] constexpr auto getSchedule(size_t d) -> MutPtrVector { - return getPhi()(d, _); + return getPhi()[d, _]; } [[nodiscard]] constexpr auto getFusionOmega(size_t i) const -> int64_t { return data()[getNumLoopsSquared() + i]; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 15ea5a60a..f7447c322 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -19,6 +19,12 @@ include(../cmake/CPM.cmake) # ---- compile_commands.json ---- set(CMAKE_EXPORT_COMPILE_COMMANDS ON) +if(((USE_SANITIZER MATCHES "([Aa]ddress)") OR (USE_SANITIZER MATCHES "([Aa]ddress);([Uu]ndefined)" + ) +) AND (CMAKE_CXX_COMPILER_ID MATCHES "Clang")) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lunwind -Wno-unused-command-line-argument") +endif() + # CPMAddPackage("gh:onqtam/doctest@2.4.9") CPMAddPackage("gh:TheLartians/Format.cmake@1.7.3") CPMAddPackage( @@ -53,21 +59,22 @@ file( GLOB tests CONFIGURE_DEPENDS - ${CMAKE_CURRENT_SOURCE_DIR}/bitset_test.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/bumpmap_test.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/comparator_test.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/compat_test.cpp - # ${CMAKE_CURRENT_SOURCE_DIR}/dependence_test.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/graph_test.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/linear_algebra_test.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/linear_diophantine_test.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/matrix_test.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/normal_form_test.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/orthogonalize_test.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/remarks_test.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/simplex_test.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/string_to_intmat_test.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/unimodularization_test.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/dict_test.cpp + # ${CMAKE_CURRENT_SOURCE_DIR}/bitset_test.cpp + # ${CMAKE_CURRENT_SOURCE_DIR}/bumpmap_test.cpp + # ${CMAKE_CURRENT_SOURCE_DIR}/comparator_test.cpp + # ${CMAKE_CURRENT_SOURCE_DIR}/compat_test.cpp + # # ${CMAKE_CURRENT_SOURCE_DIR}/dependence_test.cpp + # ${CMAKE_CURRENT_SOURCE_DIR}/graph_test.cpp + # ${CMAKE_CURRENT_SOURCE_DIR}/linear_algebra_test.cpp + # ${CMAKE_CURRENT_SOURCE_DIR}/linear_diophantine_test.cpp + # ${CMAKE_CURRENT_SOURCE_DIR}/matrix_test.cpp + # ${CMAKE_CURRENT_SOURCE_DIR}/normal_form_test.cpp + # ${CMAKE_CURRENT_SOURCE_DIR}/orthogonalize_test.cpp + # ${CMAKE_CURRENT_SOURCE_DIR}/remarks_test.cpp + # ${CMAKE_CURRENT_SOURCE_DIR}/simplex_test.cpp + # ${CMAKE_CURRENT_SOURCE_DIR}/string_to_intmat_test.cpp + # ${CMAKE_CURRENT_SOURCE_DIR}/unimodularization_test.cpp ) # list(FILTER tests EXCLUDE REGEX "remarks.*") for remarks test diff --git a/test/bumpmap_test.cpp b/test/bumpmap_test.cpp index 65828b7f5..1dc00d584 100644 --- a/test/bumpmap_test.cpp +++ b/test/bumpmap_test.cpp @@ -17,11 +17,11 @@ TEST(BumpDownMapTest, BasicAssertions) { using M = poly::dict::amap; static_assert( std::same_as>>); + poly::math::BumpPtrVector>>); static_assert( std::same_as< M::allocator_type, - poly::alloc::WArena, 16384, true>>); + poly::alloc::WArena, 16384, true>>); poly::alloc::OwningArena<> alloc; M::allocator_type walloc{&alloc}; diff --git a/test/orthogonalize_test.cpp b/test/orthogonalize_test.cpp index 6e12f4d91..b04094544 100644 --- a/test/orthogonalize_test.cpp +++ b/test/orthogonalize_test.cpp @@ -32,7 +32,7 @@ namespace { auto orthogonalize(alloc::Arena<> *alloc, llvm::SmallVectorImpl const &ai) -> std::optional< - std::pair>> { + containers::Pair>> { // need to construct matrix `A` of relationship // B*L = I @@ -72,7 +72,7 @@ auto orthogonalize(alloc::Arena<> *alloc, poly::Loop::construct(alloc, nullptr, std::move(AK), alnp.getSyms(), true); alnNew->pruneBounds(); math::IntMatrix KS{K * S}; - std::pair> ret{ + containers::Pair> ret{ std::make_pair(alnNew, llvm::SmallVector())}; llvm::SmallVector &newArrayRefs = ret.second; newArrayRefs.reserve(numRow); @@ -115,7 +115,7 @@ TEST(OrthogonalizeTest, BasicAssertions) { const llvm::SCEVUnknown *scevB = tlf.getSCEVUnknown(tlf.createArray()); // we have three array refs // W[i+m, j+n] - // llvm::SmallVector> + // llvm::SmallVector> ArrayReference War{scevW, aln, 2}; { MutPtrMatrix indMat = War.indexMatrix(); @@ -158,7 +158,7 @@ TEST(OrthogonalizeTest, BasicAssertions) { llvm::SmallVector ai{ allArrayRefs.data(), allArrayRefs.data() + 1, allArrayRefs.data() + 2}; - std::optional>> + std::optional>> orth(orthogonalize(tlf.getAlloc(), ai)); EXPECT_TRUE(orth.has_value()); @@ -280,7 +280,7 @@ TEST(BadMul, BasicAssertions) { llvm::SmallVector ai{ allArrayRefs.data(), allArrayRefs.data() + 1, allArrayRefs.data() + 2}; - std::optional>> + std::optional>> orth{orthogonalize(tlf.getAlloc(), ai)}; EXPECT_TRUE(orth.has_value()); From 4188b752d5cb022024a21c56724ea258658e1200 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Mon, 16 Oct 2023 04:02:28 -0400 Subject: [PATCH 038/112] some debugging progress, but both trie impls are still currently wrong --- benchmark/include/map_benchmark.hpp | 26 +++++++++----- include/Dicts/Trie.hpp | 21 +++++------ test/CMakeLists.txt | 55 ++++++++++++++++------------- 3 files changed, 59 insertions(+), 43 deletions(-) diff --git a/benchmark/include/map_benchmark.hpp b/benchmark/include/map_benchmark.hpp index 56150e89a..b7ec0311b 100644 --- a/benchmark/include/map_benchmark.hpp +++ b/benchmark/include/map_benchmark.hpp @@ -21,27 +21,35 @@ template struct TrieWrap { template void erase(const K &k) { d.erase(k); } }; +inline auto randvp(std::mt19937_64 &rng, uint64_t mask) { + return reinterpret_cast((rng() & mask) | 8); +} + template void InsertLookup2(std::mt19937_64 &rng, D &map, uint64_t mask) { for (uint64_t i = 0; i < 256; ++i) { - map[reinterpret_cast(rng() & mask)] += - i + map[reinterpret_cast(rng() & mask)]; + void *p0 = randvp(rng, mask); + void *p1 = randvp(rng, mask); + map[p0] += i + map[p1]; } } template void InsertErase(std::mt19937_64 &rng, D &map, uint64_t mask) { for (uint64_t i = 0; i < 256; ++i) { - map[reinterpret_cast(rng() & mask)] = i; - map.erase(reinterpret_cast(rng() & mask)); + void *p0 = randvp(rng, mask); + void *p1 = randvp(rng, mask); + map[p0] = i; + map.erase(p1); } } template void InsertLookup3(std::mt19937_64 &rng, D &map, uint64_t mask) { for (uint64_t i = 0; i < 256; ++i) { - map[reinterpret_cast(rng() & mask)] += - map[reinterpret_cast(rng() & mask)] + - map[reinterpret_cast(rng() & mask)]; + void *p0 = randvp(rng, mask); + void *p1 = randvp(rng, mask); + void *p2 = randvp(rng, mask); + map[p0] += map[p1] + map[p2]; } } @@ -79,7 +87,7 @@ static void BM_TrieInsertErase(benchmark::State &state) { uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; std::mt19937_64 rng; for (auto b : state) { - TrieWrap> map{{},&alloc}; + TrieWrap> map{{}, &alloc}; InsertErase(rng, map, mask); alloc.reset(); } @@ -91,7 +99,7 @@ static void BM_InlineTrieInsertErase(benchmark::State &state) { uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; std::mt19937_64 rng; for (auto b : state) { - TrieWrap> map{{},&alloc}; + TrieWrap> map{{}, &alloc}; InsertErase(rng, map, mask); alloc.reset(); } diff --git a/include/Dicts/Trie.hpp b/include/Dicts/Trie.hpp index d680df8ec..4d43958cd 100644 --- a/include/Dicts/Trie.hpp +++ b/include/Dicts/Trie.hpp @@ -65,11 +65,11 @@ template struct TrieMapNode { if (!n.child) break; l = n; } - l.parent->children[l.index] = nullptr; // leaf is moved up + l.parent->children[l.index] = nullptr; // leaf is moved up l.child->children = child.child->children; // leaf takes child's children } child.parent->children[child.index] = l.child; // leaf replaces deleted - + child.child->second = {}; return child.child; } }; @@ -86,8 +86,8 @@ struct TrieMap : TrieMapNode { NodeT *list{nullptr}; // TODO: implement using `list` to avoid allocs void erase(const K &k) { - NodeT *erased = this->eraseImpl(k); - erased->children[0] = std::exchange(list, erased); + if (NodeT *erased = this->eraseImpl(k)) + erased->children[0] = std::exchange(list, erased); } auto operator[](utils::Valid> alloc, const K &k) -> V & { typename NodeT::Child c = this->findChild(k); @@ -124,9 +124,10 @@ template struct InlineTrie { V values[4]; // Returns an optional pointer to the value. - constexpr auto find(const K &k) -> utils::Optional { + constexpr auto find(const K &k) -> utils::Optional { Child c = findChild(this, k); - return (c.subIndex) ? nullptr : &c.node->values[c.index]; + return (c.subIndex) ? std::nullopt + : utils::Optional{c.node->values[c.index]}; } auto operator[](utils::Valid> alloc, const K &k) -> V & { @@ -146,16 +147,16 @@ template struct InlineTrie { InlineTrie *descendent = c.node->children[c.index]; if (!descendent) { c.node->keys[c.index] = {}; // set to null + c.node->values[c.index] = {}; return; } for (;;) { - int i = 0; - for (; i < 4; ++i) - if (!descendent->children[i]) break; - if (i != 4) { // we found one + for (int i = 0; i < 4; ++i) { + if (descendent->children[i]) continue; c.node->keys[c.index] = std::move(descendent->keys[i]); c.node->values[c.index] = std::move(descendent->values[i]); descendent->keys[i] = {}; + descendent->values[i] = {}; return; } descendent = descendent->children[0]; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index f7447c322..12581edd0 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -7,6 +7,7 @@ project(LoopModelsTests LANGUAGES CXX) option(ENABLE_TEST_COVERAGE "Enable test coverage" OFF) option(TEST_INSTALLED_VERSION "Test the version found by find_package" OFF) option(ENABLE_LLD "Use lld for linking" ON) +option(TEST_LOOPMODELS "Test LoopModels" OFF) # ON FIXME # --- Import tools ---- @@ -19,10 +20,10 @@ include(../cmake/CPM.cmake) # ---- compile_commands.json ---- set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -if(((USE_SANITIZER MATCHES "([Aa]ddress)") OR (USE_SANITIZER MATCHES "([Aa]ddress);([Uu]ndefined)" - ) -) AND (CMAKE_CXX_COMPILER_ID MATCHES "Clang")) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lunwind -Wno-unused-command-line-argument") +if(((USE_SANITIZER MATCHES "([Aa]ddress)") OR (USE_SANITIZER MATCHES "([Aa]ddress);([Uu]ndefined)")) + AND (CMAKE_CXX_COMPILER_ID MATCHES "Clang") +) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lunwind -Wno-unused-command-line-argument") endif() # CPMAddPackage("gh:onqtam/doctest@2.4.9") @@ -46,10 +47,12 @@ FetchContent_Declare( ) FetchContent_MakeAvailable(Math) -if(TEST_INSTALLED_VERSION) - find_package(LoopModels REQUIRED) -else() - add_subdirectory(.. LoopModels) +if(TEST_LOOPMODELS) + if(TEST_INSTALLED_VERSION) + find_package(LoopModels REQUIRED) + else() + add_subdirectory(.. LoopModels) + endif() endif() # ---- Create binary ---- @@ -60,18 +63,13 @@ file( tests CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/dict_test.cpp - # ${CMAKE_CURRENT_SOURCE_DIR}/bitset_test.cpp - # ${CMAKE_CURRENT_SOURCE_DIR}/bumpmap_test.cpp - # ${CMAKE_CURRENT_SOURCE_DIR}/comparator_test.cpp - # ${CMAKE_CURRENT_SOURCE_DIR}/compat_test.cpp - # # ${CMAKE_CURRENT_SOURCE_DIR}/dependence_test.cpp - # ${CMAKE_CURRENT_SOURCE_DIR}/graph_test.cpp + # ${CMAKE_CURRENT_SOURCE_DIR}/bitset_test.cpp ${CMAKE_CURRENT_SOURCE_DIR}/bumpmap_test.cpp + # ${CMAKE_CURRENT_SOURCE_DIR}/comparator_test.cpp ${CMAKE_CURRENT_SOURCE_DIR}/compat_test.cpp # + # ${CMAKE_CURRENT_SOURCE_DIR}/dependence_test.cpp ${CMAKE_CURRENT_SOURCE_DIR}/graph_test.cpp # ${CMAKE_CURRENT_SOURCE_DIR}/linear_algebra_test.cpp # ${CMAKE_CURRENT_SOURCE_DIR}/linear_diophantine_test.cpp - # ${CMAKE_CURRENT_SOURCE_DIR}/matrix_test.cpp - # ${CMAKE_CURRENT_SOURCE_DIR}/normal_form_test.cpp - # ${CMAKE_CURRENT_SOURCE_DIR}/orthogonalize_test.cpp - # ${CMAKE_CURRENT_SOURCE_DIR}/remarks_test.cpp + # ${CMAKE_CURRENT_SOURCE_DIR}/matrix_test.cpp ${CMAKE_CURRENT_SOURCE_DIR}/normal_form_test.cpp + # ${CMAKE_CURRENT_SOURCE_DIR}/orthogonalize_test.cpp ${CMAKE_CURRENT_SOURCE_DIR}/remarks_test.cpp # ${CMAKE_CURRENT_SOURCE_DIR}/simplex_test.cpp # ${CMAKE_CURRENT_SOURCE_DIR}/string_to_intmat_test.cpp # ${CMAKE_CURRENT_SOURCE_DIR}/unimodularization_test.cpp @@ -182,26 +180,35 @@ endif() if(NOT TEST_INSTALLED_VERSION) if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU") # -Werror? - target_compile_options(LoopModels PUBLIC -Wall -Wpedantic -Wextra -Wshadow) + if(TEST_LOOPMODELS) + target_compile_options(LoopModels PUBLIC -Wall -Wpedantic -Wextra -Wshadow) + endif() target_compile_options(${PROJECT_NAME} PUBLIC -Wall -Wpedantic -Wextra -Wshadow) - elseif(MSVC) + elseif(MSVC and TEST_LOOPMODELS) target_compile_options(LoopModels PUBLIC /W4 /WX) endif() endif() # target_compile_options(LoopModels PRIVATE -D_GLIBCXX_DEBUG) target_compile_options(${PROJECT_NAME} # PRIVATE -D_GLIBCXX_DEBUG) -target_compile_options(LoopModels PRIVATE -D_GLIBCXX_ASSERTIONS) + +if(TEST_LOOPMODELS) + target_compile_options(LoopModels PRIVATE -D_GLIBCXX_ASSERTIONS) +endif() target_compile_options(${PROJECT_NAME} PRIVATE -D_GLIBCXX_ASSERTIONS) if(ENABLE_LLD) target_link_options(${PROJECT_NAME} PRIVATE -fuse-ld=lld) - target_link_options(LoopModels PRIVATE -fuse-ld=lld) + if(TEST_LOOPMODELS) + target_link_options(LoopModels PRIVATE -fuse-ld=lld) + endif() endif() # ---- code coverage ---- message(STATUS "ENABLE_TEST_COVERAGE: ${ENABLE_TEST_COVERAGE}") if(ENABLE_TEST_COVERAGE) - target_compile_options(LoopModels PUBLIC -O0 -g --coverage) - target_link_options(LoopModels PUBLIC --coverage) + if(TEST_LOOPMODELS) + target_compile_options(LoopModels PUBLIC -O0 -g --coverage) + target_link_options(LoopModels PUBLIC --coverage) + endif() target_compile_options(${PROJECT_NAME} PUBLIC -O0 -g --coverage) target_link_options(${PROJECT_NAME} PUBLIC --coverage) add_custom_target( From 5cdee1320072911116537e481b5fe2466c85db6e Mon Sep 17 00:00:00 2001 From: chriselrod Date: Tue, 17 Oct 2023 00:11:38 -0400 Subject: [PATCH 039/112] Trie maps are pretty good --- benchmark/include/map_benchmark.hpp | 34 +++--- include/Dicts/Trie.hpp | 159 +++++++++++++++++++--------- 2 files changed, 124 insertions(+), 69 deletions(-) diff --git a/benchmark/include/map_benchmark.hpp b/benchmark/include/map_benchmark.hpp index b7ec0311b..b385e4edb 100644 --- a/benchmark/include/map_benchmark.hpp +++ b/benchmark/include/map_benchmark.hpp @@ -54,7 +54,7 @@ void InsertLookup3(std::mt19937_64 &rng, D &map, uint64_t mask) { } static void BM_llvmDenseMapInsertErase(benchmark::State &state) { - uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 4ULL; std::mt19937_64 rng{}; for (auto b : state) { llvm::DenseMap map{}; @@ -63,7 +63,7 @@ static void BM_llvmDenseMapInsertErase(benchmark::State &state) { } BENCHMARK(BM_llvmDenseMapInsertErase)->DenseRange(2, 8, 1); static void BM_llvmSmallDenseMapInsertErase(benchmark::State &state) { - uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 4ULL; std::mt19937_64 rng; for (auto b : state) { llvm::SmallDenseMap map{}; @@ -73,7 +73,7 @@ static void BM_llvmSmallDenseMapInsertErase(benchmark::State &state) { BENCHMARK(BM_llvmSmallDenseMapInsertErase)->DenseRange(2, 8, 1); static void BM_BumpMapInsertErase(benchmark::State &state) { poly::alloc::OwningArena<> alloc; - uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 4ULL; std::mt19937_64 rng; for (auto b : state) { poly::dict::amap map{&alloc}; @@ -84,7 +84,7 @@ static void BM_BumpMapInsertErase(benchmark::State &state) { BENCHMARK(BM_BumpMapInsertErase)->DenseRange(2, 8, 1); static void BM_TrieInsertErase(benchmark::State &state) { poly::alloc::OwningArena<> alloc; - uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 4ULL; std::mt19937_64 rng; for (auto b : state) { TrieWrap> map{{}, &alloc}; @@ -96,7 +96,7 @@ BENCHMARK(BM_TrieInsertErase)->DenseRange(2, 8, 1); static void BM_InlineTrieInsertErase(benchmark::State &state) { poly::alloc::OwningArena<> alloc; - uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 4ULL; std::mt19937_64 rng; for (auto b : state) { TrieWrap> map{{}, &alloc}; @@ -107,7 +107,7 @@ static void BM_InlineTrieInsertErase(benchmark::State &state) { BENCHMARK(BM_InlineTrieInsertErase)->DenseRange(2, 8, 1); static void BM_ankerlMapInsertErase(benchmark::State &state) { - uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 4ULL; std::mt19937_64 rng; for (auto b : state) { ankerl::unordered_dense::map map; @@ -116,7 +116,7 @@ static void BM_ankerlMapInsertErase(benchmark::State &state) { } BENCHMARK(BM_ankerlMapInsertErase)->DenseRange(2, 8, 1); static void BM_stdUnorderedMapInsertErase(benchmark::State &state) { - uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 4ULL; std::mt19937_64 rng; for (auto b : state) { std::unordered_map map; @@ -126,7 +126,7 @@ static void BM_stdUnorderedMapInsertErase(benchmark::State &state) { BENCHMARK(BM_stdUnorderedMapInsertErase)->DenseRange(2, 8, 1); static void BM_llvmDenseMapInsertLookup(benchmark::State &state) { - uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 4ULL; std::mt19937_64 rng; for (auto b : state) { llvm::DenseMap map{}; @@ -135,7 +135,7 @@ static void BM_llvmDenseMapInsertLookup(benchmark::State &state) { } BENCHMARK(BM_llvmDenseMapInsertLookup)->DenseRange(2, 8, 1); static void BM_llvmSmallDenseMapInsertLookup(benchmark::State &state) { - uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 4ULL; std::mt19937_64 rng; for (auto b : state) { llvm::SmallDenseMap map{}; @@ -145,7 +145,7 @@ static void BM_llvmSmallDenseMapInsertLookup(benchmark::State &state) { BENCHMARK(BM_llvmSmallDenseMapInsertLookup)->DenseRange(2, 8, 1); static void BM_BumpMapInsertLookup(benchmark::State &state) { poly::alloc::OwningArena<> alloc; - uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 4ULL; std::mt19937_64 rng; for (auto b : state) { poly::dict::amap map{&alloc}; @@ -155,7 +155,7 @@ static void BM_BumpMapInsertLookup(benchmark::State &state) { } BENCHMARK(BM_BumpMapInsertLookup)->DenseRange(2, 8, 1); static void BM_ankerlMapInsertLookup(benchmark::State &state) { - uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 4ULL; std::mt19937_64 rng; for (auto b : state) { ankerl::unordered_dense::map map; @@ -164,7 +164,7 @@ static void BM_ankerlMapInsertLookup(benchmark::State &state) { } BENCHMARK(BM_ankerlMapInsertLookup)->DenseRange(2, 8, 1); static void BM_stdUnorderedMapInsertLookup(benchmark::State &state) { - uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 4ULL; std::mt19937_64 rng; for (auto b : state) { std::unordered_map map; @@ -174,7 +174,7 @@ static void BM_stdUnorderedMapInsertLookup(benchmark::State &state) { BENCHMARK(BM_stdUnorderedMapInsertLookup)->DenseRange(2, 8, 1); static void BM_llvmDenseMapInsertLookup3(benchmark::State &state) { - uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 4ULL; std::mt19937_64 rng; for (auto b : state) { llvm::DenseMap map{}; @@ -183,7 +183,7 @@ static void BM_llvmDenseMapInsertLookup3(benchmark::State &state) { } BENCHMARK(BM_llvmDenseMapInsertLookup3)->DenseRange(2, 8, 1); static void BM_llvmSmallDenseMapInsertLookup3(benchmark::State &state) { - uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 4ULL; std::mt19937_64 rng; for (auto b : state) { llvm::SmallDenseMap map{}; @@ -193,7 +193,7 @@ static void BM_llvmSmallDenseMapInsertLookup3(benchmark::State &state) { BENCHMARK(BM_llvmSmallDenseMapInsertLookup3)->DenseRange(2, 8, 1); static void BM_BumpMapInsertLookup3(benchmark::State &state) { poly::alloc::OwningArena<> alloc; - uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 4ULL; std::mt19937_64 rng; for (auto b : state) { poly::dict::amap map{&alloc}; @@ -203,7 +203,7 @@ static void BM_BumpMapInsertLookup3(benchmark::State &state) { } BENCHMARK(BM_BumpMapInsertLookup3)->DenseRange(2, 8, 1); static void BM_ankerlMapInsertLookup3(benchmark::State &state) { - uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 4ULL; std::mt19937_64 rng; for (auto b : state) { ankerl::unordered_dense::map map; @@ -212,7 +212,7 @@ static void BM_ankerlMapInsertLookup3(benchmark::State &state) { } BENCHMARK(BM_ankerlMapInsertLookup3)->DenseRange(2, 8, 1); static void BM_stdUnorderedMapInsertLookup3(benchmark::State &state) { - uint64_t mask = ((1ULL << state.range(0)) - 1) << 3ULL; + uint64_t mask = ((1ULL << state.range(0)) - 1) << 4ULL; std::mt19937_64 rng; for (auto b : state) { std::unordered_map map; diff --git a/include/Dicts/Trie.hpp b/include/Dicts/Trie.hpp index 4d43958cd..8fc524a19 100644 --- a/include/Dicts/Trie.hpp +++ b/include/Dicts/Trie.hpp @@ -1,4 +1,5 @@ #pragma once +#include "Containers/Pair.hpp" #include #include #include @@ -7,11 +8,20 @@ #include namespace poly::dict { -using utils::invariant; +using utils::invariant, containers::Pair; + +template constexpr auto fastHash(const T &x) -> uint64_t { + return ankerl::unordered_dense::hash{}(x); +} +template constexpr auto fastHash(T *x) -> uint64_t { + return reinterpret_cast(x) >> + std::countr_zero(alignof(std::max_align_t)); +} + // Idea from from https://nullprogram.com/blog/2023/09/30/ template struct TrieMapNode { K first; - V second; + V second{}; std::array *, 4> children{}; constexpr auto find(const K &k) -> TrieMapNode * { @@ -19,12 +29,27 @@ template struct TrieMapNode { } auto operator[](utils::Valid> alloc, const K &k) -> V & { Child c = findChild(k); + if constexpr (std::same_as) + if (reinterpret_cast(k) == 0x12e8) + std::cout << "c.child = " << c.child << "\n"; + else std::cout << "k = " << k; + else std::cout << "k = " << k; if (c.child) return c.child->second; invariant(c.parent != nullptr); invariant(c.index < 4); - c.parent[c.index] = alloc->create(); - c.parent[c.index]->first = k; - return c.parent[c.index]->second; + invariant(c.parent->children[c.index] == nullptr); + TrieMapNode res = c.parent->children[c.index] = + alloc->create(); + for (int i = 0; i < 4; ++i) invariant(res->children[i] == nullptr); + invariant(res->second == 0); + res->first = k; + ASSERT(find(k) == res); + if constexpr (std::same_as) { + if (reinterpret_cast(k) == 0x12e8) + std::cout << "res->first = " << res->first + << "res->second = " << res->second << "\n"; + } + return res->second; } protected: @@ -33,12 +58,21 @@ template struct TrieMapNode { TrieMapNode *parent; uint64_t index; // child == parent->children[index]; }; - constexpr auto firstChild() -> Child { - for (unsigned int i = 0; i < 4; ++i) - if (TrieMapNode *c = children[i]) return Child{c, this, i}; - return Child{nullptr, this, 0}; + constexpr auto isLeaf() -> bool { + return first && !std::ranges::any_of(children); + } + constexpr auto getLeaf() -> Child { + if (!first) return {nullptr, nullptr, 0}; + for (size_t i = 0; i < std::size(children); ++i) + if (TrieMapNode *child = children[i]) + if (Child leaf = child->getLeaf(); leaf.child) + return leaf.parent ? leaf : Child{leaf.child, this, i}; + return {this, nullptr, 0}; + } + constexpr auto getSubLeaf() -> Child { + Child c = getLeaf(); + return c.child != this ? c : Child{nullptr, nullptr, 0}; } - constexpr auto isLeaf() -> bool { return !std::ranges::any_of(children); } constexpr auto numChildren() -> int { int count = 0; for (auto c : children) count += (c != nullptr); @@ -47,9 +81,9 @@ template struct TrieMapNode { auto findChild(const K &k) -> Child { if (k == first) return {this, nullptr, 0}; TrieMapNode *p = this, *c = nullptr; - for (uint64_t h = ankerl::unordered_dense::hash{}(k);; h <<= 2) { - c = p->children[h >> 62]; - if (!c || (c->first == k)) return {c, p, h >> 62}; + for (uint64_t h = fastHash(k);; h >>= 2) { + c = p->children[h & 3]; + if (!c || (c->first == k)) return {c, p, h & 3}; p = c; } } @@ -58,15 +92,10 @@ template struct TrieMapNode { Child child = findChild(k); if (!child.child) return nullptr; // we're erasing `child` - Child l = child.child->firstChild(); + Child l = child.child->getSubLeaf(); if (l.child) { - for (;;) { - Child n = l.child->firstChild(); - if (!n.child) break; - l = n; - } - l.parent->children[l.index] = nullptr; // leaf is moved up - l.child->children = child.child->children; // leaf takes child's children + l.parent->children[l.index] = nullptr; // leaf is moved up + std::swap(l.child->children, child.child->children); } child.parent->children[child.index] = l.child; // leaf replaces deleted child.child->second = {}; @@ -94,14 +123,18 @@ struct TrieMap : TrieMapNode { if (c.child) return c.child->second; invariant(c.parent != nullptr); invariant(c.index < 4); + NodeT *&res = c.parent->children[c.index]; + invariant(res == nullptr); if (list) { - c.parent->children[c.index] = list; + res = list; list = std::exchange(list->children[0], nullptr); + res->second = {}; } else { - c.parent->children[c.index] = alloc->create(); + res = alloc->create(); + invariant(res->second == V{}); } - c.parent->children[c.index]->first = k; - return c.parent->children[c.index]->second; + res->first = k; + return res->second; } }; @@ -125,9 +158,8 @@ template struct InlineTrie { // Returns an optional pointer to the value. constexpr auto find(const K &k) -> utils::Optional { - Child c = findChild(this, k); - return (c.subIndex) ? std::nullopt - : utils::Optional{c.node->values[c.index]}; + auto [node, index] = findChild(this, k); + return node ? utils::Optional{node->values[index]} : std::nullopt; } auto operator[](utils::Valid> alloc, const K &k) -> V & { @@ -141,29 +173,47 @@ template struct InlineTrie { } void erase(const K &k) { - Child c = findChild(this, k); - if (c.subIndex) return; // was not found + auto [child, index] = findChild(this, k); + if (!child) return; // was not found // We now find a leaf key/value pair, and move them here. - InlineTrie *descendent = c.node->children[c.index]; - if (!descendent) { - c.node->keys[c.index] = {}; // set to null - c.node->values[c.index] = {}; - return; - } - for (;;) { - for (int i = 0; i < 4; ++i) { - if (descendent->children[i]) continue; - c.node->keys[c.index] = std::move(descendent->keys[i]); - c.node->values[c.index] = std::move(descendent->values[i]); - descendent->keys[i] = {}; - descendent->values[i] = {}; - return; + if (InlineTrie *descendent = child->children[index]) { + auto [lc, li] = descendent->findLeaf(); + if (lc) { + child->keys[index] = std::move(lc->keys[li]); + child->values[index] = std::move(lc->values[li]); + child = lc; + index = li; } - descendent = descendent->children[0]; } + child->keys[index] = {}; // set to null + child->values[index] = {}; } private: + auto isLeaf(int i) -> bool { + if (!keys[i]) return false; + if (!children[i]) return true; + for (int j = 0; j < 4; ++j) + if (!children[i]->isLeaf(j)) return false; + return true; + } + // A leaf is a key without any child keys. + // A leaf may have children without keys. + auto findLeaf() -> Pair { + InlineTrie *leaf = this; + bool descend[4]{false, false, false, false}; + for (ptrdiff_t i = 0; i < std::ssize(children); ++i) { + if (!leaf->keys[i]) continue; // need key to be leaf + if (!leaf->children[i]) return {leaf, i}; // no children, no child keys + descend[i] = true; + } + for (ptrdiff_t i = 0; i < std::ssize(children); ++i) { + if (!descend[i]) continue; + auto ret = leaf->children[i]->findLeaf(); + return ret.first ? ret : Pair{this, i}; + }; + return {nullptr, 0}; + } struct Child { InlineTrie *node; size_t index; @@ -171,18 +221,23 @@ template struct InlineTrie { }; template - static constexpr auto findChild(InlineTrie *node, const K &k) -> Child { - for (uint64_t h = ankerl::unordered_dense::hash{}(k);;) { - uint64_t ind = h >> 62; + static constexpr auto findChild(InlineTrie *node, const K &k) { + for (uint64_t h = fastHash(k);;) { + uint64_t ind = h & 3; bool noKey = !node->keys[ind]; if constexpr (Insert) { if (noKey) node->keys[ind] = k; + if (noKey || (*node->keys[ind] == k)) return Child{node, ind, {}}; } else { - if (noKey) return {node, ind, ind}; + if (noKey) return Pair{nullptr, ind}; + if (*node->keys[ind] == k) + return Pair{node, ind}; + } + h >>= 2; + if (!node->children[ind]) { + if constexpr (Insert) return Child{node, h & 3, ind}; + else return Pair{nullptr, ind}; } - if (noKey || (*node->keys[ind] == k)) return {node, ind, {}}; - h <<= 2; - if (!node->children[ind]) return {node, h >> 62, ind}; node = node->children[ind]; } }; From 9a156b06e294aa88dcfa4f2c08a616a9f0b2905c Mon Sep 17 00:00:00 2001 From: chriselrod Date: Tue, 17 Oct 2023 01:08:06 -0400 Subject: [PATCH 040/112] Cleanup trie --- include/Dicts/Trie.hpp | 41 +++++++++++------------------------------ 1 file changed, 11 insertions(+), 30 deletions(-) diff --git a/include/Dicts/Trie.hpp b/include/Dicts/Trie.hpp index 8fc524a19..62ff99b1d 100644 --- a/include/Dicts/Trie.hpp +++ b/include/Dicts/Trie.hpp @@ -27,30 +27,6 @@ template struct TrieMapNode { constexpr auto find(const K &k) -> TrieMapNode * { return findChild(k).child; } - auto operator[](utils::Valid> alloc, const K &k) -> V & { - Child c = findChild(k); - if constexpr (std::same_as) - if (reinterpret_cast(k) == 0x12e8) - std::cout << "c.child = " << c.child << "\n"; - else std::cout << "k = " << k; - else std::cout << "k = " << k; - if (c.child) return c.child->second; - invariant(c.parent != nullptr); - invariant(c.index < 4); - invariant(c.parent->children[c.index] == nullptr); - TrieMapNode res = c.parent->children[c.index] = - alloc->create(); - for (int i = 0; i < 4; ++i) invariant(res->children[i] == nullptr); - invariant(res->second == 0); - res->first = k; - ASSERT(find(k) == res); - if constexpr (std::same_as) { - if (reinterpret_cast(k) == 0x12e8) - std::cout << "res->first = " << res->first - << "res->second = " << res->second << "\n"; - } - return res->second; - } protected: struct Child { @@ -73,11 +49,6 @@ template struct TrieMapNode { Child c = getLeaf(); return c.child != this ? c : Child{nullptr, nullptr, 0}; } - constexpr auto numChildren() -> int { - int count = 0; - for (auto c : children) count += (c != nullptr); - return count; - } auto findChild(const K &k) -> Child { if (k == first) return {this, nullptr, 0}; TrieMapNode *p = this, *c = nullptr; @@ -139,8 +110,18 @@ struct TrieMap : TrieMapNode { }; template struct TrieMap : TrieMapNode { - using BaseT = TrieMapNode; + using NodeT = TrieMapNode; void erase(const K &k) { this->eraseImpl(k); } + auto operator[](utils::Valid> alloc, const K &k) -> V & { + typename NodeT::Child c = findChild(k); + if (c.child) return c.child->second; + invariant(c.parent != nullptr); + invariant(c.index < 4); + invariant(c.parent->children[c.index] == nullptr); + TrieMapNode res = c.parent->children[c.index] = alloc->create(); + res->first = k; + return res->second; + } }; static_assert(sizeof(TrieMap) == From ac327bd34b0afed5eb96c2cda5686af662f9d5f8 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Wed, 18 Oct 2023 03:08:10 -0400 Subject: [PATCH 041/112] add cost function, and the dict test file I forgot to add yesterday --- include/IR/CostFunction.hpp | 200 +++++++++++++++++++++++++----------- test/dict_test.cpp | 123 ++++++++++++++++++++++ 2 files changed, 261 insertions(+), 62 deletions(-) create mode 100644 test/dict_test.cpp diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp index f02662ef9..88884e03b 100644 --- a/include/IR/CostFunction.hpp +++ b/include/IR/CostFunction.hpp @@ -1,12 +1,88 @@ #pragma once #include +#include #include #include - namespace poly::CostModeling { -using math::AbstractVector; -using math::DensePtrMatrix; +using math::AbstractVector, math::DensePtrMatrix; +using utils::Optional; + +// Order is outermost -> innermost +// Costs are relative to Scalar, i.e. scalar == 1 +struct MemoryCosts { + unsigned contiguous; // vload/vstore + unsigned discontiguous; // gather/scatter +}; +struct VectorizationFactor { + unsigned l2factor; + unsigned index; // outermost == 0 +}; + +struct OrthogonalAxes { + uint32_t data; + [[nodiscard]] constexpr auto contigAxis() const -> uint32_t { + return data & 0xff; + } + // mask containing `0` for dependent axes, 1s for independent + // should contain `0` for all non-existent loops, e.g. + // for (i = I, j = J, k = K, l = L) { + // A[j,l] + // for (a = A, b = B){ .... } + // } + // The mask should equal (1<<0) | (1<<2) (for the i and k). + // Only loops it is nested in that it doesn't depend on count. + [[nodiscard]] constexpr auto indepAxes() const -> uint32_t { + return data >> 8; + }; +}; +// costs is an array of length two. +// memory costs, unnormalized by `prod(unrolls)` +constexpr auto cost(MemoryCosts mc, AbstractVector auto invunrolls, + VectorizationFactor vfi, OrthogonalAxes orth) + -> utils::eltype_t { + + utils::eltype_t c; + uint32_t da = orth.indepAxes(); + if (da) { + uint32_t tz = std::countr_zero(da); + c = invunrolls[tz++]; + for (uint32_t d = da >> tz, i = tz; d; d >>= tz, i += tz) { + tz = std::countr_zero(d); + c *= invunrolls[i + tz++]; + } + } else c = 1; + + if ((vfi.index < 32) && !(da & (1 << vfi.index))) { + // depends vectorized index + if (vfi.index == orth.contigAxis()) { + c *= mc.contiguous; + } else if (orth.contigAxis() >= 32) { + c *= mc.discontiguous; + } else { + // Discontiguous vector load. + // We consider two alternatives: + // 1. gather/scatter (discontiguous) + // 2. contiguous load for each vectorization factor of length equal to + // unroll, followed by shuffles. + // E.g., unroll contig by 4, another dim is vectorized by 8: + // we'd have 8 vloads (max(4/8,1) * 8), followed by 4*log2(8) + + // log2(max(8/4,1))*4 shuffles. + // Or, if we unroll contig by 8, and another dim is vectorzeed by 2, we'd + // have 8 = (max(8/2,1) * 2) vloads, 8*log2(2) + log2(max(2/8,1))*8 + // shuffles. + // We divide by `u[contig]`, as it is now accounted for + // So we have + // max(v/u, 1) + u*log2(v) + log2(max(v/u ,1))*u + utils::eltype_t iu{invunrolls[orth.contigAxis()]}, + u{1 / iu}, mr{math::smax((1 << vfi.l2factor) * iu, 1)}; + + c *= math::smin(mc.contiguous * mr + u * (vfi.l2factor + log2(mr)), + mc.discontiguous); + } + } + return c; +} /// Here, we define a cost fn that can be optimized to produce /// vectorization and unrolling factors. @@ -22,19 +98,18 @@ using math::DensePtrMatrix; /// it depends on, divided by the product of all unroll factors of all /// containing loops. /// To optimize, we can branch and bound. Unrolling factors lead to a natural -/// relaxation that plays well, but less so for binary variables like which loop -/// is vectorized. Additionally, patterns such as replacing gather/scatters with -/// shuffle sequences need special handling, that restricts the branch and bound -/// to powers of 2. To be able to build such a cost model, we need to estimate -/// the number of live variables as a result of unroll factors, in order to -/// impose constraints. +/// relaxation that plays well, but less so for binary variables like which +/// loop is vectorized. Additionally, patterns such as replacing +/// gather/scatters with shuffle sequences need special handling, that +/// restricts the branch and bound to powers of 2. To be able to build such a +/// cost model, we need to estimate the number of live variables as a result +/// of unroll factors, in order to impose constraints. /// /// We use soft constraints for register pressuring, representing the /// store/reload pair of a spill. /// -/// Furthermore, we also need to consider the possibility of dependency chains. -/// Consider, for example -/// for (ptrdiff_t i = 0; i < I; ++i){ +/// Furthermore, we also need to consider the possibility of dependency +/// chains. Consider, for example for (ptrdiff_t i = 0; i < I; ++i){ /// eltype_t xi = x[i]; /// for (ptrdiff_t j = 0; j < J; ++j) /// xi += A[i][j] * y[j]; @@ -48,14 +123,14 @@ using math::DensePtrMatrix; /// The second option is better, but may not be possible, e.g. if there is no /// `i` loop or it carries some dependency. Thus, we want our model to unroll /// `i` when legal, and unroll `j` otherwise. -/// Assuming a throughput of 2 fma/cycle and a latency of 4 cycles, an estimate -/// of the cost as a function of I, J, Ui, and Uj is (ignoring vectorization): -/// 4*I*J/min(Ui*Uj, 2*4) + 4*I*log2(Uj) -/// The first term is latency per fma (because of the dependency chain) * the -/// number of iterations, divided by however many unrolling allows us to have -/// inflight. The second term is for the reduction of the cloned `Uj` -/// accumulators. Each step in the reduction has a latency of 4 cycles, and we -/// need to do `log2(Uj)` steps. +/// Assuming a throughput of 2 fma/cycle and a latency of 4 cycles, an +/// estimate of the cost as a function of I, J, Ui, and Uj is (ignoring +/// vectorization): 4*I*J/min(Ui*Uj, 2*4) + 4*I*log2(Uj) The first term is +/// latency per fma (because of the dependency chain) * the number of +/// iterations, divided by however many unrolling allows us to have inflight. +/// The second term is for the reduction of the cloned `Uj` accumulators. Each +/// step in the reduction has a latency of 4 cycles, and we need to do +/// `log2(Uj)` steps. /// /// Note, `y-softplus(l*(y-x))/l` is a good smooth minimum function, /// monotonic in `x` and differentiable everywhere. `l` controls @@ -64,18 +139,19 @@ using math::DensePtrMatrix; /// Thus, a cost function for the above gemv could be something like /// memcost = I*J*(Ui*Uj*C_{Al} + Uj*C_{yl}) / (Ui*Uj) + /// I*(C_{xl}*Ui + C_{xs}*Ui) / Ui -/// cthroughput = I*J*(Ui*Uj*C_{t,fma}) / (Ui*Uj) + I*(Ui*C_{t,add}*(Uj-1)) / Ui -/// clatency = I*J*C_{l,fma}/smin(Ui*Uj, C_{l,fma}/C_{t,fma}) + +/// cthroughput = I*J*(Ui*Uj*C_{t,fma}) / (Ui*Uj) + I*(Ui*C_{t,add}*(Uj-1)) / +/// Ui clatency = I*J*C_{l,fma}/smin(Ui*Uj, C_{l,fma}/C_{t,fma}) + /// I*C_{l,add}*log2(Uj) /// cost = memcost + smax(cthroughput, clatency) /// or, if the it is easier to solve: /// cost = memcost + cthroughput + clatency /// -/// We may initially want to add a small cost for loop increment and cmp/branch, -/// to encourage unrolling more generally, plus a cost for unrolling to -/// discourse any excess unrolling when it doesn't provide meaningful benefits -/// (representing the general cost of code size/ filling uop cache -- we -/// definitely want loops to fit in the uop cache of any CPU sporting one!!! ). +/// We may initially want to add a small cost for loop increment and +/// cmp/branch, to encourage unrolling more generally, plus a cost for +/// unrolling to discourse any excess unrolling when it doesn't provide +/// meaningful benefits (representing the general cost of code size/ filling +/// uop cache -- we definitely want loops to fit in the uop cache of any CPU +/// sporting one!!! ). /// /// /// @@ -88,18 +164,18 @@ using math::DensePtrMatrix; /// then unrolling the `i` loop doesn't increase OOO, /// but we can assume that as successive `j` iterations are independent/do not /// have a dependency chain, this isn't an issue. -/// That is, we only consider reductions across the inner-most loop as requiring -/// cloning of accumulators. -/// -/// On throughput modeling, LLVM seems to generally give a recip throughput of 1 -/// for pipelined instructions, regardless of number of ports. This is actually -/// what we want, as this allows RTs to be additive (e.g., we may have a fma -/// that is able to run on 2 ports (e.g. p0 or p5) and a permute that can only -/// execute on one (e.g. p5); when mixing these instructions, they have the same -/// effective cost -- they use a port -- and the more limited port choices of -/// one isn't a problem so long as others can use what remains. For our -/// purposes, it isn't worth getting too fancy here. It is worth noting that the -/// baseline model presented here +/// That is, we only consider reductions across the inner-most loop as +/// requiring cloning of accumulators. +/// +/// On throughput modeling, LLVM seems to generally give a recip throughput of +/// 1 for pipelined instructions, regardless of number of ports. This is +/// actually what we want, as this allows RTs to be additive (e.g., we may +/// have a fma that is able to run on 2 ports (e.g. p0 or p5) and a permute +/// that can only execute on one (e.g. p5); when mixing these instructions, +/// they have the same effective cost -- they use a port -- and the more +/// limited port choices of one isn't a problem so long as others can use what +/// remains. For our purposes, it isn't worth getting too fancy here. It is +/// worth noting that the baseline model presented here /// https://arxiv.org/pdf/2107.14210.pdf /// performed respectively well when compared to vastly more sophisticated /// tools; for example, it performed similarly well as llvm-mca on most tested @@ -118,8 +194,8 @@ using math::DensePtrMatrix; /// newer, 1 for older) Unfortunately, we cannot get the CPU-specific /// information (`i`,`m`,or`w`) from LLVM. However, these are largely a matter /// of scale, and are generally correlated. E.g., Intel's Alderlake's values -/// would be 6, 3, and 2, vs the older Skylake's 4, 2, and 1. While not all the -/// ratios are equal (`w`'s is 2 instead of 1.5), it is unlikely that many +/// would be 6, 3, and 2, vs the older Skylake's 4, 2, and 1. While not all +/// the ratios are equal (`w`'s is 2 instead of 1.5), it is unlikely that many /// optimization decisions are going to be made differently between them. /// A possible exception is that we may wish to unroll more for CPUs with more /// out of order execution abilities. `getMaxInterleaveFactor` is an indicator @@ -132,38 +208,38 @@ using math::DensePtrMatrix; /// as the cost, where `a_g = abs(a/gcd(a,b))` and `b_g = abs(b/gcd(a,b))`. /// /// -/// Given `x[a*i + b*j + c*k]`, where neither `i` or `j` are vectorized (and -/// `a`, `b`, and `c` are compile time constants), we use: -/// (a_g*U_i + b_g*U_j + c_g*U_k - a_g*b_g - a_g*c_g - b_g*c_g + a_g*b_g*c_g) / -/// (U_i * U_j * U_k) -/// as the cost, where the `_g`s are same as before, but using the gcd of all -/// three `a`, `b`, and `c`. -/// NOTE: these, unlike the 2-case, are wrong, but they happen to be correct -/// when the gcds are all `1`. It hopefully at least dominates the actual cost. -/// Eventually, it'd be great to actually derive a general formula. +/// Given `x[a*i + b*j + c*k]`, where none of `i`, `j`, or `k` are vectorized +/// (and `a`, `b`, and `c` are compile time constants), we use: (a_g*U_i + +/// b_g*U_j + c_g*U_k - a_g*b_g - a_g*c_g - b_g*c_g + a_g*b_g*c_g) / (U_i * +/// U_j * U_k) as the cost, where the `_g`s are same as before, but using the +/// gcd of all three `a`, `b`, and `c`. NOTE: these, unlike the 2-case, are +/// wrong, but they happen to be correct when the gcds are all `1`. It +/// hopefully at least dominates the actual cost. Eventually, it'd be great to +/// actually derive a general formula. /// /// For register consumption, we /// 1. Determine an ordering of unroll factors for each inner most loop. /// 2. Define a registers used as a function of these unroll factors. /// /// Loads from inner unrolls that don't depend on any outer-unrolls must have -/// lifetimes spanning all outer-unrolls, if they're re-used by an op depending -/// on that outer. -/// Our heuristic for ordering unrolls is based on the twin observations: +/// lifetimes spanning all outer-unrolls, if they're re-used by an op +/// depending on that outer. Our heuristic for ordering unrolls is based on +/// the twin observations: /// 1. Inner unrolls are likely to consume more registers for longer. /// 2. More ops with overlapping lifetimes dependent on one particular loop /// require more registers. /// -/// As the ordering of unrolls influences register pressure, we sort them first -/// by register cost per unroll (placing those with the highest register cost -/// outside), and then by memory op cost within these categories, placing the -/// highest costs innermost (higher memory cost means lower unroll relative to -/// the lower cost, so that we get more reuse on the higher cost operations; -/// lower unroll means we place inside, reducing the cost of these unrolls). +/// As the ordering of unrolls influences register pressure, we sort them +/// first by register cost per unroll (placing those with the highest register +/// cost outside), and then by memory op cost within these categories, placing +/// the highest costs innermost (higher memory cost means lower unroll +/// relative to the lower cost, so that we get more reuse on the higher cost +/// operations; lower unroll means we place inside, reducing the cost of these +/// unrolls). /// -/// So, how do we define register cost per unroll in an unroll-order independent -/// manner, so that we can use this for determining the order? -/// for (int m=0; m +#include +#include +#include + +using poly::dict::TrieMap, poly::dict::InlineTrie; + +// NOLINTNEXTLINE(modernize-use-trailing-return-type) +TEST(TrieTest, BasicAssertions) { + std::mt19937_64 rng; + poly::alloc::OwningArena<> alloc{}; + + TrieMap d; + EXPECT_FALSE(d.find(3)); + d[&alloc, 3] = 11; + EXPECT_EQ(d.find(3)->second, 11); + d[&alloc, 3] += 11; + EXPECT_EQ(d.find(3)->second, 22); + + InlineTrie t; + EXPECT_FALSE(t.find(7)); + t[alloc, 7] = 13; + EXPECT_TRUE(t.find(7)); + EXPECT_EQ(*t.find(7), 13); + t[alloc, 7] += 14; + EXPECT_EQ(*t.find(7), 27); + //// More thorough test: + TrieMap tm; + InlineTrie it; + ankerl::unordered_dense::map m; + + // uint64_t mask = ((1ULL << 5) - 1) << 4ULL; + uint64_t mask = ((1ULL << 10) - 1) << 4ULL; + bool found = false; + // static constexpr auto debugval = 0xc38; + static constexpr auto debugval = 0x3c00; + // static constexpr auto debugval = 0x1358; + // static constexpr auto debugval = 0x12e8; + for (uint64_t i = 0; i < 512;) { + void *x = reinterpret_cast(rng() & mask); + if (!x) continue; + void *y = reinterpret_cast(rng() & mask); + if (!y) continue; + if (reinterpret_cast(x) == debugval) { + found = true; + auto *tmf = tm.find(y); + auto itf = it.find(y); + auto *tmfx = tm.find(x); + auto itfx = it.find(x); + std::cout << "i = " << i + 1 << "; m[y] = " << m[y] << "\n" + << "tm.find(y) = " << (tmf ? tmf->second : 0) + << "\nit.find(y) = " << (itf ? *itf : 0) + << "\ntm.find(x) = " << (tmfx ? tmfx->second : -1) + << "\nit.find(x) = " << (itfx ? *itfx : -1) + << "\ntm[a, x] = " << tm[&alloc, x] + << "\nit[a, x] = " << it[&alloc, x] + << "\ntm.find(x) = " << tm.find(x)->second + << "\nit.find(x) = " << *it.find(x) << "\n"; + } + if (found) { + void *p = reinterpret_cast(debugval); + EXPECT_EQ(m[p], tm.find(p)->second); + EXPECT_EQ(m[p], *it.find(p)); + ASSERT(m[p] == tm.find(p)->second); + ASSERT(m[p] == *it.find(p)); + } + m[x] += (++i) + m[y]; + tm[&alloc, x] += i + tm[&alloc, y]; + it[&alloc, x] += i + it[&alloc, y]; + if (reinterpret_cast(x) == debugval) { + auto *tmf = tm.find(x); + auto itf = it.find(x); + std::cout << "i = " << i << "; m[x] = " << m[x] << "\n" + << "tm.find(x) = " << (tmf ? tmf->second : -1) + << "\nit.find(x) = " << (itf ? *itf : -1) << "\n"; + } + EXPECT_TRUE(tm.find(x)); + EXPECT_TRUE(it.find(x)); + if (tm.find(x)->second != m[x]) std::cout << "x = " << x << "\n"; + if (*it.find(x) != m[x]) std::cout << "x = " << x << "\n"; + EXPECT_EQ(tm.find(x)->second, m[x]); + EXPECT_EQ(*it.find(x), m[x]); + void *z = reinterpret_cast(rng() & mask); + if (!z) continue; + // std::cout << "i = " << i << "\n"; + if (found) { + void *p = reinterpret_cast(debugval); + EXPECT_EQ(m[p], tm.find(p)->second); + EXPECT_EQ(m[p], *it.find(p)); + ASSERT(m[p] == tm.find(p)->second); + ASSERT(m[p] == *it.find(p)); + } + if (void *p = reinterpret_cast(debugval); p == z) { + auto *tmf = tm.find(z); + auto itf = it.find(z); + std::cout << "i = " << i << "; m[z] = " << m[z] << "\n" + << "tm.find(z) = " << (tmf ? tmf->second : -1) + << "\nit.find(z) = " << (itf ? *itf : -1) << "\n"; + } + m.erase(z); + tm.erase(z); + it.erase(z); + EXPECT_FALSE(tm.find(z)); + EXPECT_FALSE(it.find(z)); + if (reinterpret_cast(debugval) == z) found = false; + if (found) { + void *p = reinterpret_cast(debugval); + EXPECT_EQ(m[p], tm.find(p)->second); + EXPECT_EQ(m[p], *it.find(p)); + ASSERT(m[p] == tm.find(p)->second); + ASSERT(m[p] == *it.find(p)); + } + } + for (auto [k, v] : m) { + // std::cout << "k = " << k << "; v = " << v << "\n"; + EXPECT_TRUE(tm.find(k)); + EXPECT_TRUE(it.find(k)); + EXPECT_EQ(tm.find(k)->second, v); + EXPECT_EQ(*it.find(k), v); + } +} + From fe0d79449c709ba05fbaf88a7b066507370bc182 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Thu, 19 Oct 2023 03:15:53 -0400 Subject: [PATCH 042/112] minor progress --- include/IR/CostFunction.hpp | 76 +++++++++++++++++++++++++++++++------ 1 file changed, 64 insertions(+), 12 deletions(-) diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp index 88884e03b..e455dda31 100644 --- a/include/IR/CostFunction.hpp +++ b/include/IR/CostFunction.hpp @@ -2,10 +2,11 @@ #include #include +#include #include #include namespace poly::CostModeling { -using math::AbstractVector, math::DensePtrMatrix; +using math::AbstractVector, math::DensePtrMatrix, math::_; using utils::Optional; // Order is outermost -> innermost @@ -38,11 +39,11 @@ struct OrthogonalAxes { }; // costs is an array of length two. // memory costs, unnormalized by `prod(unrolls)` -constexpr auto cost(MemoryCosts mc, AbstractVector auto invunrolls, +constexpr auto cost(MemoryCosts mc, const AbstractVector auto &invunrolls, VectorizationFactor vfi, OrthogonalAxes orth) -> utils::eltype_t { - utils::eltype_t c; + utils::eltype_t c{}; uint32_t da = orth.indepAxes(); if (da) { uint32_t tz = std::countr_zero(da); @@ -83,6 +84,51 @@ constexpr auto cost(MemoryCosts mc, AbstractVector auto invunrolls, } return c; } +/// General fallback method for those without easy to represent structure +/// inds is an `IR::Address->indexMatrix()`, thus it is `arrayDim() x +/// getNumLoops()` +/// Non-standard structure here means that we have at least one loop with +/// more than one array dimension. +/// For these, we use the incorrect formula: +/// +constexpr auto cost(MemoryCosts mc, const AbstractVector auto &invunrolls, + VectorizationFactor vfi, DensePtrMatrix inds) + -> utils::eltype_t { + utils::eltype_t c{1}; + auto [arrayDim, numLoops] = inds.size(); + utils::invariant(arrayDim <= 16); + for (ptrdiff_t d = 0; d < arrayDim; ++d) { + int64_t g = 0; + utils::eltype_t uprod; + ptrdiff_t count = 0; + for (ptrdiff_t l = 0; l < numLoops; ++l) { + if (l == vfi.index) continue; + int64_t a = inds[d, l]; + if (!a) continue; + if (count++) { + g = math::gcd(g, a); + uprod *= invunrolls[l]; + } else { + g = a; + uprod = invunrolls[l]; + } + }; + if (count < 2) continue; + utils::eltype_t prod{1}; + for (ptrdiff_t l = 0; l < numLoops; ++l) { + if (l == vfi.index) continue; + int64_t a = inds[d, l]; + if (!a) continue; + prod *= (1 - (a / g) * (uprod / invunrolls[l])); + } + c *= (1 - prod); + } + // c is a scaling factor; now we proceed to calculate cost similaly to the + // orth-axis implementation above. + // That is, prod of all dependent unrolls, divided by prod of all, or + // (equivalently), prod off all non-dep inverse unrolls. + return c; +} /// Here, we define a cost fn that can be optimized to produce /// vectorization and unrolling factors. @@ -204,18 +250,24 @@ constexpr auto cost(MemoryCosts mc, AbstractVector auto invunrolls, /// /// Given `x[a*i + b*j]`, where neither `i` or `j` are vectorized (and `a` and /// `b` are compile time constants), we use: -/// (a_g*U_i + b_g*U_j - a_g*b_g) / (U_i * U_j) +/// (a_g*U_i + b_g*U_j - a_g*b_g) / (U_i*U_j) +/// = a_g/U_j + b_g/U_i - a_g*b_g / (U_i*U_j) +/// = 1 - (1 - a_g/U_j ) * (1 - b_g/U_i) /// as the cost, where `a_g = abs(a/gcd(a,b))` and `b_g = abs(b/gcd(a,b))`. /// +/// For more, we generalize this pattern +/// = 1 - \prod_{d}^{D}\left(1 - \frac{coef_{g,d}*U_d}{\prod_{i}^{D}U_i}\right) +/// +/// In the `D=3` case, this expands to +/// 1 - (1 - a_g/(U_j*U_k))(1 - b_g/(U_i*U_k))(1 - c_g/(U_i*U_j)) +/// = 1 - (1 - c_g/(U_i*U_j))* +/// (1 - a_g/(U_j*U_k) - b_g/(U_i*U_k)) + a_g*b_g/(U_i*U_j*U_k^2)) +/// = a_g/(U_j*U_k) + b_g/(U_i*U_k)) + c_g/(U_i*U_j) - a_g*b_g/(U_i*U_j*U_k^2)) +/// - a_g*c_g/(U_i*U_j^2*U_k) - b_g*c_g/(U_i^2*U_j*U_k)) +/// + a_g*b_g*c_g/(U_i^2*U_j^2*U_k^2)) /// -/// Given `x[a*i + b*j + c*k]`, where none of `i`, `j`, or `k` are vectorized -/// (and `a`, `b`, and `c` are compile time constants), we use: (a_g*U_i + -/// b_g*U_j + c_g*U_k - a_g*b_g - a_g*c_g - b_g*c_g + a_g*b_g*c_g) / (U_i * -/// U_j * U_k) as the cost, where the `_g`s are same as before, but using the -/// gcd of all three `a`, `b`, and `c`. NOTE: these, unlike the 2-case, are -/// wrong, but they happen to be correct when the gcds are all `1`. It -/// hopefully at least dominates the actual cost. Eventually, it'd be great to -/// actually derive a general formula. +/// TODO: check the degree of correctness... +/// I kind of just made something up that looks sort of right. /// /// For register consumption, we /// 1. Determine an ordering of unroll factors for each inner most loop. From 2e6a4aa79af592641e84dc5575196c25690a4954 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Thu, 19 Oct 2023 10:30:44 -0400 Subject: [PATCH 043/112] minor progress on cost fun --- include/IR/CostFunction.hpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp index e455dda31..d8a961cd5 100644 --- a/include/IR/CostFunction.hpp +++ b/include/IR/CostFunction.hpp @@ -1,5 +1,6 @@ #pragma once +#include "Containers/BitSets.hpp" #include #include #include @@ -96,7 +97,10 @@ constexpr auto cost(MemoryCosts mc, const AbstractVector auto &invunrolls, -> utils::eltype_t { utils::eltype_t c{1}; auto [arrayDim, numLoops] = inds.size(); - utils::invariant(arrayDim <= 16); + utils::invariant(numLoops > 0); + utils::invariant(arrayDim > 0); + utils::invariant(arrayDim <= 64); + containers::BitSet64 bs; for (ptrdiff_t d = 0; d < arrayDim; ++d) { int64_t g = 0; utils::eltype_t uprod; @@ -105,6 +109,14 @@ constexpr auto cost(MemoryCosts mc, const AbstractVector auto &invunrolls, if (l == vfi.index) continue; int64_t a = inds[d, l]; if (!a) continue; + bool docontinue; + for (ptrdiff_t k = 0; k < arrayDim; ++k) { + if (k == d) continue; + docontinue = (inds[d, _] != inds[k, _]) || (d > k); + if (docontinue) break; + } + if (docontinue) continue; + bs.insert(l); if (count++) { g = math::gcd(g, a); uprod *= invunrolls[l]; @@ -115,7 +127,7 @@ constexpr auto cost(MemoryCosts mc, const AbstractVector auto &invunrolls, }; if (count < 2) continue; utils::eltype_t prod{1}; - for (ptrdiff_t l = 0; l < numLoops; ++l) { + for (ptrdiff_t l : bs) { if (l == vfi.index) continue; int64_t a = inds[d, l]; if (!a) continue; From 1027f07cf33887d07ea421d4b71c19d4a5419499 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Fri, 20 Oct 2023 00:28:13 -0400 Subject: [PATCH 044/112] minor progress --- include/IR/CostFunction.hpp | 100 ++++++++++++++++++++++++------------ 1 file changed, 68 insertions(+), 32 deletions(-) diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp index d8a961cd5..6558f581b 100644 --- a/include/IR/CostFunction.hpp +++ b/include/IR/CostFunction.hpp @@ -1,13 +1,14 @@ #pragma once -#include "Containers/BitSets.hpp" +#include #include #include #include #include +#include #include namespace poly::CostModeling { -using math::AbstractVector, math::DensePtrMatrix, math::_; +using math::AbstractVector, math::AbstractMatrix, math::DensePtrMatrix, math::_; using utils::Optional; // Order is outermost -> innermost @@ -40,7 +41,8 @@ struct OrthogonalAxes { }; // costs is an array of length two. // memory costs, unnormalized by `prod(unrolls)` -constexpr auto cost(MemoryCosts mc, const AbstractVector auto &invunrolls, +// `invunrolls` is a matrix, row-0 are the inverse unrolls, row-1 unrolls. +constexpr auto cost(MemoryCosts mc, const AbstractMatrix auto &invunrolls, VectorizationFactor vfi, OrthogonalAxes orth) -> utils::eltype_t { @@ -48,10 +50,10 @@ constexpr auto cost(MemoryCosts mc, const AbstractVector auto &invunrolls, uint32_t da = orth.indepAxes(); if (da) { uint32_t tz = std::countr_zero(da); - c = invunrolls[tz++]; + c = invunrolls[0, tz++]; for (uint32_t d = da >> tz, i = tz; d; d >>= tz, i += tz) { tz = std::countr_zero(d); - c *= invunrolls[i + tz++]; + c *= invunrolls[0, i + tz++]; } } else c = 1; @@ -76,9 +78,11 @@ constexpr auto cost(MemoryCosts mc, const AbstractVector auto &invunrolls, // We divide by `u[contig]`, as it is now accounted for // So we have // max(v/u, 1) + u*log2(v) + log2(max(v/u ,1))*u - utils::eltype_t iu{invunrolls[orth.contigAxis()]}, - u{1 / iu}, mr{math::smax((1 << vfi.l2factor) * iu, 1)}; - + utils::eltype_t iu{ + invunrolls[0, orth.contigAxis()]}, + u{invunrolls[1, orth.contigAxis()]}, + mr{math::smax((1 << vfi.l2factor) * iu, 1)}; + utils::invariant(iu == 1 / u); c *= math::smin(mc.contiguous * mr + u * (vfi.l2factor + log2(mr)), mc.discontiguous); } @@ -92,55 +96,81 @@ constexpr auto cost(MemoryCosts mc, const AbstractVector auto &invunrolls, /// more than one array dimension. /// For these, we use the incorrect formula: /// -constexpr auto cost(MemoryCosts mc, const AbstractVector auto &invunrolls, - VectorizationFactor vfi, DensePtrMatrix inds) +constexpr auto cost(MemoryCosts mc, const AbstractMatrix auto &invunrolls, + VectorizationFactor vfi, OrthogonalAxes orth, + DensePtrMatrix inds) -> utils::eltype_t { utils::eltype_t c{1}; auto [arrayDim, numLoops] = inds.size(); utils::invariant(numLoops > 0); utils::invariant(arrayDim > 0); utils::invariant(arrayDim <= 64); - containers::BitSet64 bs; + utils::invariant(invunrolls.numCol(), inds.numCol()); for (ptrdiff_t d = 0; d < arrayDim; ++d) { int64_t g = 0; + containers::BitSet64 bs; utils::eltype_t uprod; - ptrdiff_t count = 0; for (ptrdiff_t l = 0; l < numLoops; ++l) { if (l == vfi.index) continue; int64_t a = inds[d, l]; if (!a) continue; - bool docontinue; + bool docontinue{false}; + // We only for (ptrdiff_t k = 0; k < arrayDim; ++k) { - if (k == d) continue; + if ((k == d) || (!inds[k, l])) continue; docontinue = (inds[d, _] != inds[k, _]) || (d > k); if (docontinue) break; } if (docontinue) continue; - bs.insert(l); - if (count++) { - g = math::gcd(g, a); - uprod *= invunrolls[l]; - } else { + if (bs.empty()) { g = a; - uprod = invunrolls[l]; + uprod = invunrolls[0, l]; + } else { + g = math::gcd(g, a); + uprod *= invunrolls[0, l]; } + bs.insert(l); }; - if (count < 2) continue; + if (bs.size() < 2) continue; utils::eltype_t prod{1}; for (ptrdiff_t l : bs) { if (l == vfi.index) continue; int64_t a = inds[d, l]; if (!a) continue; - prod *= (1 - (a / g) * (uprod / invunrolls[l])); + prod *= (1 - (a / g) * (uprod / invunrolls[0, l])); } c *= (1 - prod); } // c is a scaling factor; now we proceed to calculate cost similaly to the // orth-axis implementation above. - // That is, prod of all dependent unrolls, divided by prod of all, or - // (equivalently), prod off all non-dep inverse unrolls. - return c; + return c * cost(mc, invunrolls, vfi, orth); } +// We need to define an unroll ordering. +struct RegisterUseByUnroll { + math::PtrVector masks; + unsigned register_count; + [[nodiscard]] constexpr auto begin() const -> const uint32_t * { + return masks.begin(); + } + [[nodiscard]] constexpr auto end() const -> const uint32_t * { + return masks.end(); + } +}; +// TODO: define function to implement register_count +constexpr auto registerPressure(const AbstractMatrix auto &invunrolls, + const RegisterUseByUnroll &r) + -> utils::eltype_t { + utils::eltype_t c{0}; + for (uint32_t m : r) { + utils::eltype_t t{1}; + containers::BitSet64 bs{std::array{m}}; + for (ptrdiff_t i : bs) t *= invunrolls[1, i]; + c += t; + } + return r.register_count - c; +} +// We then additionally need a throughput vs latency estimator, and code for +// handling the tail. /// Here, we define a cost fn that can be optimized to produce /// vectorization and unrolling factors. @@ -167,12 +197,15 @@ constexpr auto cost(MemoryCosts mc, const AbstractVector auto &invunrolls, /// store/reload pair of a spill. /// /// Furthermore, we also need to consider the possibility of dependency -/// chains. Consider, for example for (ptrdiff_t i = 0; i < I; ++i){ +/// chains. Consider, for example +/// ``` +/// for (ptrdiff_t i = 0; i < I; ++i){ /// eltype_t xi = x[i]; /// for (ptrdiff_t j = 0; j < J; ++j) /// xi += A[i][j] * y[j]; /// x[i] = xi; /// } +/// ``` /// The `j` loop itself has a dependency chain. /// Two options for addressing this: /// 1. unrolling `j`, cloning the accumulation registers, and reducing at the @@ -214,16 +247,17 @@ constexpr auto cost(MemoryCosts mc, const AbstractVector auto &invunrolls, /// /// /// Note that if we had +/// ``` /// for (ptrdiff_t i = 0; i < I; ++i){ /// eltype_t yi = y[i]; /// for (ptrdiff_t j = 0; j < J; ++j) /// x[j] += A[i][j] * yi; /// } -/// then unrolling the `i` loop doesn't increase OOO, +/// ``` +/// then unrolling the `i` loop doesn't increase OOO (Out Of Order execution), /// but we can assume that as successive `j` iterations are independent/do not -/// have a dependency chain, this isn't an issue. -/// That is, we only consider reductions across the inner-most loop as -/// requiring cloning of accumulators. +/// have a dependency chain, this isn't an issue. That is, we only consider +/// reductions across the inner-most loop as requiring cloning of accumulators. /// /// On throughput modeling, LLVM seems to generally give a recip throughput of /// 1 for pipelined instructions, regardless of number of ports. This is @@ -302,8 +336,9 @@ constexpr auto cost(MemoryCosts mc, const AbstractVector auto &invunrolls, /// unrolls). /// /// So, how do we define register cost per unroll in an unroll-order -/// independent manner, so that we can use this for determining the order? for -/// (int m=0; m*--> (Cmn +=) /// B[k,n] -/ From 6bc7fcad35b7cb3bacd2a1be2fc55f51c8edcd12 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Sat, 21 Oct 2023 02:11:28 -0400 Subject: [PATCH 045/112] add coefs for register cost --- include/IR/CostFunction.hpp | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp index 6558f581b..fb41242f4 100644 --- a/include/IR/CostFunction.hpp +++ b/include/IR/CostFunction.hpp @@ -147,12 +147,13 @@ constexpr auto cost(MemoryCosts mc, const AbstractMatrix auto &invunrolls, } // We need to define an unroll ordering. struct RegisterUseByUnroll { - math::PtrVector masks; - unsigned register_count; - [[nodiscard]] constexpr auto begin() const -> const uint32_t * { + math::PtrVector> masks; // coef, mask pairs + unsigned register_count; // includes constant offset + [[nodiscard]] constexpr auto begin() const + -> const std::array * { return masks.begin(); } - [[nodiscard]] constexpr auto end() const -> const uint32_t * { + [[nodiscard]] constexpr auto end() const -> const std::array * { return masks.end(); } }; @@ -160,17 +161,27 @@ struct RegisterUseByUnroll { constexpr auto registerPressure(const AbstractMatrix auto &invunrolls, const RegisterUseByUnroll &r) -> utils::eltype_t { - utils::eltype_t c{0}; - for (uint32_t m : r) { + utils::eltype_t acc{0}; + for (auto [c, m] : r) { utils::eltype_t t{1}; containers::BitSet64 bs{std::array{m}}; for (ptrdiff_t i : bs) t *= invunrolls[1, i]; - c += t; + acc += c * t; } - return r.register_count - c; + return 0.25 * math::softplus(8.0 * (acc - r.register_count)); } // We then additionally need a throughput vs latency estimator, and code for // handling the tail. +// Standard throughput is fairly trivial/should be a vector sum, +// although we may have some operations not dependent on all loops, +// in which case unrolling the loops they don't depend on will help. +// Thus, it would probably be best to handle these with code +// similar to the memory cost-fun above, ideally we can abstract away the core. +/// memcost = I*J*(Ui*Uj*C_{Al} + Uj*C_{yl}) / (Ui*Uj) + +/// I*(C_{xl}*Ui + C_{xs}*Ui) / Ui +/// cthroughput = I*J*(Ui*Uj*C_{t,fma}) / (Ui*Uj) + I*(Ui*C_{t,add}*(Uj-1)) / +/// Ui clatency = I*J*C_{l,fma}/smin(Ui*Uj, C_{l,fma}/C_{t,fma}) + +/// I*C_{l,add}*log2(Uj) /// Here, we define a cost fn that can be optimized to produce /// vectorization and unrolling factors. From e879f6e95bf340436d6cabcb20618e9608c9c494 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Sun, 22 Oct 2023 04:22:54 -0400 Subject: [PATCH 046/112] added a comment, factored out a common cost component --- include/IR/CostFunction.hpp | 42 ++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp index fb41242f4..b641a9541 100644 --- a/include/IR/CostFunction.hpp +++ b/include/IR/CostFunction.hpp @@ -39,25 +39,32 @@ struct OrthogonalAxes { return data >> 8; }; }; -// costs is an array of length two. -// memory costs, unnormalized by `prod(unrolls)` -// `invunrolls` is a matrix, row-0 are the inverse unrolls, row-1 unrolls. -constexpr auto cost(MemoryCosts mc, const AbstractMatrix auto &invunrolls, - VectorizationFactor vfi, OrthogonalAxes orth) +constexpr auto operator&(OrthogonalAxes a, OrthogonalAxes b) -> uint32_t { + return a.indepAxes() & b.indepAxes(); +} +constexpr auto cost(const AbstractMatrix auto &invunrolls, + uint32_t independentAxes) -> utils::eltype_t { - utils::eltype_t c{}; - uint32_t da = orth.indepAxes(); - if (da) { - uint32_t tz = std::countr_zero(da); + if (independentAxes) { + uint32_t tz = std::countr_zero(independentAxes); c = invunrolls[0, tz++]; - for (uint32_t d = da >> tz, i = tz; d; d >>= tz, i += tz) { + for (uint32_t d = independentAxes >> tz, i = tz; d; d >>= tz, i += tz) { tz = std::countr_zero(d); c *= invunrolls[0, i + tz++]; } } else c = 1; + return c; +} +// costs is an array of length two. +// memory costs, unnormalized by `prod(unrolls)` +// `invunrolls` is a matrix, row-0 are the inverse unrolls, row-1 unrolls. +constexpr auto cost(MemoryCosts mc, const AbstractMatrix auto &invunrolls, + VectorizationFactor vfi, OrthogonalAxes orth) + -> utils::eltype_t { - if ((vfi.index < 32) && !(da & (1 << vfi.index))) { + utils::eltype_t c{cost(invunrolls, orth.indepAxes())}; + if ((vfi.index < 32) && !(orth.indepAxes() & (1 << vfi.index))) { // depends vectorized index if (vfi.index == orth.contigAxis()) { c *= mc.contiguous; @@ -168,6 +175,8 @@ constexpr auto registerPressure(const AbstractMatrix auto &invunrolls, for (ptrdiff_t i : bs) t *= invunrolls[1, i]; acc += c * t; } + // note the softplus(8x)/4, so 2x scaling on penalty representing + // the stack load+store combination. return 0.25 * math::softplus(8.0 * (acc - r.register_count)); } // We then additionally need a throughput vs latency estimator, and code for @@ -386,7 +395,16 @@ constexpr auto registerPressure(const AbstractMatrix auto &invunrolls, class LoopTreeCostFn { public: - constexpr auto operator()(const AbstractVector auto &x) const { return 0.0; } + // this is a vector fun, where indexing may do non-trivial computation + // also, mapping from this vector to loop position isn't trivial either + // hence, we use a 2 x max_depth matrix that we copy into as we descend + // (and pop from as we ascend). Row `0` is for inverse values, + // and row `1` for direct values. + // Inverses are favored as our costs fns use them more often. + constexpr auto operator()(const AbstractVector auto &x) const { + + return 0.0; + } }; } // namespace poly::CostModeling From 2b8c9436c3f3301b3ebeb784116609e64aa9ce32 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Mon, 23 Oct 2023 06:00:26 -0400 Subject: [PATCH 047/112] updates to track math lib --- .../include/constraint_pruning_benchmark.hpp | 6 +- include/IR/Address.hpp | 14 +- include/IR/Cache.hpp | 15 ++- include/Polyhedra/Comparators.hpp | 126 +++++++++--------- include/Polyhedra/Loops.hpp | 105 +++++++-------- include/Polyhedra/Polyhedra.hpp | 12 +- include/Support/OStream.hpp | 4 +- 7 files changed, 142 insertions(+), 140 deletions(-) diff --git a/benchmark/include/constraint_pruning_benchmark.hpp b/benchmark/include/constraint_pruning_benchmark.hpp index 2f61f6660..2205885df 100644 --- a/benchmark/include/constraint_pruning_benchmark.hpp +++ b/benchmark/include/constraint_pruning_benchmark.hpp @@ -11,7 +11,7 @@ using poly::math::Vector,poly::math::IntMatrix, poly::math::Row, poly::math::Col poly::math::DenseDims, poly::math::_, poly::utils::operator""_mat; static void BM_NullSpace(benchmark::State &state) { - IntMatrix<> B(poly::math::DenseDims{Row{6}, Col{3}}); + IntMatrix<> B(poly::math::DenseDims{Row<>{6}, Col<>{3}}); B[0, 0] = 1; B[1, 0] = 0; B[2, 0] = -3; @@ -44,7 +44,7 @@ BENCHMARK(BM_NullSpace); static void BM_NullSpace2000(benchmark::State &state) { const size_t N = 20; - IntMatrix<> A(DenseDims{Row{N}, Col{N}}); + IntMatrix<> A(DenseDims{Row<>{N}, Col<>{N}}); A << 0; A[0, 0] = 2; for (size_t i = 1; i < N; ++i) { @@ -76,7 +76,7 @@ BENCHMARK(BM_Orthogonalize); static void BM_Bareiss2000(benchmark::State &state) { const size_t N = 20; - IntMatrix<> A(DenseDims{Row{N}, Col{N}}); + IntMatrix<> A(DenseDims{Row<>{N}, Col<>{N}}); A << 0; A[0, 0] = 2; for (size_t i = 1; i < N; ++i) { diff --git a/include/IR/Address.hpp b/include/IR/Address.hpp index c251a3709..ef066dd43 100644 --- a/include/IR/Address.hpp +++ b/include/IR/Address.hpp @@ -127,7 +127,7 @@ class Addr : public Instruction { return {syms + numDim, numDynSym}; } [[nodiscard]] constexpr auto offsetMatrix() -> MutDensePtrMatrix { - return {offSym, DenseDims{getArrayDim(), numDynSym}}; + return {offSym, DenseDims<>{{getArrayDim()}, {numDynSym}}}; } public: @@ -156,7 +156,7 @@ class Addr : public Instruction { unsigned oldNatDepth = getNaturalDepth(); DensePtrMatrix M{indexMatrix()}; // aD x nLma MutPtrVector offsetOmega{getOffsetOmega()}; - unsigned depth = this->naturalDepth = uint8_t(Pinv.numCol()); + unsigned depth = this->naturalDepth = uint8_t(ptrdiff_t(Pinv.numCol())); MutDensePtrMatrix mStar{indexMatrix()}; // M is implicitly padded with zeros, newNumLoops >= oldNumLoops invariant(maxDepth >= naturalDepth); @@ -176,7 +176,7 @@ class Addr : public Instruction { // update `M` into `mStar` // mStar << M * Pinv(_(0, oldNumLoops), _); MutPtrVector buff{getFusionOmega()[_(0, math::last)]}; - invariant(buff.size(), unsigned(depth)); + invariant(buff.size(), ptrdiff_t(depth)); unsigned newNatDepth = 0; for (ptrdiff_t d = getArrayDim(); d--;) { buff << 0; @@ -304,7 +304,7 @@ class Addr : public Instruction { /// copies `o` and decrements the last element /// it decrements, as we iterate in reverse order constexpr void setFusionOmega(MutPtrVector o) { - invariant(o.size(), getCurrentDepth() + 1); + invariant(o.size(), ptrdiff_t(getCurrentDepth()) + 1); std::copy_n(o.begin(), getCurrentDepth(), getFusionOmega().begin()); getFusionOmega().back() = o.back()--; } @@ -475,11 +475,11 @@ class Addr : public Instruction { } /// indexMatrix() -> arrayDim() x getNumLoops() [[nodiscard]] constexpr auto indexMatrix() -> MutDensePtrMatrix { - return {indMatPtr(), DenseDims{getArrayDim(), getNaturalDepth()}}; + return {indMatPtr(), DenseDims<>{{getArrayDim()}, {getNaturalDepth()}}}; } /// indexMatrix() -> arrayDim() x getNumLoops() [[nodiscard]] constexpr auto indexMatrix() const -> DensePtrMatrix { - return {indMatPtr(), DenseDims{getArrayDim(), getNaturalDepth()}}; + return {indMatPtr(), DenseDims<>{{getArrayDim()}, {getNaturalDepth()}}}; } [[nodiscard]] constexpr auto getFusionOmega() -> MutPtrVector { unsigned L = getCurrentDepth() + 1; @@ -495,7 +495,7 @@ class Addr : public Instruction { } [[nodiscard]] constexpr auto offsetMatrix() const -> DensePtrMatrix { invariant(offSym != nullptr || numDynSym == 0); - return {offSym, DenseDims{getArrayDim(), numDynSym}}; + return {offSym, DenseDims<>{{getArrayDim()}, {numDynSym}}}; } [[nodiscard]] constexpr auto getAffineLoop() -> Valid { return loop; diff --git a/include/IR/Cache.hpp b/include/IR/Cache.hpp index 694b07819..fc51ffca1 100644 --- a/include/IR/Cache.hpp +++ b/include/IR/Cache.hpp @@ -339,8 +339,8 @@ class Cache { return blackList | blackListAllDependentLoops(S, numPeeled); } static void extendDensePtrMatCols(Arena<> *alloc, - MutDensePtrMatrix &A, math::Row R, - math::Col C) { + MutDensePtrMatrix &A, + math::Row<> R, math::Col<> C) { MutDensePtrMatrix B{matrix(alloc, A.numRow(), C)}; for (ptrdiff_t j = 0; j < R; ++j) { B[j, _(0, A.numCol())] << A[j, _]; @@ -541,11 +541,12 @@ class Cache { if (numDims == 0) return {zeroDimRef(loadOrStore, arrayPtr, 0), tr}; unsigned numPeeled = tr.rejectDepth; numLoops -= numPeeled; - math::IntMatrix Rt{math::StridedDims{numDims, numLoops}, 0}; + math::IntMatrix> Rt{ + math::StridedDims<>{{numDims}, {numLoops}}, 0}; llvm::SmallVector symbolicOffsets; uint64_t blackList{0}; math::Vector coffsets{unsigned(numDims), 0}; - MutDensePtrMatrix offsMat{nullptr, DenseDims{numDims, 0}}; + MutDensePtrMatrix offsMat{nullptr, DenseDims<>{{numDims}, {0}}}; { math::Vector offsets; for (ptrdiff_t i = 0; i < numDims; ++i) { @@ -554,8 +555,8 @@ class Cache { fillAffineIndices(Rt[i, _], &coffsets[i], offsets, symbolicOffsets, subscripts[i], 1, numPeeled); if (offsets.size() > offsMat.numCol()) - extendDensePtrMatCols(&alloc, offsMat, math::Row{i}, - math::Col{offsets.size()}); + extendDensePtrMatCols(&alloc, offsMat, math::Row<>{i}, + math::Col<>{offsets.size()}); offsMat[i, _] << offsets; } } @@ -607,7 +608,7 @@ class Cache { return B; } auto similarCompute(Compute *A, PtrVector ops) -> Compute * { - invariant(A->getNumOperands(), ops.size()); + invariant(ptrdiff_t(A->getNumOperands()), ops.size()); return createCompute(A->getOpId(), A->getKind(), ops, A->getType(), A->getFastMathFlags()); } diff --git a/include/Polyhedra/Comparators.hpp b/include/Polyhedra/Comparators.hpp index 06c16973a..70c9e11cd 100644 --- a/include/Polyhedra/Comparators.hpp +++ b/include/Polyhedra/Comparators.hpp @@ -264,8 +264,8 @@ concept Comparator = requires(T t, PtrVector x, int64_t y) { template struct BaseSymbolicComparator : BaseComparator> { - [[no_unique_address]] unsigned int numVar{0}; - [[no_unique_address]] unsigned int numEquations{0}; + [[no_unique_address]] ptrdiff_t numVar{0}; + [[no_unique_address]] ptrdiff_t numEquations{0}; using ThisT = BaseSymbolicComparator; using BaseT = BaseComparator; using BaseT::greaterEqual; @@ -291,16 +291,16 @@ struct BaseSymbolicComparator : BaseComparator> { [[nodiscard]] constexpr auto getD() const -> PtrVector { return static_cast(this)->getDImpl(); } - constexpr auto getV(Row r, Col c) -> MutDensePtrMatrix { + constexpr auto getV(Row<> r, Col<> c) -> MutDensePtrMatrix { return static_cast(this)->getVImpl(r, c); } - constexpr auto getU(Row r, Col c) -> MutDensePtrMatrix { + constexpr auto getU(Row<> r, Col<> c) -> MutDensePtrMatrix { return static_cast(this)->getUImpl(r, c); } - constexpr auto getD(Row n) -> MutPtrVector { + constexpr auto getD(Row<> n) -> MutPtrVector { return static_cast(this)->getDImpl(n); } - constexpr void setURank(Row r) { static_cast(this)->setURankImpl(r); } + constexpr void setURank(Row<> r) { static_cast(this)->setURankImpl(r); } [[nodiscard]] constexpr auto getURank() const -> ptrdiff_t { return static_cast(this)->getURankImpl(); } @@ -320,13 +320,13 @@ struct BaseSymbolicComparator : BaseComparator> { const ptrdiff_t numConExplicit = ptrdiff_t(A.numRow()) + 1; const ptrdiff_t numConTotal = numConExplicit + numNonNegative; numVar = ptrdiff_t(A.numCol()); - Row rowV = Row{numVar + numConTotal}; - Col colV = Col{2 * numConTotal}; + Row rowV = Row<>{numVar + numConTotal}; + Col colV = Col<>{2 * numConTotal}; /// B.size() == (A.numCol() + A.numRow() + 1 + numNonNegative) x /// (2 * (A.numRow() + 1 + numNonNegative)) /// auto B = getV(rowV, colV); - std::fill_n(B.begin(), B.numRow() * B.numCol(), 0); + std::fill_n(B.begin(), ptrdiff_t(B.numRow()) * ptrdiff_t(B.numCol()), 0); B[0, 0] = 1; // B = [ A_0 A_1 // 0 I ] @@ -354,10 +354,10 @@ struct BaseSymbolicComparator : BaseComparator> { const ptrdiff_t numInEqConTotal = numInEqConExplicit + numNonNegative; const ptrdiff_t numEqCon = ptrdiff_t(E.numRow()); numVar = ptrdiff_t(A.numCol()); - Row rowV = Row{numVar + numInEqConTotal}; - Col colV = Col{2 * numInEqConTotal + numEqCon}; + Row rowV = Row<>{numVar + numInEqConTotal}; + Col colV = Col<>{2 * numInEqConTotal + numEqCon}; auto B = getV(rowV, colV); - std::fill_n(B.begin(), B.numRow() * B.numCol(), 0); + std::fill_n(B.begin(), ptrdiff_t(B.numRow()) * ptrdiff_t(B.numCol()), 0); B[0, 0] = 1; // B is `A` augmented with the implicit non-negative constraints // B = [ A_0 A_1 @@ -386,10 +386,11 @@ struct BaseSymbolicComparator : BaseComparator> { [[nodiscard]] static constexpr auto memoryNeededNonNegative(PtrMatrix A, EmptyMatrix, ptrdiff_t numNonNegative) -> ptrdiff_t { - return memoryNeededImpl(A.numRow(), A.numCol(), Row{0}, ++numNonNegative); + return memoryNeededImpl(A.numRow(), A.numCol(), Row<>{0}, ++numNonNegative); } [[nodiscard]] inline static constexpr auto - memoryNeededImpl(Row Ar, Col Ac, Row Er, ptrdiff_t numPos) -> ptrdiff_t { + memoryNeededImpl(Row<> Ar, Col<> Ac, Row<> Er, ptrdiff_t numPos) + -> ptrdiff_t { // alternative: ptrdiff_t numInEqConTotal = ptrdiff_t(Ar) + numPos; ptrdiff_t colV = (numInEqConTotal << 1) + ptrdiff_t(Er); @@ -399,7 +400,7 @@ struct BaseSymbolicComparator : BaseComparator> { [[nodiscard]] static constexpr auto memoryNeededNonNegative(PtrMatrix A, ptrdiff_t numNonNegative) -> ptrdiff_t { - return memoryNeededImpl(A.numRow(), A.numCol(), Row{0}, ++numNonNegative); + return memoryNeededImpl(A.numRow(), A.numCol(), Row<>{0}, ++numNonNegative); } [[nodiscard]] static constexpr auto memoryNeededNonNegative(PtrMatrix A, PtrMatrix E, @@ -410,11 +411,11 @@ struct BaseSymbolicComparator : BaseComparator> { [[nodiscard]] static constexpr auto memoryNeeded(PtrMatrix A, EmptyMatrix, bool pos0) -> ptrdiff_t { - return memoryNeededImpl(A.numRow(), A.numCol(), Row{0}, pos0); + return memoryNeededImpl(A.numRow(), A.numCol(), Row<>{0}, pos0); } [[nodiscard]] static constexpr auto memoryNeeded(PtrMatrix A, bool pos0) -> ptrdiff_t { - return memoryNeededImpl(A.numRow(), A.numCol(), Row{0}, pos0); + return memoryNeededImpl(A.numRow(), A.numCol(), Row<>{0}, pos0); } [[nodiscard]] static constexpr auto memoryNeeded(PtrMatrix A, PtrMatrix E, @@ -425,10 +426,10 @@ struct BaseSymbolicComparator : BaseComparator> { bool pos0) { const ptrdiff_t numCon = ptrdiff_t(A.numRow()) + pos0; numVar = ptrdiff_t(A.numCol()); - Row rowV = numVar + numCon; - Col colV = 2 * numCon; + Row<> rowV = {numVar + numCon}; + Col<> colV = {2 * numCon}; auto B = getV(rowV, colV); - std::fill_n(B.begin(), B.numRow() * B.numCol(), 0); + std::fill_n(B.begin(), ptrdiff_t(B.numRow()) * ptrdiff_t(B.numCol()), 0); B[0, 0] = pos0; // V = [A' 0 // S I] @@ -449,8 +450,8 @@ struct BaseSymbolicComparator : BaseComparator> { const ptrdiff_t numInEqCon = ptrdiff_t(A.numRow()) + pos0; numVar = ptrdiff_t(A.numCol()); const ptrdiff_t numEqCon = ptrdiff_t(E.numRow()); - Row rowV = Row{numVar + numInEqCon}; - Col colV = Col{2 * numInEqCon + numEqCon}; + Row rowV = Row<>{numVar + numInEqCon}; + Col colV = Col<>{2 * numInEqCon + numEqCon}; auto B = getV(rowV, colV); B << 0; // V = [A' E' 0 @@ -477,7 +478,7 @@ struct BaseSymbolicComparator : BaseComparator> { U.diag() << 1; // We will have query of the form Ax = q; simplifySystemsImpl({B, U}); - while ((R) && allZero(B[R - 1, _])) --R; + while ((R) && allZero(B[ptrdiff_t(R) - 1, _])) --R; setURank(R); ptrdiff_t numColB = ptrdiff_t(B.numCol()); // upper bounded by numVar + numInEq x numVar + numInEq @@ -490,7 +491,7 @@ struct BaseSymbolicComparator : BaseComparator> { auto Vt{identity(alloc, numColB)}; // Ht.numRow() > Ht.numCol() = R // (2*numInEq + numEq) x R - auto Ht = matrix(alloc, Row{numColB}, Col{ptrdiff_t(R)}); + auto Ht = matrix(alloc, Row<>{numColB}, Col<>{ptrdiff_t(R)}); Ht << B[_(0, R), _].transpose(); solveSystem(Ht, Vt); // upper bounded by numVar + numInEq @@ -511,7 +512,7 @@ struct BaseSymbolicComparator : BaseComparator> { if (d.empty()) { if (!allZero(b[_(V.numRow(), end)])) return false; Col oldn = V.numCol(); - auto H{matrix(&alloc, V.numRow(), oldn + 1)}; + auto H{matrix(&alloc, V.numRow(), ++auto{oldn})}; // IntMatrix H{V.numRow(), oldn + 1}; H[_, _(0, oldn)] << V; H[_, oldn] << -b; @@ -521,7 +522,7 @@ struct BaseSymbolicComparator : BaseComparator> { return true; } // Column rank deficient case - Row numSlack = V.numRow() - numEquations; + Row numSlack = Row<>{ptrdiff_t(V.numRow()) - numEquations}; // Vector dinv = d; // copy // We represent D martix as a vector, and multiply the lcm to the // linear equation to avoid store D^(-1) as rational type @@ -530,15 +531,15 @@ struct BaseSymbolicComparator : BaseComparator> { b2 << -b * lcmD / d; // Vector b2 = -b * Dlcm / d; ptrdiff_t numRowTrunc = ptrdiff_t(U.numRow()); - auto c{vector(&alloc, ptrdiff_t(V.numRow() - numEquations))}; + auto c{vector(&alloc, ptrdiff_t(V.numRow()) - numEquations)}; c << V[_(numEquations, end), _(begin, numRowTrunc)] * b2; // Vector c = V(_(numEquations, end), _(begin, numRowTrunc)) * // b2; - auto dimNS = V.numCol() - numRowTrunc; + ptrdiff_t dimNS = ptrdiff_t(V.numCol()) - numRowTrunc; // expand W stores [c -JV2 JV2] // we use simplex to solve [-JV2 JV2][y2+ y2-]' <= JV1D^(-1)Uq // where y2 = y2+ - y2- - auto expandW{matrix(&alloc, Row{numSlack}, Col{dimNS * 2 + 1})}; + auto expandW{matrix(&alloc, numSlack, Col<>{dimNS * 2 + 1})}; for (ptrdiff_t i = 0; i < numSlack; ++i) { expandW[i, 0] = c[i]; // expandW(i, 0) *= Dlcm; @@ -564,7 +565,7 @@ struct BaseSymbolicComparator : BaseComparator> { -> bool { auto V = getV(); if (!allZero(b[_(V.numRow(), end)])) return false; - auto H = matrix(alloc, V.numRow(), V.numCol() + 1); + auto H = matrix(alloc, V.numRow(), ++auto{V.numCol()}); Col oldn = V.numCol(); H[_, _(0, oldn)] << V; // H.numRow() == b.size(), because we're only here if dimD == 0, @@ -580,7 +581,7 @@ struct BaseSymbolicComparator : BaseComparator> { -> bool { auto V = getV(); auto d = getD(); - Row numSlack = V.numRow() - numEquations; + Row numSlack = Row<>{ptrdiff_t(V.numRow()) - numEquations}; auto dinv = vector(alloc, d.size()); dinv << d; // copy // We represent D martix as a vector, and multiply the lcm to the @@ -592,13 +593,13 @@ struct BaseSymbolicComparator : BaseComparator> { b[i] *= x; } ptrdiff_t numRowTrunc = getURank(); - auto c = vector(alloc, unsigned(V.numRow() - numEquations)); + auto c = vector(alloc, ptrdiff_t(V.numRow()) - numEquations); c << V[_(numEquations, end), _(begin, numRowTrunc)] * b; - auto dimNS = V.numCol() - numRowTrunc; + auto dimNS = ptrdiff_t(V.numCol()) - numRowTrunc; // expand W stores [c -JV2 JV2] // we use simplex to solve [-JV2 JV2][y2+ y2-]' <= JV1D^(-1)Uq // where y2 = y2+ - y2- - auto expandW = matrix(alloc, numSlack, dimNS * 2 + 1); + auto expandW = matrix(alloc, numSlack, Col<>{dimNS * 2 + 1}); for (ptrdiff_t i = 0; i < numSlack; ++i) { expandW[i, 0] = c[i]; // expandW(i, 0) *= Dlcm; @@ -615,7 +616,7 @@ struct BaseSymbolicComparator : BaseComparator> { PtrVector query) const -> bool { auto U = getU(); - auto b = vector(&alloc, unsigned(U.numRow())); + auto b = vector(&alloc, ptrdiff_t(U.numRow())); b << U[_, _(begin, query.size())] * query; return getD().size() ? greaterEqualRankDeficient(&alloc, b) : greaterEqualFullRank(&alloc, b); @@ -625,7 +626,7 @@ struct LinearSymbolicComparator : public BaseSymbolicComparator { using Base = BaseSymbolicComparator; using Base::init; - using Matrix = math::ManagedArray; + using Matrix = math::ManagedArray>; [[no_unique_address]] Matrix U; [[no_unique_address]] Matrix V; [[no_unique_address]] Vector d; @@ -642,7 +643,7 @@ struct LinearSymbolicComparator return d; } - constexpr void setURankImpl(Row r) { + constexpr void setURankImpl(Row<> r) { V.truncate(r); U.truncate(r); } @@ -655,18 +656,18 @@ struct LinearSymbolicComparator [[nodiscard]] constexpr auto getURankImpl() const -> ptrdiff_t { return ptrdiff_t(U.numRow()); } - constexpr auto getUImpl(Row r, Col c) -> MutDensePtrMatrix { + constexpr auto getUImpl(Row<> r, Col<> c) -> MutDensePtrMatrix { U.resizeForOverwrite(r, c); return U; } - constexpr auto getVImpl(Row r, Col c) -> MutDensePtrMatrix { + constexpr auto getVImpl(Row<> r, Col<> c) -> MutDensePtrMatrix { V.setSize(r, c); - U.setSize(r, Col{ptrdiff_t(r)}); + U.setSize(r, Col<>{ptrdiff_t(r)}); return V; } - constexpr auto getDImpl(Row N) -> MutPtrVector { + constexpr auto getDImpl(Row<> N) -> MutPtrVector { d.resizeForOverwrite(ptrdiff_t(N)); - V.resizeForOverwrite(Row{ptrdiff_t{V.numCol()}}); + V.resizeForOverwrite(Row<>{ptrdiff_t{V.numCol()}}); return d; } static constexpr auto construct(PtrMatrix Ap, EmptyMatrix, @@ -716,15 +717,12 @@ struct PtrSymbolicComparator using Base = BaseSymbolicComparator; using Base::init; int64_t *mem; - // unsigned int numVar; - // unsigned int numInEq; - // unsigned int numEq; - unsigned int rankU{0}; - unsigned int colU{0}; - unsigned int dimV{0}; - unsigned int dimD{0}; + ptrdiff_t rankU{0}; + ptrdiff_t colU{0}; + ptrdiff_t dimV{0}; + ptrdiff_t dimD{0}; - constexpr void setURankImpl(Row r) { rankU = unsigned(r); } + constexpr void setURankImpl(Row<> r) { rankU = ptrdiff_t(r); } [[nodiscard]] constexpr auto getURankImpl() const -> ptrdiff_t { return rankU; } @@ -741,18 +739,15 @@ struct PtrSymbolicComparator // } // NOLINTNEXTLINE(readability-make-member-function-const) constexpr auto getUImpl() -> MutDensePtrMatrix { - return {mem, DenseDims{rankU, colU}}; + return {mem, DenseDims<>{{rankU}, {colU}}}; } // A = V // H = A // H.truncate(Row()); // size is H.numCol() * H.numCol() - [[nodiscard]] constexpr auto numVRows() const -> unsigned { - return dimD ? dimV : rankU; - } // offset by (numVar + numInEq)*(numVar + numInEq) constexpr auto getVImpl() -> MutDensePtrMatrix { - return {getUImpl().end(), DenseDims{numVRows(), dimV}}; + return {getUImpl().end(), DenseDims<>{numVRows(), Col<>{dimV}}}; } // size D constexpr auto getDImpl() -> MutPtrVector { @@ -760,24 +755,25 @@ struct PtrSymbolicComparator return {getVImpl().end(), dimD}; } [[nodiscard]] constexpr auto getUImpl() const -> DensePtrMatrix { - return {mem, DenseDims{rankU, colU}}; + return {mem, DenseDims<>{Row<>{rankU}, Col<>{colU}}}; } [[nodiscard]] constexpr auto getVImpl() const -> DensePtrMatrix { - return {mem + ptrdiff_t(rankU) * colU, DenseDims{numVRows(), dimV}}; + return {mem + ptrdiff_t(rankU) * colU, + DenseDims<>{numVRows(), Col<>{dimV}}}; } [[nodiscard]] constexpr auto getDImpl() const -> PtrVector { return {mem + ptrdiff_t(rankU) * colU + ptrdiff_t(numVRows()) * dimV, dimD}; } // constexpr auto getUImpl(Row r, Col c) -> MutPtrMatrix {} - constexpr auto getVImpl(Row r, Col c) -> MutDensePtrMatrix { - colU = rankU = unsigned(r); - dimV = unsigned(c); + constexpr auto getVImpl(Row<> r, Col<> c) -> MutDensePtrMatrix { + colU = rankU = ptrdiff_t(r); + dimV = ptrdiff_t(c); getUImpl() << 0; dimD = 0; return getVImpl(); } - constexpr auto getDImpl(Row r) -> MutPtrVector { - dimD = unsigned(r); + constexpr auto getDImpl(Row<> r) -> MutPtrVector { + dimD = ptrdiff_t(r); invariant(dimD > 0); return getDImpl(); } @@ -825,6 +821,10 @@ struct PtrSymbolicComparator }; private: + [[nodiscard]] constexpr auto numVRows() const -> Row<> { + return {ptrdiff_t(dimD ? dimV : rankU)}; + } + constexpr PtrSymbolicComparator(int64_t *p) : mem(p) {} }; @@ -849,7 +849,7 @@ constexpr void moveEqualities(DenseMatrix &A, math::IntMatrix<> &E, } if (isNeg && C.equalNegative(A[i, _], A[o, _])) { ptrdiff_t e = ptrdiff_t(E.numRow()); - E.resize(e + 1, numVar); + E.resize(Row<>{e + 1}, Col<>{numVar}); for (ptrdiff_t v = 0; v < numVar; ++v) E[e, v] = A[i, v]; eraseConstraint(A, i, o); break; diff --git a/include/Polyhedra/Loops.hpp b/include/Polyhedra/Loops.hpp index 2f4af41d3..a5078ce41 100644 --- a/include/Polyhedra/Loops.hpp +++ b/include/Polyhedra/Loops.hpp @@ -168,13 +168,13 @@ namespace loopNestCtor { /// we try to break down value `v`, so that adding /// N, N - 1, N - 3 only adds the variable `N`, and adds the constant /// offsets -inline void addSymbol(IntMatrix &A, +inline void addSymbol(IntMatrix> &A, llvm::SmallVectorImpl &symbols, const llvm::SCEV *v, math::Range lu, int64_t mlt) { assert(lu.size()); symbols.push_back(v); - A.resize(A.numCol() + 1); + A.resize(++auto{A.numCol()}); A[lu, symbols.size()] << mlt; } inline auto addRecMatchesLoop(const llvm::SCEV *S, llvm::Loop *L) -> bool { @@ -182,11 +182,12 @@ inline auto addRecMatchesLoop(const llvm::SCEV *S, llvm::Loop *L) -> bool { return x->getLoop() == L; return false; } -[[nodiscard]] inline auto addSymbol( - std::array, 2> &AB, // NOLINT(misc-no-recursion) - llvm::SmallVectorImpl &symbols, llvm::Loop *L, - const llvm::SCEV *v, llvm::ScalarEvolution &SE, - math::Range lu, int64_t mlt, ptrdiff_t minDepth) +[[nodiscard]] inline auto +addSymbol(std::array>, 2> + &AB, // NOLINT(misc-no-recursion) + llvm::SmallVectorImpl &symbols, llvm::Loop *L, + const llvm::SCEV *v, llvm::ScalarEvolution &SE, + math::Range lu, int64_t mlt, ptrdiff_t minDepth) -> ptrdiff_t { auto &[A, B] = AB; // first, we check if `v` in `Symbols` @@ -242,7 +243,7 @@ inline auto addRecMatchesLoop(const llvm::SCEV *S, llvm::Loop *L) -> bool { const llvm::SCEV *op1 = mm->getOperand(1); if (isMin ^ (mlt < 0)) { // we can represent this as additional constraints Row M = A.numRow(); - Row Mp = M + std::ssize(lu); + Row Mp = Row<>{ptrdiff_t(M) + std::ssize(lu)}; A.resize(Mp); B.resize(Mp); A[_(M, Mp), _] = A[lu, _]; @@ -260,7 +261,7 @@ inline auto addRecMatchesLoop(const llvm::SCEV *S, llvm::Loop *L) -> bool { return minDepth; } inline auto -areSymbolsLoopInvariant(IntMatrix &A, +areSymbolsLoopInvariant(IntMatrix> &A, llvm::SmallVectorImpl &symbols, llvm::Loop *L, llvm::ScalarEvolution &SE) -> bool { for (ptrdiff_t i = 0; i < std::ssize(symbols); ++i) @@ -269,17 +270,17 @@ areSymbolsLoopInvariant(IntMatrix &A, return true; } inline auto // NOLINTNEXTLINE(misc-no-recursion) -addBackedgeTakenCount(std::array, 2> &AB, +addBackedgeTakenCount(std::array>, 2> &AB, llvm::SmallVectorImpl &symbols, llvm::Loop *L, const llvm::SCEV *BT, llvm::ScalarEvolution &SE, ptrdiff_t minDepth, llvm::OptimizationRemarkEmitter *ORE) -> ptrdiff_t { // A contains syms auto &[A, B] = AB; - Row M = A.numRow(); - A.resize(M + 1); - B.resize(M + 1); - minDepth = addSymbol(AB, symbols, L, BT, SE, _(M, M + 1), 1, minDepth); + Row M = A.numRow(), MM = M; + A.resize(++MM); + B.resize(MM); + minDepth = addSymbol(AB, symbols, L, BT, SE, _(M, MM), 1, minDepth); assert(A.numRow() == B.numRow()); ptrdiff_t depth = L->getLoopDepth() - 1; for (auto m = ptrdiff_t(M); m < A.numRow(); ++m) B[m, depth] = -1; // indvar @@ -364,15 +365,15 @@ class Loop : public BasePolyhedra { // A holds symbols // B holds loop bounds // they're separate so we can grow them independently - std::array, 2> AB; + std::array>, 2> AB; auto &[A, B] = AB; // once we're done assembling these, we'll concatenate A and B unsigned maxDepth = L->getLoopDepth(); invariant(maxDepth > 0); // ptrdiff_t maxNumSymbols = BT->getExpressionSize(); A.resizeForOverwrite( - math::StridedDims{0, 1, unsigned(1) + BT->getExpressionSize()}); - B.resizeForOverwrite(math::StridedDims{0, maxDepth, maxDepth}); + math::StridedDims<>{{0}, {1}, {ptrdiff_t(1) + BT->getExpressionSize()}}); + B.resizeForOverwrite(math::StridedDims<>{{0}, {maxDepth}, {maxDepth}}); llvm::SmallVector symbols; ptrdiff_t minDepth = loopNestCtor::addBackedgeTakenCount(AB, symbols, L, BT, SE, 0, ORE); @@ -404,7 +405,7 @@ class Loop : public BasePolyhedra { } invariant(1 + std::ssize(symbols), ptrdiff_t(A.numCol())); ptrdiff_t depth = maxDepth - minDepth; - unsigned numConstraints = unsigned(A.numRow()), N = unsigned(A.numCol()); + ptrdiff_t numConstraints = ptrdiff_t(A.numRow()), N = ptrdiff_t(A.numCol()); Valid aln{ Loop::allocate(alloc, L, numConstraints, depth, symbols, maxDepth)}; aln->getA()[_, _(0, N)] << A; @@ -441,16 +442,16 @@ class Loop : public BasePolyhedra { bool thisNonNeg = isNonNegative(), nonNeg = thisNonNeg && allGEZero(R), addExtra = thisNonNeg != nonNeg; if (addExtra) numExtraVar = getNumLoops(); - invariant(unsigned(R.numCol()), getNumLoops()); - invariant(unsigned(R.numRow()), getNumLoops()); + invariant(ptrdiff_t(R.numCol()), getNumLoops()); + invariant(ptrdiff_t(R.numRow()), getNumLoops()); auto A{getA()}; const auto [M, N] = A.size(); auto syms{getSyms()}; Valid aln{Loop::allocate(alloc, L, ptrdiff_t(M) + numExtraVar, numLoops, syms, nonNeg)}; auto B{aln->getA()}; - invariant(B.numRow(), M + numExtraVar); - invariant(B.numCol(), N); + invariant(B.numRow() == M + numExtraVar); + invariant(B.numCol() == N); B[_(0, M), _(0, numConst)] << A[_, _(0, numConst)]; B[_(0, M), _(numConst, end)] << A[_, _(numConst, end)] * R; if (addExtra) { @@ -486,7 +487,7 @@ class Loop : public BasePolyhedra { [[nodiscard]] auto removeInnerMost(Arena<> *alloc) const -> Valid { // order is outer<->inner auto A{getA()}; - auto ret = Loop::allocate(alloc, L->getParentLoop(), unsigned(A.numRow()), + auto ret = Loop::allocate(alloc, L->getParentLoop(), ptrdiff_t(A.numRow()), getNumLoops() - 1, getSyms(), isNonNegative()); MutPtrMatrix B{ret->getA()}; B << A[_, _(0, last)]; @@ -494,14 +495,14 @@ class Loop : public BasePolyhedra { // safely remove all constraints that reference it for (Row m = B.numRow(); m--;) { if (A[m, last]) { - if (m != B.numRow() - 1) B[m, _] << B[last, _]; - B.truncate(B.numRow() - 1); + if (m != --auto{B.numRow()}) B[m, _] << B[last, _]; + B.truncate(--B.numRow()); } } - ret->truncateConstraints(unsigned(B.numRow())); + ret->truncateConstraints(ptrdiff_t(B.numRow())); return ret; } - constexpr void truncateConstraints(unsigned newNumConstraints) { + constexpr void truncateConstraints(ptrdiff_t newNumConstraints) { assert(newNumConstraints <= numConstraints); numConstraints = newNumConstraints; } @@ -568,13 +569,13 @@ class Loop : public BasePolyhedra { v += getNumSymbols(); auto zeroNegPos = indsZeroNegPos(A[_, v]); auto &[zer, neg, pos] = zeroNegPos; - unsigned numCon = - unsigned(A.numRow()) - pos.size() + neg.size() * pos.size(); + ptrdiff_t numCon = + ptrdiff_t(A.numRow()) - pos.size() + neg.size() * pos.size(); if (!isNonNegative()) numCon -= neg.size(); auto p = checkpoint(alloc); auto ret = Loop::allocate(alloc, nullptr, numCon, numLoops - 1, getSyms(), isNonNegative()); - ret->numConstraints = unsigned( + ret->numConstraints = ptrdiff_t( isNonNegative() ? fourierMotzkinCore(ret->getA(), getA(), v, zeroNegPos) : fourierMotzkinCore(ret->getA(), getA(), v, zeroNegPos)); @@ -588,7 +589,7 @@ class Loop : public BasePolyhedra { return ret; } constexpr void eraseConstraint(ptrdiff_t c) { - eraseConstraintImpl(getA(), c); + eraseConstraintImpl(getA(), Row<>{c}); --numConstraints; } [[nodiscard]] auto zeroExtraItersUponExtending(Arena<> alloc, ptrdiff_t _i, @@ -611,9 +612,9 @@ class Loop : public BasePolyhedra { if ((A[n, numConst] != 0) && (A[n, 1 + numConst] != 0)) indep = false; if (indep) return false; Loop *margi = tmp->removeLoop(&alloc, 1), *tmp2; - invariant(margi->getNumLoops(), unsigned(1)); - invariant(tmp->getNumLoops(), unsigned(2)); - invariant(margi->getA().numCol() + 1, tmp->getA().numCol()); + invariant(margi->getNumLoops(), ptrdiff_t(1)); + invariant(tmp->getNumLoops(), ptrdiff_t(2)); + invariant(++auto{margi->getA().numCol()}, tmp->getA().numCol()); // margi contains extrema for `_i` // we can substitute extended for value of `_i` // in `tmp` @@ -624,7 +625,7 @@ class Loop : public BasePolyhedra { if (b <= 0) continue; alloc.rollback(p2); tmp2 = tmp->copy(&alloc); - invariant(tmp2->getNumLoops(), unsigned(2)); + invariant(tmp2->getNumLoops(), ptrdiff_t(2)); invariant(margi->getNumLoops() + 1, tmp2->getNumLoops()); // increment to increase bound // this is correct for both extending lower and extending upper @@ -828,38 +829,38 @@ class Loop : public BasePolyhedra { #ifndef NDEBUG [[gnu::used]] void dump() const { llvm::errs() << *this; } #endif - [[nodiscard]] constexpr auto getNumCon() const -> unsigned { + [[nodiscard]] constexpr auto getNumCon() const -> ptrdiff_t { return numConstraints; } [[nodiscard]] constexpr auto getA() -> MutDensePtrMatrix { const void *ptr = memory + sizeof(const llvm::SCEV *const *) * numDynSymbols; auto *p = (int64_t *)const_cast(ptr); - return {p, math::DenseDims{numConstraints, numLoops + numDynSymbols + 1}}; + return {p, math::DenseDims<>{{numConstraints}, {numLoops + numDynSymbols + 1}}}; }; [[nodiscard]] constexpr auto getA() const -> DensePtrMatrix { const void *ptr = memory + sizeof(const llvm::SCEV *const *) * numDynSymbols; auto *p = (int64_t *)const_cast(ptr); - return {p, math::DenseDims{numConstraints, numLoops + numDynSymbols + 1}}; + return {p, math::DenseDims<>{{numConstraints}, {numLoops + numDynSymbols + 1}}}; }; - [[nodiscard]] constexpr auto getOuterA(unsigned subLoop) + [[nodiscard]] constexpr auto getOuterA(ptrdiff_t subLoop) -> MutPtrMatrix { const void *ptr = memory + sizeof(const llvm::SCEV *const *) * numDynSymbols; auto *p = (int64_t *)const_cast(ptr); - unsigned numSym = numDynSymbols + 1; - return {p, math::StridedDims{numConstraints, subLoop + numSym, - numLoops + numSym}}; + ptrdiff_t numSym = numDynSymbols + 1; + return {p, math::StridedDims<>{{numConstraints}, {subLoop + numSym}, + {numLoops + numSym}}}; }; - [[nodiscard]] constexpr auto getOuterA(unsigned subLoop) const + [[nodiscard]] constexpr auto getOuterA(ptrdiff_t subLoop) const -> PtrMatrix { const void *ptr = memory + sizeof(const llvm::SCEV *const *) * numDynSymbols; auto *p = (int64_t *)const_cast(ptr); - unsigned numSym = numDynSymbols + 1; - return {p, math::StridedDims{numConstraints, subLoop + numSym, - numLoops + numSym}}; + ptrdiff_t numSym = numDynSymbols + 1; + return {p, math::StridedDims<>{{numConstraints}, {subLoop + numSym}, + {numLoops + numSym}}}; }; [[nodiscard]] auto getSyms() -> llvm::MutableArrayRef { void *ptr = memory; @@ -869,24 +870,24 @@ class Loop : public BasePolyhedra { const void *ptr = memory; return {(const llvm::SCEV *const *)ptr, numDynSymbols}; } - [[nodiscard]] constexpr auto getNumLoops() const -> unsigned { + [[nodiscard]] constexpr auto getNumLoops() const -> ptrdiff_t { return numLoops; } - [[nodiscard]] constexpr auto getNumSymbols() const -> unsigned { + [[nodiscard]] constexpr auto getNumSymbols() const -> ptrdiff_t { return numDynSymbols + 1; } - constexpr void truncNumInEqCon(Row r) { + constexpr void truncNumInEqCon(Row<> r) { invariant(r < numConstraints); - numConstraints = unsigned(r); + numConstraints = ptrdiff_t(r); } [[nodiscard]] static auto construct(Arena<> *alloc, llvm::Loop *L, PtrMatrix A, llvm::ArrayRef syms, bool nonNeg) -> Loop * { - unsigned numLoops = unsigned(A.numCol()) - 1 - syms.size(); + ptrdiff_t numLoops = ptrdiff_t(A.numCol()) - 1 - syms.size(); Loop *aln = - allocate(alloc, L, unsigned(A.numRow()), numLoops, syms, nonNeg); + allocate(alloc, L, ptrdiff_t(A.numRow()), numLoops, syms, nonNeg); aln->getA() << A; return aln; } diff --git a/include/Polyhedra/Polyhedra.hpp b/include/Polyhedra/Polyhedra.hpp index 880f887e5..f4f56a110 100644 --- a/include/Polyhedra/Polyhedra.hpp +++ b/include/Polyhedra/Polyhedra.hpp @@ -83,10 +83,10 @@ struct BasePolyhedra { if constexpr (HasEqualities) return static_cast(this)->getE(); else return EmptyMatrix(); } - constexpr void truncNumInEqCon(Row r) { + constexpr void truncNumInEqCon(Row<> r) { static_cast

(this)->truncNumInEqCon(r); } - constexpr void truncNumEqCon(Row r) { + constexpr void truncNumEqCon(Row<> r) { if constexpr (HasEqualities) static_cast

(this)->truncNumEqCon(r); } [[nodiscard]] constexpr auto @@ -138,11 +138,11 @@ struct BasePolyhedra { pruneBounds(alloc); } constexpr void eraseConstraint(ptrdiff_t constraint) { - eraseConstraintImpl(getA(), constraint); + eraseConstraintImpl(getA(), Row<>{constraint}); decrementNumConstraints(); } template constexpr void pruneBoundsCore(Arena<> *alloc) { - auto diff = vector(alloc, unsigned(getA().numCol())); + auto diff = vector(alloc, ptrdiff_t(getA().numCol())); auto p = checkpoint(alloc); const ptrdiff_t dyn = getNumDynamic(); if constexpr (HasEqualities) { @@ -253,8 +253,8 @@ struct BasePolyhedra { // return false; } void truncateVars(ptrdiff_t numVar) { - if constexpr (HasEqualities) getE().truncate(Col{numVar}); - getA().truncate(Col{numVar}); + if constexpr (HasEqualities) getE().truncate(Col<>{numVar}); + getA().truncate(Col<>{numVar}); } }; } // namespace poly::poly diff --git a/include/Support/OStream.hpp b/include/Support/OStream.hpp index 5303a8095..e004194a3 100644 --- a/include/Support/OStream.hpp +++ b/include/Support/OStream.hpp @@ -30,12 +30,12 @@ inline auto operator<<(llvm::raw_ostream &os, PtrMatrix A) return os << sos.str(); } template -inline auto operator<<(llvm::raw_ostream &os, Array A) +inline auto operator<<(llvm::raw_ostream &os, Array> A) -> llvm::raw_ostream & { return os << PtrMatrix{A}; } template -inline auto operator<<(llvm::raw_ostream &os, Array A) +inline auto operator<<(llvm::raw_ostream &os, Array> A) -> llvm::raw_ostream & { return os << PtrMatrix{A}; } From 14b4a9e1b9d2db8a9727ea48e8502b5587e5752b Mon Sep 17 00:00:00 2001 From: chriselrod Date: Tue, 24 Oct 2023 03:01:59 -0400 Subject: [PATCH 048/112] start writing a bit of the skeleton --- include/IR/CostFunction.hpp | 100 +++++++++++++++++++++++++----------- 1 file changed, 70 insertions(+), 30 deletions(-) diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp index b641a9541..24ff0bf99 100644 --- a/include/IR/CostFunction.hpp +++ b/include/IR/CostFunction.hpp @@ -1,5 +1,7 @@ #pragma once +#include "Containers/Pair.hpp" +#include "Math/Constructors.hpp" #include #include #include @@ -11,22 +13,38 @@ namespace poly::CostModeling { using math::AbstractVector, math::AbstractMatrix, math::DensePtrMatrix, math::_; using utils::Optional; -// Order is outermost -> innermost -// Costs are relative to Scalar, i.e. scalar == 1 +/// Gives counts for the different kinds of costs. +struct LoopCostCounts { + uint32_t memory; + uint32_t ascend : 1; // ascend means come out of loop + uint32_t compute : 31; +}; + +/// Order is outermost -> innermost +/// Costs are relative to Scalar, i.e. scalar == 1 struct MemoryCosts { - unsigned contiguous; // vload/vstore - unsigned discontiguous; // gather/scatter + uint32_t contiguous; // vload/vstore + uint32_t discontiguous; // gather/scatter }; struct VectorizationFactor { - unsigned l2factor; - unsigned index; // outermost == 0 + uint32_t l2factor; + uint32_t index; // outermost == 0 }; +/// TODO: maybe two `uint8_t`s + `uint16_t` +/// We only get up to 16 dimensions, but that is already excessive +/// One `uint8_t` gives contig axis, the other the index into +/// the memory cost kind. Thus, the struct could differentiate +/// loads vs stores by itself, while also differentiating +/// between eltypes. +/// Another option is to store individual `MemoryCosts`, +/// so that we can aggregate/sum up. struct OrthogonalAxes { - uint32_t data; - [[nodiscard]] constexpr auto contigAxis() const -> uint32_t { - return data & 0xff; - } + uint32_t contig : 8; + uint32_t indep : 24; + // [[nodiscard]] constexpr auto contigAxis() const -> uint32_t { + // return data & 0xff; + // } // mask containing `0` for dependent axes, 1s for independent // should contain `0` for all non-existent loops, e.g. // for (i = I, j = J, k = K, l = L) { @@ -35,12 +53,12 @@ struct OrthogonalAxes { // } // The mask should equal (1<<0) | (1<<2) (for the i and k). // Only loops it is nested in that it doesn't depend on count. - [[nodiscard]] constexpr auto indepAxes() const -> uint32_t { - return data >> 8; - }; + // [[nodiscard]] constexpr auto indepAxes() const -> uint32_t { + // return data >> 8; + // }; }; constexpr auto operator&(OrthogonalAxes a, OrthogonalAxes b) -> uint32_t { - return a.indepAxes() & b.indepAxes(); + return a.indep & b.indep; } constexpr auto cost(const AbstractMatrix auto &invunrolls, uint32_t independentAxes) @@ -63,12 +81,12 @@ constexpr auto cost(MemoryCosts mc, const AbstractMatrix auto &invunrolls, VectorizationFactor vfi, OrthogonalAxes orth) -> utils::eltype_t { - utils::eltype_t c{cost(invunrolls, orth.indepAxes())}; - if ((vfi.index < 32) && !(orth.indepAxes() & (1 << vfi.index))) { + utils::eltype_t c{cost(invunrolls, orth.indep)}; + if ((vfi.index < 32) && !(orth.indep & (1 << vfi.index))) { // depends vectorized index - if (vfi.index == orth.contigAxis()) { + if (vfi.index == orth.contig) { c *= mc.contiguous; - } else if (orth.contigAxis() >= 32) { + } else if (orth.contig >= 32) { c *= mc.discontiguous; } else { // Discontiguous vector load. @@ -85,9 +103,8 @@ constexpr auto cost(MemoryCosts mc, const AbstractMatrix auto &invunrolls, // We divide by `u[contig]`, as it is now accounted for // So we have // max(v/u, 1) + u*log2(v) + log2(max(v/u ,1))*u - utils::eltype_t iu{ - invunrolls[0, orth.contigAxis()]}, - u{invunrolls[1, orth.contigAxis()]}, + utils::eltype_t iu{invunrolls[0, orth.contig]}, + u{invunrolls[1, orth.contig]}, mr{math::smax((1 << vfi.l2factor) * iu, 1)}; utils::invariant(iu == 1 / u); c *= math::smin(mc.contiguous * mr + u * (vfi.l2factor + log2(mr)), @@ -152,6 +169,9 @@ constexpr auto cost(MemoryCosts mc, const AbstractMatrix auto &invunrolls, // orth-axis implementation above. return c * cost(mc, invunrolls, vfi, orth); } + +constexpr auto calcLeafCosts(const AbstractMatrix auto &invunrolls); + // We need to define an unroll ordering. struct RegisterUseByUnroll { math::PtrVector> masks; // coef, mask pairs @@ -393,17 +413,37 @@ constexpr auto registerPressure(const AbstractMatrix auto &invunrolls, /// /// /// class LoopTreeCostFn { + math::PtrVector cost_counts; + math::PtrVector> orth_axes; + math::PtrVector> compute_independence; + math::PtrVector leaf_reductions; + VectorizationFactor vf; + ptrdiff_t max_depth; public: - // this is a vector fun, where indexing may do non-trivial computation - // also, mapping from this vector to loop position isn't trivial either - // hence, we use a 2 x max_depth matrix that we copy into as we descend - // (and pop from as we ascend). Row `0` is for inverse values, - // and row `1` for direct values. - // Inverses are favored as our costs fns use them more often. - constexpr auto operator()(const AbstractVector auto &x) const { - - return 0.0; + // this is a vector fun, where indexing may do non-trivial computation + // also, mapping from this vector to loop position isn't trivial either + // hence, we use a 2 x max_depth matrix that we copy into as we descend + // (and pop from as we ascend). Row `0` is for inverse values, + // and row `1` for direct values. + // Inverses are favored as our costs fns use them more often. + constexpr auto operator()(alloc::Arena<> alloc, + const AbstractVector auto &x) const { + using T = utils::eltype_t; + math::MutArray> invunrolls{ + math::matrix(alloc, math::Row<2>{}, math::Col<>{max_depth})}; + ptrdiff_t i = 0, depth = 0; + bool ascended = false; + T cost{}; + for (auto [memory, ascend, compute] : cost_counts) { + if ((!ascended) & bool(ascend)) { + // we're now in a leaf, meaning we must consider register costs, + // as well as reduction costs and latency of reduction chains. + calcLeafCosts(invunrolls); + } + ascended = ascend; + } + return cost; } }; From d6b57c0b7e419a7ee8ca1ede4581577a8f58fb62 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Wed, 25 Oct 2023 02:32:34 -0400 Subject: [PATCH 049/112] minor progress on costfn --- include/IR/CostFunction.hpp | 92 +++++++++++++++++++++++++++---------- 1 file changed, 68 insertions(+), 24 deletions(-) diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp index 24ff0bf99..9fea0e620 100644 --- a/include/IR/CostFunction.hpp +++ b/include/IR/CostFunction.hpp @@ -13,12 +13,20 @@ namespace poly::CostModeling { using math::AbstractVector, math::AbstractMatrix, math::DensePtrMatrix, math::_; using utils::Optional; -/// Gives counts for the different kinds of costs. +/// POD. Gives counts for the different kinds of costs. +/// Fields: +/// `int16_t trip_count`- we're unlikely to change decisions for >32k +/// negative indicates compile-time known size. +/// `uint16_t memory` number of mem sets. +/// `bool exit` loop exit/entry. +/// `uint31_t compute` number of compute sets. struct LoopCostCounts { - uint32_t memory; - uint32_t ascend : 1; // ascend means come out of loop + int16_t trip_count; /// we're unlikely to make different decisions for >65k + uint16_t memory; + uint32_t exit : 1; /// ascend means come out of loop uint32_t compute : 31; }; +static_assert(sizeof(LoopCostCounts) == 8); /// Order is outermost -> innermost /// Costs are relative to Scalar, i.e. scalar == 1 @@ -60,14 +68,13 @@ struct OrthogonalAxes { constexpr auto operator&(OrthogonalAxes a, OrthogonalAxes b) -> uint32_t { return a.indep & b.indep; } -constexpr auto cost(const AbstractMatrix auto &invunrolls, - uint32_t independentAxes) +constexpr auto cost(const AbstractMatrix auto &invunrolls, uint32_t indepAxes) -> utils::eltype_t { utils::eltype_t c{}; - if (independentAxes) { - uint32_t tz = std::countr_zero(independentAxes); + if (indepAxes) { + uint32_t tz = std::countr_zero(indepAxes); c = invunrolls[0, tz++]; - for (uint32_t d = independentAxes >> tz, i = tz; d; d >>= tz, i += tz) { + for (uint32_t d = indepAxes >> tz, i = tz; d; d >>= tz, i += tz) { tz = std::countr_zero(d); c *= invunrolls[0, i + tz++]; } @@ -77,8 +84,8 @@ constexpr auto cost(const AbstractMatrix auto &invunrolls, // costs is an array of length two. // memory costs, unnormalized by `prod(unrolls)` // `invunrolls` is a matrix, row-0 are the inverse unrolls, row-1 unrolls. -constexpr auto cost(MemoryCosts mc, const AbstractMatrix auto &invunrolls, - VectorizationFactor vfi, OrthogonalAxes orth) +constexpr auto cost(const AbstractMatrix auto &invunrolls, OrthogonalAxes orth, + MemoryCosts mc, VectorizationFactor vfi) -> utils::eltype_t { utils::eltype_t c{cost(invunrolls, orth.indep)}; @@ -120,8 +127,8 @@ constexpr auto cost(MemoryCosts mc, const AbstractMatrix auto &invunrolls, /// more than one array dimension. /// For these, we use the incorrect formula: /// -constexpr auto cost(MemoryCosts mc, const AbstractMatrix auto &invunrolls, - VectorizationFactor vfi, OrthogonalAxes orth, +constexpr auto cost(const AbstractMatrix auto &invunrolls, OrthogonalAxes orth, + MemoryCosts mc, VectorizationFactor vfi, DensePtrMatrix inds) -> utils::eltype_t { utils::eltype_t c{1}; @@ -199,6 +206,20 @@ constexpr auto registerPressure(const AbstractMatrix auto &invunrolls, // the stack load+store combination. return 0.25 * math::softplus(8.0 * (acc - r.register_count)); } + +auto memcosts( + const AbstractMatrix auto &invunrolls, VectorizationFactor vf, + math::PtrVector> orth_axes) { + utils::eltype_t ic{}; + for (auto [oa, mc] : orth_axes) ic += cost(invunrolls, oa, vf, mc); + return ic; +} +auto compcosts(const AbstractMatrix auto &invunrolls, + math::PtrVector> compindep) { + utils::eltype_t cc{}; + for (auto [oa, sf] : compindep) cc += cost(invunrolls, oa) * sf; + return cc; +} // We then additionally need a throughput vs latency estimator, and code for // handling the tail. // Standard throughput is fairly trivial/should be a vector sum, @@ -211,7 +232,7 @@ constexpr auto registerPressure(const AbstractMatrix auto &invunrolls, /// cthroughput = I*J*(Ui*Uj*C_{t,fma}) / (Ui*Uj) + I*(Ui*C_{t,add}*(Uj-1)) / /// Ui clatency = I*J*C_{l,fma}/smin(Ui*Uj, C_{l,fma}/C_{t,fma}) + /// I*C_{l,add}*log2(Uj) - +/// /// Here, we define a cost fn that can be optimized to produce /// vectorization and unrolling factors. /// We assemble all addrs into a vector, sorted by depth first traversal order @@ -416,7 +437,7 @@ class LoopTreeCostFn { math::PtrVector cost_counts; math::PtrVector> orth_axes; math::PtrVector> compute_independence; - math::PtrVector leaf_reductions; + math::PtrVector> leafs; VectorizationFactor vf; ptrdiff_t max_depth; @@ -432,18 +453,41 @@ class LoopTreeCostFn { using T = utils::eltype_t; math::MutArray> invunrolls{ math::matrix(alloc, math::Row<2>{}, math::Col<>{max_depth})}; - ptrdiff_t i = 0, depth = 0; - bool ascended = false; - T cost{}; - for (auto [memory, ascend, compute] : cost_counts) { - if ((!ascended) & bool(ascend)) { - // we're now in a leaf, meaning we must consider register costs, - // as well as reduction costs and latency of reduction chains. - calcLeafCosts(invunrolls); + ptrdiff_t i = 0, depth = 0, mi = 0, ci = 0, li = 0; + double tc = 1; + // we evaluate every iteration + bool exiting = false; + T c{}; + for (auto [trip_count, memory, exit, compute] : cost_counts) { + T ic{}; + if (!exit) { + // we're in a header + invunrolls[1, depth] = x[i++]; + invunrolls[0, depth] = 1 / invunrolls[1, depth]; + ++depth; + tc *= trip_count; + } + T mc{memcosts(invunrolls, vf, orth_axes[_(0, memory) + mi])}; + mi += memory; + T cc{compcosts(invunrolls, compute_independence[_(0, compute) + ci])}; + ci += compute; + if (exit) { + if (exiting) { + } else { + auto [reguse, lreduct] = leafs[li++]; + // we're now in a leaf, meaning we must consider register costs, + // as well as reduction costs and latency of reduction chains. + auto [lrtp, ll] = calcLeafCosts(invunrolls[_, depth]) * lreduct; + ic += registerPressure(invunrolls, reguse); + } + --depth; + tc /= trip_count; } - ascended = ascend; + exiting = exit; + // TODO: memcost + smax(cthroughput, clatency); + c += tc * ic; } - return cost; + return c; } }; From d164cd3de7e315ae3ca092bd7abbd9265939f370 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Thu, 26 Oct 2023 03:44:51 -0400 Subject: [PATCH 050/112] minor progress on costfn comments --- include/IR/CostFunction.hpp | 77 ++++++++++++++++++++++--------------- 1 file changed, 46 insertions(+), 31 deletions(-) diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp index 9fea0e620..b1d1558e7 100644 --- a/include/IR/CostFunction.hpp +++ b/include/IR/CostFunction.hpp @@ -20,13 +20,32 @@ using utils::Optional; /// `uint16_t memory` number of mem sets. /// `bool exit` loop exit/entry. /// `uint31_t compute` number of compute sets. +/// These give us info for iterating over the costs associated with a loop. +/// for (i : I){ +/// for (j : J){ +/// for (k : K){ // leaf +/// ... +/// } +/// for (k : K){ // leaf +/// ... +/// } +/// } +/// for (j : J){ // leaf +/// ... +/// } +/// } +/// For leaves, we compute latency as well as register cost. +/// Note that we compute all costs at the header for a given depth, +/// thus we only need headers and num-pops. struct LoopCostCounts { - int16_t trip_count; /// we're unlikely to make different decisions for >65k + uint16_t known_trip : 1; + uint16_t + trip_count : 15; /// we're unlikely to make different decisions for >32k uint16_t memory; - uint32_t exit : 1; /// ascend means come out of loop - uint32_t compute : 31; + uint16_t exit : 5; /// how many blocks we exit after this + uint16_t compute : 11; }; -static_assert(sizeof(LoopCostCounts) == 8); +static_assert(sizeof(LoopCostCounts) == 6); /// Order is outermost -> innermost /// Costs are relative to Scalar, i.e. scalar == 1 @@ -48,8 +67,8 @@ struct VectorizationFactor { /// Another option is to store individual `MemoryCosts`, /// so that we can aggregate/sum up. struct OrthogonalAxes { - uint32_t contig : 8; - uint32_t indep : 24; + uint32_t contig : 8; // max number of array dims of 255 + uint32_t indep : 24; // max loop depth of 24 // [[nodiscard]] constexpr auto contigAxis() const -> uint32_t { // return data & 0xff; // } @@ -451,41 +470,37 @@ class LoopTreeCostFn { constexpr auto operator()(alloc::Arena<> alloc, const AbstractVector auto &x) const { using T = utils::eltype_t; + utils::invariant(max_depth < 16); math::MutArray> invunrolls{ math::matrix(alloc, math::Row<2>{}, math::Col<>{max_depth})}; ptrdiff_t i = 0, depth = 0, mi = 0, ci = 0, li = 0; - double tc = 1; + double trip_counts[16]; + trip_counts[0] = 1; // we evaluate every iteration - bool exiting = false; T c{}; - for (auto [trip_count, memory, exit, compute] : cost_counts) { - T ic{}; - if (!exit) { - // we're in a header - invunrolls[1, depth] = x[i++]; - invunrolls[0, depth] = 1 / invunrolls[1, depth]; - ++depth; - tc *= trip_count; - } - T mc{memcosts(invunrolls, vf, orth_axes[_(0, memory) + mi])}; + for (auto [comptimetrip, trip_count, memory, exit, compute] : cost_counts) { + invunrolls[1, depth] = x[i++]; + invunrolls[0, depth] = 1 / invunrolls[1, depth]; + trip_counts[depth + 1] = trip_counts[depth] * trip_count; + T ic{memcosts(invunrolls, vf, orth_axes[_(0, memory) + mi])}; mi += memory; T cc{compcosts(invunrolls, compute_independence[_(0, compute) + ci])}; ci += compute; if (exit) { - if (exiting) { - } else { - auto [reguse, lreduct] = leafs[li++]; - // we're now in a leaf, meaning we must consider register costs, - // as well as reduction costs and latency of reduction chains. - auto [lrtp, ll] = calcLeafCosts(invunrolls[_, depth]) * lreduct; - ic += registerPressure(invunrolls, reguse); - } - --depth; - tc /= trip_count; + auto [reguse, lreduct] = leafs[li++]; + // we're now in a leaf, meaning we must consider register costs, + // as well as reduction costs and latency of reduction chains. + // TODO: 1. define/get `l` for latency below + // 2. add extra latency and compute cost for reductions. + cc = smax(cc, l / invunrolls[depth]); + auto [lrtp, ll] = calcLeafCosts(invunrolls[_, depth]) * lreduct; + ic += registerPressure(invunrolls, reguse); } - exiting = exit; - // TODO: memcost + smax(cthroughput, clatency); - c += tc * ic; + c += trip_counts[++depth] * (ic + cc); + // We increment depth to represent the loop header. + // It was left unincremented for indexing into `invunrolls`. + // Now we decrement for the number of loops we are exiting. + depth -= exit; } return c; } From 03757a11fccba3d73047ab1309ad715364b6ebf9 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Sat, 28 Oct 2023 00:46:54 -0400 Subject: [PATCH 051/112] Fix some typos as well as missed updates in DependencyPolyhedra --- Doxyfile | 2 +- include/IR/Cache.hpp | 2 +- include/IR/CostModeling.hpp | 4 +- include/IR/Node.hpp | 4 +- include/LinearProgramming/LoopBlock.hpp | 2 +- include/Polyhedra/DependencyPolyhedra.hpp | 75 +++++++++++------------ include/Polyhedra/Polyhedra.hpp | 7 +-- include/TurboLoop.hpp | 2 +- test/TestUtilities.hpp | 4 +- test/compat_test.cpp | 2 +- test/dependence_test.cpp | 2 +- 11 files changed, 51 insertions(+), 55 deletions(-) diff --git a/Doxyfile b/Doxyfile index cbabce903..709946500 100644 --- a/Doxyfile +++ b/Doxyfile @@ -86,7 +86,7 @@ CREATE_SUBDIRS = NO # level increment doubles the number of directories, resulting in 4096 # directories at level 8 which is the default and also the maximum value. The # sub-directories are organized in 2 levels, the first level always has a fixed -# numer of 16 directories. +# number of 16 directories. # Minimum value: 0, maximum value: 8, default value: 8. # This tag requires that the tag CREATE_SUBDIRS is set to YES. diff --git a/include/IR/Cache.hpp b/include/IR/Cache.hpp index fc51ffca1..508db3f6e 100644 --- a/include/IR/Cache.hpp +++ b/include/IR/Cache.hpp @@ -399,7 +399,7 @@ class Cache { /// try to remove `I` as a duplicate /// this travels downstream; /// if `I` is eliminated, all users of `I` - /// get updated, making them CSE-candiates. + /// get updated, making them CSE-candidates. /// In this manner, we travel downstream through users. // NOLINTNEXTLINE(misc-no-recursion) auto cse(Compute *I) -> Compute * { diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index 8f134d4de..4b4fc2309 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -310,8 +310,8 @@ inline auto visitLoopDependent(IR::Dependencies deps, IR::Loop *L, IR::Node *N, // Each level of our graph is acyclic, meaning that there are no cycles at // that level when traversing only edges active at that given level. // However, when considering edges active at level `I`, we may have cycles - // at level `J` if `J>I`. In otherwords, here we are travering all edges - // active at `I=depth`. Within subloops, which necessarilly have depth + // at level `J` if `J>I`. In otherwords, here we are traversing all edges + // active at `I=depth`. Within subloops, which necessarily have depth // `J>I`, we may have cycles. // // Thus, we need to prevent getting stuck in a cycle for these deeper loops diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index 407599eae..12586e3b6 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -110,7 +110,7 @@ class Node { // but only load to inherit 'hasUsers' and only store to inherit the operand. // `Inst` would also inherit 'hasUsers', but would want a different operands // type. - // Addr has a FAM, so multiple inheritence isn't an option for `Load`/`Stow`, + // Addr has a FAM, so multiple inheritance isn't an option for `Load`/`Stow`, // and we want a common base that we can query to avoid monomorphization. protected: const ValKind kind; @@ -344,7 +344,7 @@ class Loop : public Node { } /// getLast() /// Get the last node in the loop. - /// Useful for iterating backwardss. + /// Useful for iterating backwards. [[nodiscard]] constexpr auto getLast() const -> Node * { return last; } constexpr void setLast(Node *n) { last = n; } [[nodiscard]] constexpr auto getLLVMLoop() const -> llvm::Loop * { diff --git a/include/LinearProgramming/LoopBlock.hpp b/include/LinearProgramming/LoopBlock.hpp index 56068d05e..01c2324c9 100644 --- a/include/LinearProgramming/LoopBlock.hpp +++ b/include/LinearProgramming/LoopBlock.hpp @@ -480,7 +480,7 @@ class LoopBlock { continue; ptrdiff_t r = math::NormalForm::rank(indMat); if (r == edge.getInCurrentDepth()) continue; - // TODO handle linearly dependent acceses, filtering them out + // TODO handle linearly dependent accesses, filtering them out if (r != ptrdiff_t(indMat.numRow())) continue; node->schedulePhi(indMat, r); tryOrth = true; diff --git a/include/Polyhedra/DependencyPolyhedra.hpp b/include/Polyhedra/DependencyPolyhedra.hpp index df7de7a1e..571390327 100644 --- a/include/Polyhedra/DependencyPolyhedra.hpp +++ b/include/Polyhedra/DependencyPolyhedra.hpp @@ -4,13 +4,13 @@ #include "Polyhedra/Loops.hpp" #include "Polyhedra/Polyhedra.hpp" #include "Support/OStream.hpp" +#include #include #include #include #include #include #include -#include #include #include #include @@ -28,14 +28,14 @@ namespace poly::poly { /// prints in current permutation order. /// TODO: decide if we want to make poly::Loop a `SymbolicPolyhedra` /// in which case, we have to remove `currentToOriginalPerm`, -/// which menas either change printing, or move prints `<<` into +/// which means either change printing, or move prints `<<` into /// the derived classes. inline auto printConstraints(std::ostream &os, DensePtrMatrix A, llvm::ArrayRef syms, bool inequality = true) -> std::ostream & { const Row numConstraints = A.numRow(); const unsigned numSyms = syms.size() + 1; - for (Row c = 0; c < numConstraints; ++c) { + for (ptrdiff_t c = 0; c < numConstraints; ++c) { printConstraint(os, A[c, _], numSyms, inequality); for (ptrdiff_t v = 1; v < numSyms; ++v) { if (int64_t Acv = A[c, v]) { @@ -179,12 +179,12 @@ class DepPoly : public BasePolyhedra { constexpr void decrementNumConstraints() { invariant(numCon-- > 0); } constexpr auto getA() -> MutDensePtrMatrix { void *p = memory; - return {(int64_t *)p, math::DenseDims{numCon, getNumVar() + 1}}; + return {(int64_t *)p, math::DenseDims<>{numCon, getNumVar() + 1}}; } constexpr auto getE() -> MutDensePtrMatrix { void *p = memory; return {(int64_t *)p + size_t(conCapacity) * (getNumVar() + 1), - math::DenseDims{numEqCon, getNumVar() + 1}}; + math::DenseDims<>{numEqCon, getNumVar() + 1}}; } constexpr auto getNullStep() -> math::MutPtrVector { void *p = memory; @@ -209,28 +209,28 @@ class DepPoly : public BasePolyhedra { [[nodiscard]] auto getA() const -> DensePtrMatrix { const char *p = memory; return {const_cast(reinterpret_cast(p)), - math::DenseDims{numCon, getNumVar() + 1}}; + math::DenseDims<>{numCon, getNumVar() + 1}}; } - [[nodiscard]] auto getA(Row r, Col c) -> int64_t & { + [[nodiscard]] auto getA(Row<> r, Col<> c) -> int64_t & { auto *p = reinterpret_cast(memory); - return p[size_t(r) * (getNumVar() + 1) + size_t(c)]; + return p[ptrdiff_t(r) * (getNumVar() + 1) + ptrdiff_t(c)]; } - [[nodiscard]] auto getA(Row r, Col c) const -> int64_t { + [[nodiscard]] auto getA(Row<> r, Col<> c) const -> int64_t { const auto *p = reinterpret_cast(memory); - return p[size_t(r) * (getNumVar() + 1) + size_t(c)]; + return p[ptrdiff_t(r) * (getNumVar() + 1) + ptrdiff_t(c)]; } [[nodiscard]] auto getE() const -> DensePtrMatrix { const auto *p = reinterpret_cast(memory); return {const_cast(p + size_t(conCapacity) * (getNumVar() + 1)), - math::DenseDims{numEqCon, getNumVar() + 1}}; + math::DenseDims<>{numEqCon, getNumVar() + 1}}; } - [[nodiscard]] auto getE(Row r, Col c) -> int64_t & { + [[nodiscard]] auto getE(Row<> r, Col<> c) -> int64_t & { auto *p = reinterpret_cast(memory); - return p[(conCapacity + size_t(r)) * (getNumVar() + 1) + size_t(c)]; + return p[(conCapacity + ptrdiff_t(r)) * (getNumVar() + 1) + ptrdiff_t(c)]; } - [[nodiscard]] auto getE(Row r, Col c) const -> int64_t { + [[nodiscard]] auto getE(Row<> r, Col<> c) const -> int64_t { const auto *p = reinterpret_cast(memory); - return p[(conCapacity + size_t(r)) * (getNumVar() + 1) + size_t(c)]; + return p[(conCapacity + ptrdiff_t(r)) * (getNumVar() + 1) + ptrdiff_t(c)]; } [[nodiscard]] auto getNullStep() const -> PtrVector { const auto *p = reinterpret_cast(memory); @@ -275,7 +275,8 @@ class DepPoly : public BasePolyhedra { unsigned numLoopsCommon = findFirstNonEqual(x->getFusionOmega(), y->getFusionOmega()), xDim = x->getArrayDim(), yDim = y->getArrayDim(); - math::DenseMatrix A(math::DenseDims{numLoopsCommon, xDim + yDim}); + math::DenseMatrix A( + math::DenseDims<>{numLoopsCommon, xDim + yDim}); if (!numLoopsCommon) return A; // indMats cols are [outerMostLoop,...,innerMostLoop] PtrMatrix indMatX = x->indexMatrix(), indMatY = y->indexMatrix(); @@ -288,11 +289,10 @@ class DepPoly : public BasePolyhedra { // returns rank x num loops return orthogonalNullSpace(std::move(A)); } - static auto nullSpace(Valid x) - -> math::DenseMatrix { + static auto nullSpace(Valid x) -> math::DenseMatrix { unsigned numLoopsCommon = x->getCurrentDepth(), dim = x->getArrayDim(), natDepth = x->getNaturalDepth(); - math::DenseMatrix A(math::DenseDims{numLoopsCommon, dim}); + math::DenseMatrix A(math::DenseDims<>{numLoopsCommon, dim}); if (!numLoopsCommon) return A; // indMats cols are [outerMostLoop,...,innerMostLoop] A[_(0, natDepth), _] << x->indexMatrix().transpose(); @@ -368,10 +368,10 @@ class DepPoly : public BasePolyhedra { invariant(ptrdiff_t(map.size()), ptrdiff_t(Sy.size())); unsigned numSym = numDynSym + 1; math::DenseMatrix NS{nullSpace(aix, aiy)}; - unsigned timeDim = unsigned{NS.numRow()}, - numCols = numVar + timeDim + numDynSym + 1, - conCapacity = unsigned(Ax.numRow() + Ay.numRow()) + numVar, - eqConCapacity = unsigned(Cx.numRow()) + timeDim; + ptrdiff_t timeDim = ptrdiff_t{NS.numRow()}, + numCols = numVar + timeDim + numDynSym + 1, + conCapacity = ptrdiff_t(Ax.numRow() + Ay.numRow()) + numVar, + eqConCapacity = ptrdiff_t(Cx.numRow()) + timeDim; size_t memNeeded = sizeof(int64_t) * ((conCapacity + eqConCapacity) * numCols + timeDim) + @@ -383,7 +383,7 @@ class DepPoly : public BasePolyhedra { timeDim, conCapacity, eqConCapacity); // numDep1Var = nv1; - Row nc = nc0 + nc1; + ptrdiff_t nc = nc0 + nc1; unsigned indexDim{aix->getArrayDim()}; auto nullStep{dp->getNullStep()}; for (ptrdiff_t i = 0; i < timeDim; ++i) nullStep[i] = selfDot(NS[i, _]); @@ -418,7 +418,7 @@ class DepPoly : public BasePolyhedra { E[i, _(0, Ox.numCol())] << Ox[i, _]; E[i, _(0, Cx.numCol()) + numSym] << Cx[i, _]; E[i, 0] -= Oy[i, 0]; - for (ptrdiff_t j = 0; j < Oy.numCol() - 1; ++j) + for (ptrdiff_t j = 0, J = ptrdiff_t(Oy.numCol()) - 1; j < J; ++j) E[i, 1 + map[j]] -= Oy[i, 1 + j]; E[i, _(0, Cy.numCol()) + numSym + numDep0Var] << -Cy[i, _]; } @@ -436,8 +436,7 @@ class DepPoly : public BasePolyhedra { return nullptr; } // self dependence - static auto self(Arena<> *alloc, Valid ai) - -> Valid { + static auto self(Arena<> *alloc, Valid ai) -> Valid { Valid loop = ai->getAffLoop(); unsigned numDepVar = ai->getCurrentDepth(), numVar = numDepVar + numDepVar; PtrMatrix B{loop->getOuterA(numDepVar)}; @@ -447,11 +446,11 @@ class DepPoly : public BasePolyhedra { auto [nco, nv] = B.size(); math::DenseMatrix NS{nullSpace(ai)}; - unsigned numDynSym = S.size(), numSym = numDynSym + 1, - timeDim = unsigned{NS.numRow()}, - numCols = numVar + timeDim + numDynSym + 1, - conCapacity = unsigned(2 * B.numRow()) + numVar, - eqConCapacity = unsigned(C.numRow()) + timeDim; + ptrdiff_t numDynSym = ptrdiff_t(S.size()), numSym = numDynSym + 1, + timeDim = ptrdiff_t{NS.numRow()}, + numCols = numVar + timeDim + numDynSym + 1, + conCapacity = 2 * ptrdiff_t(B.numRow()) + numVar, + eqConCapacity = ptrdiff_t(C.numRow()) + timeDim; size_t memNeeded = sizeof(int64_t) * ((conCapacity + eqConCapacity) * numCols + timeDim) + @@ -462,7 +461,7 @@ class DepPoly : public BasePolyhedra { conCapacity, eqConCapacity); // numDep1Var = nv1; - Row nc = nco + nco; + ptrdiff_t nc = nco + nco; unsigned indexDim{ai->getArrayDim()}; auto nullStep{dp->getNullStep()}; for (ptrdiff_t i = 0; i < timeDim; ++i) nullStep[i] = selfDot(NS[i, _]); @@ -640,8 +639,8 @@ class DepPoly : public BasePolyhedra { Row numPhi = xPhi.numRow(); invariant(yPhi.numRow(), numPhi); DensePtrMatrix E{getE()}; - unsigned xNumLoops = unsigned(xPhi.numCol()), - yNumLoops = unsigned(yPhi.numCol()); + ptrdiff_t xNumLoops = ptrdiff_t(xPhi.numCol()), + yNumLoops = ptrdiff_t(yPhi.numCol()); if ((numDep0Var == xNumLoops) || allZero(xPhi[_, _(numDep0Var, end)])) xNumLoops = numDep0Var; else invariant(numDep0Var < xNumLoops); @@ -651,7 +650,7 @@ class DepPoly : public BasePolyhedra { unsigned numSym = getNumSymbols(), numSymX = numSym + xNumLoops, numSymD0 = numSym + numDep0Var, nCol = numSymX + yNumLoops; MutDensePtrMatrix B{ - matrix(&alloc, numEqCon + numPhi, nCol)}; + matrix(&alloc, numEqCon + ptrdiff_t(numPhi), nCol)}; bool extend = (numDep0Var != xNumLoops) || (numDep1Var != yNumLoops); // we truncate time dim if (extend || timeDim) { @@ -661,7 +660,7 @@ class DepPoly : public BasePolyhedra { B[r, _(0, numDep1Var) + numSymX] << E[r, _(0, numDep1Var) + numSymD0]; B[r, _(numDep1Var, yNumLoops) + numSymX] << 0; } - } else std::copy_n(E.begin(), E.numRow() * E.numCol(), B.begin()); + } else std::copy_n(E.begin(), E.numRow() *E.numCol(), B.begin()); if (xOff) for (ptrdiff_t c = 0; c < numDep0Var; ++c) if (int64_t mlt = xOff[c]) @@ -675,7 +674,7 @@ class DepPoly : public BasePolyhedra { B[r + numEqCon, _(0, xNumLoops) + numSym] << xPhi[r, _(0, xNumLoops)]; B[r + numEqCon, _(0, yNumLoops) + numSymX] << -yPhi[r, _(0, yNumLoops)]; } - unsigned rank = unsigned(math::NormalForm::simplifySystemImpl(B)); + unsigned rank = ptrdiff_t(math::NormalForm::simplifySystemImpl(B)); if (rank <= numEqCon) return false; unsigned numConstraints = extend ? (xLoop->getNumCon() + xNumLoops + yLoop->getNumCon() + yNumLoops) diff --git a/include/Polyhedra/Polyhedra.hpp b/include/Polyhedra/Polyhedra.hpp index f4f56a110..6c440c838 100644 --- a/include/Polyhedra/Polyhedra.hpp +++ b/include/Polyhedra/Polyhedra.hpp @@ -8,12 +8,9 @@ #include #include #include -#include #include #include -#include #include -#include #ifndef NDEBUG #include #endif @@ -147,8 +144,8 @@ struct BasePolyhedra { const ptrdiff_t dyn = getNumDynamic(); if constexpr (HasEqualities) { auto [ar, er] = removeRedundantRows(getA(), getE()); - setNumConstraints(unsigned(ar)); - setNumEqConstraints(unsigned(er)); + setNumConstraints(ptrdiff_t(ar)); + setNumEqConstraints(ptrdiff_t(er)); for (ptrdiff_t i = 0; i < getNumEqualityConstraints(); ++i) { auto l = gcd(getE()[i, _]); if (l != 1) getE()[i, _] /= l; diff --git a/include/TurboLoop.hpp b/include/TurboLoop.hpp index e7832ef55..8aee09f12 100644 --- a/include/TurboLoop.hpp +++ b/include/TurboLoop.hpp @@ -250,7 +250,7 @@ class TurboLoop { /// large nest. /// /// If any of the subloops fail, or we fail to draw the connection, then we - /// can optimize the continuous succesful block we've produced, and return a + /// can optimize the continuous successful block we've produced, and return a /// failure up the tree. /// /// diff --git a/test/TestUtilities.hpp b/test/TestUtilities.hpp index 05a66f2ec..b52ca71f4 100644 --- a/test/TestUtilities.hpp +++ b/test/TestUtilities.hpp @@ -32,7 +32,7 @@ class TestLoopFunction { llvm::Function *F; llvm::DataLayout dl; llvm::TargetTransformInfo TTI; - llvm::Triple targetTripple{}; + llvm::Triple targetTriple{}; llvm::TargetLibraryInfo TLI; llvm::AssumptionCache AC; llvm::ScalarEvolution SE; @@ -92,7 +92,7 @@ class TestLoopFunction { llvm::SmallVector(), false)}, F{llvm::Function::Create( FT, llvm::GlobalValue::LinkageTypes::ExternalLinkage, "foo", mod)}, - dl{mod}, TTI{dl}, TLI{llvm::TargetLibraryInfoImpl{targetTripple}, F}, + dl{mod}, TTI{dl}, TLI{llvm::TargetLibraryInfoImpl{targetTriple}, F}, AC{*F, &TTI}, SE{*F, TLI, AC, DT, LI}, BB{llvm::BasicBlock::Create(ctx, "entry", F)}, builder{llvm::IRBuilder(BB)} { diff --git a/test/compat_test.cpp b/test/compat_test.cpp index 96895f969..b3b1813d3 100644 --- a/test/compat_test.cpp +++ b/test/compat_test.cpp @@ -95,7 +95,7 @@ TEST(LessTrivialPruneBounds, BasicAssertions) { poly::Loop &aff = *tlf.getLoopNest(0); aff.pruneBounds(); - llvm::errs() << "LessTrival test Bounds pruned:\n"; + llvm::errs() << "LessTrivial test Bounds pruned:\n"; #ifndef NDEBUG aff.dump(); #endif diff --git a/test/dependence_test.cpp b/test/dependence_test.cpp index 745310fd9..b8de45810 100644 --- a/test/dependence_test.cpp +++ b/test/dependence_test.cpp @@ -1446,7 +1446,7 @@ TEST(DoubleDependenceTest, BasicAssertions) { EXPECT_TRUE(loopBlock.optimize().has_value()); EXPECT_EQ(loopBlock.numEdges(), 2); map memAccessIds; - for (size_t jj = 0; jj < loopBlock.numIR::Addres(); ++jj) + for (size_t jj = 0; jj < loopBlock.numIR::Address(); ++jj) memAccessIds[loopBlock.getIR::Addr(jj)] = jj; for (auto &e : loopBlock.getEdges()) { auto [in, out] = e.getInOutPair(); From 1d0e3ac1b93aa91956cc77b7a6cae01ddcaf6a67 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Sat, 28 Oct 2023 02:00:26 -0400 Subject: [PATCH 052/112] minor progress --- include/IR/CostFunction.hpp | 44 ++++++++++++----------- include/IR/CostModeling.hpp | 2 +- include/IR/Node.hpp | 2 +- include/Polyhedra/DependencyPolyhedra.hpp | 2 +- 4 files changed, 27 insertions(+), 23 deletions(-) diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp index b1d1558e7..7b5411554 100644 --- a/include/IR/CostFunction.hpp +++ b/include/IR/CostFunction.hpp @@ -10,6 +10,7 @@ #include #include namespace poly::CostModeling { +using containers::Pair; using math::AbstractVector, math::AbstractMatrix, math::DensePtrMatrix, math::_; using utils::Optional; @@ -196,8 +197,6 @@ constexpr auto cost(const AbstractMatrix auto &invunrolls, OrthogonalAxes orth, return c * cost(mc, invunrolls, vfi, orth); } -constexpr auto calcLeafCosts(const AbstractMatrix auto &invunrolls); - // We need to define an unroll ordering. struct RegisterUseByUnroll { math::PtrVector> masks; // coef, mask pairs @@ -226,9 +225,8 @@ constexpr auto registerPressure(const AbstractMatrix auto &invunrolls, return 0.25 * math::softplus(8.0 * (acc - r.register_count)); } -auto memcosts( - const AbstractMatrix auto &invunrolls, VectorizationFactor vf, - math::PtrVector> orth_axes) { +auto memcosts(const AbstractMatrix auto &invunrolls, VectorizationFactor vf, + math::PtrVector> orth_axes) { utils::eltype_t ic{}; for (auto [oa, mc] : orth_axes) ic += cost(invunrolls, oa, vf, mc); return ic; @@ -454,9 +452,9 @@ auto compcosts(const AbstractMatrix auto &invunrolls, /// /// class LoopTreeCostFn { math::PtrVector cost_counts; - math::PtrVector> orth_axes; + math::PtrVector> orth_axes; math::PtrVector> compute_independence; - math::PtrVector> leafs; + math::PtrVector>> leafs; VectorizationFactor vf; ptrdiff_t max_depth; @@ -474,33 +472,39 @@ class LoopTreeCostFn { math::MutArray> invunrolls{ math::matrix(alloc, math::Row<2>{}, math::Col<>{max_depth})}; ptrdiff_t i = 0, depth = 0, mi = 0, ci = 0, li = 0; - double trip_counts[16]; - trip_counts[0] = 1; + double tripcounts[16]; // we evaluate every iteration T c{}; for (auto [comptimetrip, trip_count, memory, exit, compute] : cost_counts) { invunrolls[1, depth] = x[i++]; invunrolls[0, depth] = 1 / invunrolls[1, depth]; - trip_counts[depth + 1] = trip_counts[depth] * trip_count; - T ic{memcosts(invunrolls, vf, orth_axes[_(0, memory) + mi])}; - mi += memory; + tripcounts[depth] = + (depth ? tripcounts[depth - 1] * trip_count : trip_count); T cc{compcosts(invunrolls, compute_independence[_(0, compute) + ci])}; ci += compute; if (exit) { - auto [reguse, lreduct] = leafs[li++]; + auto [reguse, lt] = leafs[li++]; + auto [l, numreduct] = lt; // we're now in a leaf, meaning we must consider register costs, // as well as reduction costs and latency of reduction chains. // TODO: 1. define/get `l` for latency below // 2. add extra latency and compute cost for reductions. + // auto [l, t] = compute_independence[ci++]; cc = smax(cc, l / invunrolls[depth]); - auto [lrtp, ll] = calcLeafCosts(invunrolls[_, depth]) * lreduct; - ic += registerPressure(invunrolls, reguse); + cc += registerPressure(invunrolls, reguse); + if (numreduct) { + cc += + compcost(invunrolls, compute_independence[_(0, numreduct) + ci]) * + log2(invunrolls[1, depth]) / tripcounts[depth]; + ci += numreduct; + } } - c += trip_counts[++depth] * (ic + cc); - // We increment depth to represent the loop header. - // It was left unincremented for indexing into `invunrolls`. - // Now we decrement for the number of loops we are exiting. - depth -= exit; + cc += memcosts(invunrolls, vf, orth_axes[_(0, memory) + mi]); + mi += memory; + c += tripcounts[depth] * cc; + // Decrement depth by `exit - 1`; the `-1` corresponds + // to descending into this header, while we exit `exit` loops afterwards. + depth -= exit - 1; } return c; } diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index 4b4fc2309..de7c11628 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -245,7 +245,7 @@ struct LoopIndependent { // searches `N` and it's users for loop-independent users // this exits early if it finds a dependent user; we search everything -// anyway, so we'll revist later anyway. +// anyway, so we'll revisit later anyway. // We return a `IR::Node *, bool` pair, where the `bool` is true if // `N` was loop independent. // We do this rather than something like returning a `nullptr`, as diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index 12586e3b6..11621a43d 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -102,7 +102,7 @@ class Node { }; // we have a private pointer so different types can share - // in manner not exacctly congruent with type hiearchy + // in manner not exacctly congruent with type hierarchy // in particular, `Inst` and `Load` want `User` lists // while `Stow`s do not. // `Addr` is the common load/store subtype diff --git a/include/Polyhedra/DependencyPolyhedra.hpp b/include/Polyhedra/DependencyPolyhedra.hpp index 571390327..92e920487 100644 --- a/include/Polyhedra/DependencyPolyhedra.hpp +++ b/include/Polyhedra/DependencyPolyhedra.hpp @@ -660,7 +660,7 @@ class DepPoly : public BasePolyhedra { B[r, _(0, numDep1Var) + numSymX] << E[r, _(0, numDep1Var) + numSymD0]; B[r, _(numDep1Var, yNumLoops) + numSymX] << 0; } - } else std::copy_n(E.begin(), E.numRow() *E.numCol(), B.begin()); + } else std::copy_n(E.begin(), E.numRow() * E.numCol(), B.begin()); if (xOff) for (ptrdiff_t c = 0; c < numDep0Var; ++c) if (int64_t mlt = xOff[c]) From b1754903722ede38305646ac211893be96feca06 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Sat, 28 Oct 2023 02:46:10 -0400 Subject: [PATCH 053/112] add indexed cost --- include/IR/CostFunction.hpp | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp index 7b5411554..4918b8b36 100644 --- a/include/IR/CostFunction.hpp +++ b/include/IR/CostFunction.hpp @@ -42,7 +42,8 @@ struct LoopCostCounts { uint16_t known_trip : 1; uint16_t trip_count : 15; /// we're unlikely to make different decisions for >32k - uint16_t memory; + uint16_t omemory : 11; + uint16_t cmemory : 5; uint16_t exit : 5; /// how many blocks we exit after this uint16_t compute : 11; }; @@ -228,7 +229,16 @@ constexpr auto registerPressure(const AbstractMatrix auto &invunrolls, auto memcosts(const AbstractMatrix auto &invunrolls, VectorizationFactor vf, math::PtrVector> orth_axes) { utils::eltype_t ic{}; - for (auto [oa, mc] : orth_axes) ic += cost(invunrolls, oa, vf, mc); + for (auto [oa, mc] : orth_axes) ic += cost(invunrolls, oa, mc, vf); + return ic; +} +auto memcosts(const AbstractMatrix auto &invunrolls, VectorizationFactor vf, + math::PtrVector>> + orth_axes) { + utils::eltype_t ic{}; + for (auto [oa, mc, inds] : orth_axes) + ic += cost(invunrolls, oa, mc, vf, inds); return ic; } auto compcosts(const AbstractMatrix auto &invunrolls, @@ -453,6 +463,9 @@ auto compcosts(const AbstractMatrix auto &invunrolls, class LoopTreeCostFn { math::PtrVector cost_counts; math::PtrVector> orth_axes; + math::PtrVector< + std::tuple>> + conv_axes; math::PtrVector> compute_independence; math::PtrVector>> leafs; VectorizationFactor vf; @@ -471,11 +484,12 @@ class LoopTreeCostFn { utils::invariant(max_depth < 16); math::MutArray> invunrolls{ math::matrix(alloc, math::Row<2>{}, math::Col<>{max_depth})}; - ptrdiff_t i = 0, depth = 0, mi = 0, ci = 0, li = 0; + ptrdiff_t i = 0, depth = 0, mi = 0, mc = 0, ci = 0, li = 0; double tripcounts[16]; // we evaluate every iteration T c{}; - for (auto [comptimetrip, trip_count, memory, exit, compute] : cost_counts) { + for (auto [comptimetrip, trip_count, omem, cmem, exit, compute] : + cost_counts) { invunrolls[1, depth] = x[i++]; invunrolls[0, depth] = 1 / invunrolls[1, depth]; tripcounts[depth] = @@ -495,12 +509,14 @@ class LoopTreeCostFn { if (numreduct) { cc += compcost(invunrolls, compute_independence[_(0, numreduct) + ci]) * - log2(invunrolls[1, depth]) / tripcounts[depth]; + log2(invunrolls[1, depth]) / trip_count; ci += numreduct; } } - cc += memcosts(invunrolls, vf, orth_axes[_(0, memory) + mi]); - mi += memory; + cc += memcosts(invunrolls, vf, orth_axes[_(0, omem) + mi]); + mi += omem; + cc += memcosts(invunrolls, vf, conv_axes[_(0, cmem) + mc]); + mc += cmem; c += tripcounts[depth] * cc; // Decrement depth by `exit - 1`; the `-1` corresponds // to descending into this header, while we exit `exit` loops afterwards. From 05ad3ed1a4ac11a95cc57360606aec5d1f358ffa Mon Sep 17 00:00:00 2001 From: chriselrod Date: Sun, 29 Oct 2023 21:18:21 -0400 Subject: [PATCH 054/112] minor progress --- CMakeLists.txt | 2 +- include/IR/CostFunction.hpp | 37 ++++++++++++++++++------------------- include/IR/CostModeling.hpp | 8 ++++---- include/IR/Node.hpp | 12 +++++------- 4 files changed, 28 insertions(+), 31 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ecacd1716..663dacf44 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -186,5 +186,5 @@ packageProject( INCLUDE_DESTINATION include/${PROJECT_NAME}-${PROJECT_VERSION} VERSION_HEADER "${VERSION_HEADER_LOCATION}" COMPATIBILITY SameMinorVersion - DEPENDENCIES "LLVM 15.0.6" + DEPENDENCIES "LLVM 17.0.1" ) diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp index 4918b8b36..cc36faa45 100644 --- a/include/IR/CostFunction.hpp +++ b/include/IR/CostFunction.hpp @@ -1,6 +1,7 @@ #pragma once #include "Containers/Pair.hpp" +#include "IR/Node.hpp" #include "Math/Constructors.hpp" #include #include @@ -40,8 +41,7 @@ using utils::Optional; /// thus we only need headers and num-pops. struct LoopCostCounts { uint16_t known_trip : 1; - uint16_t - trip_count : 15; /// we're unlikely to make different decisions for >32k + uint16_t trip_count : 15; uint16_t omemory : 11; uint16_t cmemory : 5; uint16_t exit : 5; /// how many blocks we exit after this @@ -52,8 +52,8 @@ static_assert(sizeof(LoopCostCounts) == 6); /// Order is outermost -> innermost /// Costs are relative to Scalar, i.e. scalar == 1 struct MemoryCosts { - uint32_t contiguous; // vload/vstore - uint32_t discontiguous; // gather/scatter + double contiguous; // vload/vstore + double discontiguous; // gather/scatter }; struct VectorizationFactor { uint32_t l2factor; @@ -69,6 +69,7 @@ struct VectorizationFactor { /// Another option is to store individual `MemoryCosts`, /// so that we can aggregate/sum up. struct OrthogonalAxes { + MemoryCosts memcost; uint32_t contig : 8; // max number of array dims of 255 uint32_t indep : 24; // max loop depth of 24 // [[nodiscard]] constexpr auto contigAxis() const -> uint32_t { @@ -106,16 +107,16 @@ constexpr auto cost(const AbstractMatrix auto &invunrolls, uint32_t indepAxes) // memory costs, unnormalized by `prod(unrolls)` // `invunrolls` is a matrix, row-0 are the inverse unrolls, row-1 unrolls. constexpr auto cost(const AbstractMatrix auto &invunrolls, OrthogonalAxes orth, - MemoryCosts mc, VectorizationFactor vfi) + VectorizationFactor vfi) -> utils::eltype_t { utils::eltype_t c{cost(invunrolls, orth.indep)}; if ((vfi.index < 32) && !(orth.indep & (1 << vfi.index))) { // depends vectorized index if (vfi.index == orth.contig) { - c *= mc.contiguous; + c *= orth.memcost.contiguous; } else if (orth.contig >= 32) { - c *= mc.discontiguous; + c *= orth.memcost.discontiguous; } else { // Discontiguous vector load. // We consider two alternatives: @@ -135,8 +136,9 @@ constexpr auto cost(const AbstractMatrix auto &invunrolls, OrthogonalAxes orth, u{invunrolls[1, orth.contig]}, mr{math::smax((1 << vfi.l2factor) * iu, 1)}; utils::invariant(iu == 1 / u); - c *= math::smin(mc.contiguous * mr + u * (vfi.l2factor + log2(mr)), - mc.discontiguous); + c *= + math::smin(orth.memcost.contiguous * mr + u * (vfi.l2factor + log2(mr)), + orth.memcost.discontiguous); } } return c; @@ -149,8 +151,7 @@ constexpr auto cost(const AbstractMatrix auto &invunrolls, OrthogonalAxes orth, /// For these, we use the incorrect formula: /// constexpr auto cost(const AbstractMatrix auto &invunrolls, OrthogonalAxes orth, - MemoryCosts mc, VectorizationFactor vfi, - DensePtrMatrix inds) + VectorizationFactor vfi, DensePtrMatrix inds) -> utils::eltype_t { utils::eltype_t c{1}; auto [arrayDim, numLoops] = inds.size(); @@ -195,7 +196,7 @@ constexpr auto cost(const AbstractMatrix auto &invunrolls, OrthogonalAxes orth, } // c is a scaling factor; now we proceed to calculate cost similaly to the // orth-axis implementation above. - return c * cost(mc, invunrolls, vfi, orth); + return c * cost(invunrolls, vfi, orth); } // We need to define an unroll ordering. @@ -462,10 +463,8 @@ auto compcosts(const AbstractMatrix auto &invunrolls, /// /// class LoopTreeCostFn { math::PtrVector cost_counts; - math::PtrVector> orth_axes; - math::PtrVector< - std::tuple>> - conv_axes; + math::PtrVector orth_axes; + math::PtrVector>> conv_axes; math::PtrVector> compute_independence; math::PtrVector>> leafs; VectorizationFactor vf; @@ -501,9 +500,6 @@ class LoopTreeCostFn { auto [l, numreduct] = lt; // we're now in a leaf, meaning we must consider register costs, // as well as reduction costs and latency of reduction chains. - // TODO: 1. define/get `l` for latency below - // 2. add extra latency and compute cost for reductions. - // auto [l, t] = compute_independence[ci++]; cc = smax(cc, l / invunrolls[depth]); cc += registerPressure(invunrolls, reguse); if (numreduct) { @@ -524,6 +520,9 @@ class LoopTreeCostFn { } return c; } + LoopTreeCostFn(alloc::Arena<>* alloc, IR::Loop*root){ + + } }; } // namespace poly::CostModeling diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index de7c11628..6454b84f9 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -9,9 +9,9 @@ #include "LinearProgramming/LoopBlock.hpp" #include "LinearProgramming/ScheduledNode.hpp" #include "Polyhedra/Dependence.hpp" +#include #include #include -#include #include #include #include @@ -156,7 +156,7 @@ class CPURegisterFile { // pushBlock(trackInstr, chainBBs, pred, succ1); // } // } -template using Vec = math::ResizeableView; +template using Vec = math::ResizeableView; // TODO: instead of this, update in-place and ensure all Addr are // over-allocated to correspond with max depth? Because we parse in reverse @@ -244,8 +244,8 @@ struct LoopIndependent { // // searches `N` and it's users for loop-independent users -// this exits early if it finds a dependent user; we search everything -// anyway, so we'll revisit later anyway. +// this exits early if it finds a dependent user, becase we search everything +// meaning we'll revisit later anyway. // We return a `IR::Node *, bool` pair, where the `bool` is true if // `N` was loop independent. // We do this rather than something like returning a `nullptr`, as diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index 11621a43d..698ff1a4f 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -360,12 +360,11 @@ class Loop : public Node { } // get the outermost subloop of `this` to which `N` belongs [[nodiscard]] constexpr auto getSubloop(IR::Node *N) -> Loop * { - Loop *L = N->getLoop(); + Loop *L = N->getLoop(), *O; if (L == this) return this; - for (; L;) { - Loop *O = L->getOuterLoop(); + for (; L; L = O) { + O = L->getOuterLoop(); if (O == this) return L; - L = O; } return nullptr; } @@ -376,8 +375,7 @@ class Loop : public Node { // [ 2, -1, -1, -1, -1 ] // d = 0, edgeId = 2 // [ 2, -1, -1, -1, 0 ] // d = 4, edgeId = 0 // now edgeId = 4, and we can follow path 4->0->2 - deps[d] = edgeId; - edgeId = d; + deps[d] = std::exchange(edgeId, d); } constexpr auto getLoopAtDepth(uint8_t d) -> Loop * { Loop *L = this; @@ -502,7 +500,7 @@ class Instruction : public Value { [[nodiscard]] auto getIdentifier() const -> Identifier; inline void setOperands(Arena<> *alloc, math::PtrVector); }; -static_assert(std::is_copy_assignable_v); +static_assert(std::is_copy_assignable_v); /// CVal /// A constant value w/ respect to the loopnest. From a2f9c51a8df8ef2e4301c581ee8e7a8bb8d4fdce Mon Sep 17 00:00:00 2001 From: chriselrod Date: Mon, 30 Oct 2023 02:41:42 -0400 Subject: [PATCH 055/112] a few more updates --- include/LinearProgramming/LoopBlock.hpp | 61 ++++++++------- include/LinearProgramming/ScheduledNode.hpp | 4 +- include/Polyhedra/Dependence.hpp | 86 ++++++++++----------- include/Polyhedra/Schedule.hpp | 4 +- 4 files changed, 78 insertions(+), 77 deletions(-) diff --git a/include/LinearProgramming/LoopBlock.hpp b/include/LinearProgramming/LoopBlock.hpp index 01c2324c9..def450d78 100644 --- a/include/LinearProgramming/LoopBlock.hpp +++ b/include/LinearProgramming/LoopBlock.hpp @@ -321,7 +321,8 @@ class LoopBlock { auto p1 = allocator.checkpoint(); MutSquarePtrMatrix A = math::matrix(&allocator, nLoops + 1); - // BumpPtrVector> omegaOffsets{allocator}; + // BumpPtrVector> + // omegaOffsets{allocator}; // // we check all memory accesses in the node, to see if applying the same // omega offsets can zero dependence offsets. If so, we apply the shift. // we look for offsets, then try and validate that the shift @@ -509,10 +510,9 @@ class LoopBlock { if (d.isActive(depth)) params += numParams(d); return params; } - using BackupSchedule = - math::ResizeableView, - unsigned>; - using BackupSat = math::ResizeableView, unsigned>; + using BackupSchedule = math::ResizeableView< + containers::Pair, ptrdiff_t>; + using BackupSat = math::ResizeableView, ptrdiff_t>; using Backup = containers::Pair; static constexpr auto @@ -614,14 +614,15 @@ class LoopBlock { DenseMatrix nullSpace; // d x lfull DenseMatrix A{node->getPhi()[_(0, depth), _].transpose()}; math::NormalForm::nullSpace11(nullSpace, A); - invariant(unsigned(nullSpace.numRow()), node->getNumLoops() - depth); + invariant(ptrdiff_t(nullSpace.numRow()), + ptrdiff_t(node->getNumLoops()) - depth); // Now, we search index matrices for schedules not in the null space of // existing phi. This is because we're looking to orthogonalize a // memory access if possible, rather than setting a schedule // arbitrarily. // Here, we collect candidates for the next schedule DenseMatrix candidates{ - math::DenseDims{0, node->getNumLoops() + 1}}; + math::DenseDims<>{0, node->getNumLoops() + 1}}; Vector indv; indv.resizeForOverwrite(node->getNumLoops()); for (Addr *mem : node->localAddr()) { @@ -641,7 +642,7 @@ class LoopBlock { break; } if (!found) { - candidates.resize(candidates.numRow() + 1); + candidates.resize(++auto{candidates.numRow()}); assert((candidates[last, 0]) == 0); candidates[last, _(1, end)] << indv; } @@ -736,7 +737,7 @@ class LoopBlock { for (ScheduledNode *outNode : nodes->getVertices()) { for (Dependence edge : outNode->inputEdges(deps)) { if (edge.isInactive(depth)) continue; - Col uu = u + edge.getNumDynamicBoundingVar(); + ptrdiff_t uu = u + edge.getNumDynamicBoundingVar(); if ((sol[w++] != 0) || (anyNEZero(sol[_(u, uu)]))) { edge.setSatLevelLP(depth); result = Result::dependent(); @@ -935,9 +936,9 @@ class LoopBlock { // rows give constraints; each edge gets its own // numBounding = num u // numActiveEdges = num w - Row c = 0; - Col l = 1, o = 1 + numLambda + numSlack, p = o + numOmegaCoefs, - w = p + numPhiCoefs, u = w + numActiveEdges; + ptrdiff_t c = 0; + ptrdiff_t l = 1, o = 1 + numLambda + numSlack, p = o + numOmegaCoefs, + w = p + numPhiCoefs, u = w + numActiveEdges; for (ScheduledNode *inNode : nodes->getVertices()) { for (Dependence edge : inNode->outputEdges(deps, d)) { ScheduledNode *outNode = edge.output()->getNode(); @@ -950,20 +951,21 @@ class LoopBlock { bndO{edge.getBndOmegaCoefs()}, bndWU{edge.getBndCoefs()}; const ptrdiff_t numSatConstraints = satC.size(), numBndConstraints = bndC.size(); - const Col nPc = satPc.numCol(), nPp = satPp.numCol(); - invariant(nPc, bndPc.numCol()); - invariant(nPp, bndPp.numCol()); - Row cc = c + numSatConstraints; - Row ccc = cc + numBndConstraints; + const ptrdiff_t nPc = ptrdiff_t(satPc.numCol()), + nPp = ptrdiff_t(satPp.numCol()); + invariant(nPc, ptrdiff_t(bndPc.numCol())); + invariant(nPp, ptrdiff_t(bndPp.numCol())); + ptrdiff_t cc = c + numSatConstraints; + ptrdiff_t ccc = cc + numBndConstraints; - Col ll = l + satL.numCol(); - Col lll = ll + bndL.numCol(); + ptrdiff_t ll = l + ptrdiff_t(satL.numCol()); + ptrdiff_t lll = ll + ptrdiff_t(bndL.numCol()); C[_(c, cc), _(l, ll)] << satL; C[_(cc, ccc), _(ll, lll)] << bndL; l = lll; // bounding C[_(cc, ccc), w++] << bndWU[_, 0]; - Col uu = u + bndWU.numCol() - 1; + ptrdiff_t uu = u + ptrdiff_t(bndWU.numCol()) - 1; C[_(cc, ccc), _(u, uu)] << bndWU[_, _(1, end)]; u = uu; if (!satisfyDeps || !edge.stashedPreventsReordering(d)) @@ -1058,7 +1060,8 @@ class LoopBlock { static void updateConstraints(MutPtrMatrix C, const ScheduledNode *node, PtrMatrix sat, PtrMatrix bnd, - unsigned d, Row c, Row cc, Row ccc, Col p) { + unsigned d, ptrdiff_t c, ptrdiff_t cc, + ptrdiff_t ccc, ptrdiff_t p) { invariant(sat.numCol(), bnd.numCol()); if (node->phiIsScheduled(d)) { // add it constants @@ -1070,13 +1073,13 @@ class LoopBlock { } else { // add it to C auto po = node->getPhiOffset() + p; - C[_(c, cc), _(po, po + sat.numCol())] << sat; - C[_(cc, ccc), _(po, po + bnd.numCol())] << bnd; + C[_(c, cc), _(po, po + ptrdiff_t(sat.numCol()))] << sat; + C[_(cc, ccc), _(po, po + ptrdiff_t(bnd.numCol()))] << bnd; } } void addIndependentSolutionConstraints(Valid omniSimplex, - const ScheduledNode *nodes, unsigned d, - CoefCounts counts) { + const ScheduledNode *nodes, + ptrdiff_t d, CoefCounts counts) { // omniSimplex->setNumCons(omniSimplex->getNumCons() + // memory.size()); // omniSimplex->reserveExtraRows(memory.size()); @@ -1098,7 +1101,8 @@ class LoopBlock { if (node->phiIsScheduled(d) || (d >= node->getNumLoops()) || (!node->hasActiveEdges(deps, d))) continue; - A.resizeForOverwrite(Row{ptrdiff_t(node->getPhi().numCol())}, Col{d}); + A.resizeForOverwrite(Row<>{ptrdiff_t(node->getPhi().numCol())}, + Col<>{d}); A << node->getPhi()[_(0, d), _].transpose(); math::NormalForm::nullSpace11(N, A); // we add sum(NullSpace,dims=1) >= 1 @@ -1144,8 +1148,9 @@ class LoopBlock { return os; } }; -inline auto operator<<(llvm::raw_ostream &os, - containers::Pair nodesdeps) +inline auto +operator<<(llvm::raw_ostream &os, + containers::Pair nodesdeps) -> llvm::raw_ostream & { auto [nodes, deps] = nodesdeps; os << "\nLoopBlock graph:\n"; diff --git a/include/LinearProgramming/ScheduledNode.hpp b/include/LinearProgramming/ScheduledNode.hpp index 8e306a858..a930cc0d1 100644 --- a/include/LinearProgramming/ScheduledNode.hpp +++ b/include/LinearProgramming/ScheduledNode.hpp @@ -398,10 +398,10 @@ class ScheduledNode { } // NOLINTNEXTLINE(readability-make-member-function-const) [[nodiscard]] constexpr auto getPhi() -> MutSquarePtrMatrix { - return {mem + 1, math::SquareDims{unsigned(getNumLoops())}}; + return {mem + 1, math::SquareDims<>{unsigned(getNumLoops())}}; } [[nodiscard]] constexpr auto getPhi() const -> SquarePtrMatrix { - return {const_cast(mem) + 1, math::SquareDims{getNumLoops()}}; + return {const_cast(mem) + 1, math::SquareDims<>{getNumLoops()}}; } /// getSchedule, loops are always indexed from outer to inner [[nodiscard]] constexpr auto getSchedule(ptrdiff_t d) const diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index d0fff5c93..e8dc00b29 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -7,8 +7,8 @@ #include "Polyhedra/Loops.hpp" #include "Polyhedra/Schedule.hpp" #include "Support/Iterators.hpp" -#include #include +#include #include #include #include @@ -181,7 +181,7 @@ class Dependence { invariant(inPhi.numRow(), outPhi.numRow()); if (depPoly->checkSat(*alloc, inLoop, inOff, inPhi, outLoop, outOff, outPhi)) - satLvl[0] = uint8_t(inPhi.numRow() - 1); + satLvl[0] = uint8_t(ptrdiff_t(inPhi.numRow()) - 1); } constexpr void copySimplices(Arena<> *alloc) { dependenceSatisfaction = dependenceSatisfaction->copy(alloc); @@ -244,7 +244,7 @@ class Dependence { // 2 == 1 for const offset + 1 for w assert(2 + depPoly->getNumLambda() + getNumPhiCoefficients() + getNumOmegaCoefficients() == - size_t(dependenceSatisfaction->getConstraints().numCol())); + ptrdiff_t(dependenceSatisfaction->getConstraints().numCol())); } [[nodiscard]] constexpr auto getDepPoly() -> Valid { return depPoly; @@ -332,11 +332,11 @@ class Dependence { Valid schIn, Valid schOut) const -> bool { - unsigned numLoopsIn = in->getCurrentDepth(), - numLoopsOut = out->getCurrentDepth(), - numLoopsCommon = std::min(numLoopsIn, numLoopsOut), - numLoopsTotal = numLoopsIn + numLoopsOut, - numVar = numLoopsIn + numLoopsOut + 2; + ptrdiff_t numLoopsIn = in->getCurrentDepth(), + numLoopsOut = out->getCurrentDepth(), + numLoopsCommon = std::min(numLoopsIn, numLoopsOut), + numLoopsTotal = numLoopsIn + numLoopsOut, + numVar = numLoopsIn + numLoopsOut + 2; invariant(dependenceSatisfaction->getNumVars(), numVar); auto schv = vector(&alloc, numVar, int64_t(0)); const SquarePtrMatrix inPhi = schIn->getPhi(); @@ -382,10 +382,10 @@ class Dependence { [[nodiscard]] auto isSatisfied(Arena<> alloc, PtrVector inFusOmega, PtrVector outFusOmega) const -> bool { - unsigned numLoopsIn = in->getCurrentDepth(), - numLoopsOut = out->getCurrentDepth(), - numLoopsCommon = std::min(numLoopsIn, numLoopsOut), - numVar = numLoopsIn + numLoopsOut + 2; + ptrdiff_t numLoopsIn = in->getCurrentDepth(), + numLoopsOut = out->getCurrentDepth(), + numLoopsCommon = std::min(numLoopsIn, numLoopsOut), + numVar = numLoopsIn + numLoopsOut + 2; invariant(dependenceSatisfaction->getNumVars(), numVar); auto schv = vector(&alloc, numVar, int64_t(0)); // Vector schv(dependenceSatisfaction->getNumVars(),int64_t(0)); @@ -423,10 +423,9 @@ class Dependence { } return true; } - [[nodiscard]] auto isSatisfied(Arena<> alloc, - Valid sx, - Valid sy, - size_t d) const -> bool { + [[nodiscard]] auto isSatisfied(Arena<> alloc, Valid sx, + Valid sy, size_t d) const + -> bool { unsigned numLambda = depPoly->getNumLambda(), nLoopX = depPoly->getDim0(), nLoopY = depPoly->getDim1(), numLoopsTotal = nLoopX + nLoopY; MutPtrVector sch{math::vector(&alloc, numLoopsTotal + 2)}; @@ -438,9 +437,9 @@ class Dependence { return dependenceSatisfaction->satisfiable(alloc, sch, numLambda); } [[nodiscard]] auto isSatisfied(Arena<> alloc, size_t d) const -> bool { - unsigned numLambda = depPoly->getNumLambda(), - numLoopsX = depPoly->getDim0(), - numLoopsTotal = numLoopsX + depPoly->getDim1(); + ptrdiff_t numLambda = depPoly->getNumLambda(), + numLoopsX = depPoly->getDim0(), + numLoopsTotal = numLoopsX + depPoly->getDim1(); MutPtrVector sch{math::vector(&alloc, numLoopsTotal + 2)}; sch << 0; invariant(sch.size(), numLoopsTotal + 2); @@ -603,8 +602,8 @@ class Dependencies { } static constexpr auto memNeeded(size_t N) -> size_t { constexpr size_t memPer = sizeof(int32_t) * 2 + sizeof(DepPoly *) + - sizeof(Valid) * 2 + - sizeof(bool) + sizeof(uint8_t); + sizeof(Valid) * 2 + sizeof(bool) + + sizeof(uint8_t); return N * memPer; } @@ -625,21 +624,20 @@ class Dependencies { std::array, 2> pair) { return timelessCheck(alloc, dxy, x, y, pair, checkDirection(*alloc, pair, x, y, dxy->getNumLambda(), - dxy->getNumVar() + 1)); + Col<>{dxy->getNumVar() + 1})); } // emplaces dependencies with repeat accesses to the same memory across // time void timeCheck(Arena<> *alloc, Valid dxy, Valid x, - Valid y, - std::array, 2> pair) { + Valid y, std::array, 2> pair) { bool isFwd = checkDirection(*alloc, pair, x, y, dxy->getNumLambda(), - dxy->getA().numCol() - dxy->getTimeDim()); + Col<>{ptrdiff_t(dxy->getA().numCol()) - dxy->getTimeDim()}); timeCheck(alloc, dxy, x, y, pair, isFwd); } void timeCheck(Arena<> *alloc, Valid dxy, Valid x, - Valid y, - std::array, 2> pair, bool isFwd) { + Valid y, std::array, 2> pair, + bool isFwd) { const unsigned numInequalityConstraintsOld = dxy->getNumInequalityConstraints(), numEqualityConstraintsOld = dxy->getNumEqualityConstraints(), @@ -650,7 +648,7 @@ class Dependencies { invariant(numLambda, dxy->getNumLambda()); // copy backup std::array, 2> farkasBackups{pair[0]->copy(alloc), - pair[1]->copy(alloc)}; + pair[1]->copy(alloc)}; Valid in = x, out = y; if (isFwd) { std::swap(farkasBackups[0], farkasBackups[1]); @@ -691,7 +689,7 @@ class Dependencies { ptrdiff_t v = numVar + t, i = 0; while (true) { for (ptrdiff_t c = 0; c < numInequalityConstraintsOld; ++c) { - int64_t Acv = dxy->getA(c, v); + int64_t Acv = dxy->getA(Row<>{c}, Col<>{v}); if (!Acv) continue; Acv *= step; fE[0, c + 1] -= Acv; // *1 @@ -699,7 +697,7 @@ class Dependencies { } for (ptrdiff_t c = 0; c < numEqualityConstraintsOld; ++c) { // each of these actually represents 2 inds - int64_t Ecv = dxy->getE(c, v); + int64_t Ecv = dxy->getE(Row<>{c}, Col<>{v}); if (!Ecv) continue; Ecv *= step; fE[0, c + ineqEnd] -= Ecv; @@ -710,7 +708,7 @@ class Dependencies { if (i++ != 0) break; // break after undoing timeDirection[t] = checkDirection(*alloc, farkasBackups, *out, *in, numLambda, - dxy->getA().numCol() - dxy->getTimeDim()); + Col<>{ptrdiff_t(dxy->getA().numCol()) - dxy->getTimeDim()}); step *= -1; // flip to undo, then break } } while (++t < timeDim); @@ -722,19 +720,19 @@ class Dependencies { int64_t step = (2 * timeDirection[t] - 1) * dxy->getNullStep(t); ptrdiff_t v = numVar + t; for (ptrdiff_t c = 0; c < numInequalityConstraintsOld; ++c) { - int64_t Acv = dxy->getA(c, v); + int64_t Acv = dxy->getA(Row<>{c}, Col<>{v}); if (!Acv) continue; Acv *= step; - dxy->getA(c, 0) -= Acv; + dxy->getA(Row<>{c}, Col<>{0}) -= Acv; fE[0, c + 1] -= Acv; // *1 sE[0, c + 1] -= Acv; // *-1 } for (ptrdiff_t c = 0; c < numEqualityConstraintsOld; ++c) { // each of these actually represents 2 inds - int64_t Ecv = dxy->getE(c, v); + int64_t Ecv = dxy->getE(Row<>{c}, Col<>{v}); if (!Ecv) continue; Ecv *= step; - dxy->getE(c, 0) -= Ecv; + dxy->getE(Row<>{c}, Col<>{0}) -= Ecv; fE[0, c + ineqEnd] -= Ecv; fE[0, c + posEqEnd] += Ecv; sE[0, c + ineqEnd] -= Ecv; @@ -751,11 +749,10 @@ class Dependencies { } static auto checkDirection(Arena<> alloc, const std::array, 2> &p, - Valid x, - Valid y, + Valid x, Valid y, Valid xSchedule, Valid ySchedule, - unsigned numLambda, Col nonTimeDim) -> bool { + ptrdiff_t numLambda, Col<> nonTimeDim) -> bool { const auto &[fxy, fyx] = p; unsigned numLoopsX = x->getCurrentDepth(), numLoopsY = y->getCurrentDepth(), numLoopsTotal = numLoopsX + numLoopsY; @@ -789,13 +786,13 @@ class Dependencies { sch[_(2, 2 + numLoopsX)] << xPhi[last - i, _]; sch[_(2 + numLoopsX, 2 + numLoopsTotal)] << yPhi[last - i, _]; if (fxy->unSatisfiableZeroRem(alloc, sch, numLambda, - unsigned(nonTimeDim))) { + ptrdiff_t(nonTimeDim))) { assert(!fyx->unSatisfiableZeroRem(alloc, sch, numLambda, - unsigned(nonTimeDim))); + ptrdiff_t(nonTimeDim))); return false; } if (fyx->unSatisfiableZeroRem(alloc, sch, numLambda, - unsigned(nonTimeDim))) + ptrdiff_t(nonTimeDim))) return true; } // assert(false); @@ -804,11 +801,10 @@ class Dependencies { // returns `true` if forward, x->y static auto checkDirection(Arena<> alloc, const std::array, 2> &p, - Valid x, - Valid y, unsigned numLambda, - Col nonTimeDim) -> bool { + Valid x, Valid y, + ptrdiff_t numLambda, Col<> nonTimeDim) -> bool { const auto &[fxy, fyx] = p; - unsigned numLoopsX = x->getCurrentDepth(), nTD = unsigned(nonTimeDim); + unsigned numLoopsX = x->getCurrentDepth(), nTD = ptrdiff_t(nonTimeDim); #ifndef NDEBUG const unsigned numLoopsCommon = std::min(numLoopsX, y->getCurrentDepth()); #endif diff --git a/include/Polyhedra/Schedule.hpp b/include/Polyhedra/Schedule.hpp index 5e529c837..ee2949977 100644 --- a/include/Polyhedra/Schedule.hpp +++ b/include/Polyhedra/Schedule.hpp @@ -71,10 +71,10 @@ struct AffineSchedule { } // NOLINTNEXTLINE(readability-make-member-function-const) [[nodiscard]] constexpr auto getPhi() -> MutSquarePtrMatrix { - return {data(), math::SquareDims{unsigned(getNumLoops())}}; + return {data(), math::SquareDims<>{getNumLoops()}}; } [[nodiscard]] constexpr auto getPhi() const -> SquarePtrMatrix { - return {data(), math::SquareDims{getNumLoops()}}; // + return {data(), math::SquareDims<>{getNumLoops()}}; // } /// getSchedule, loops are always indexed from outer to inner [[nodiscard]] constexpr auto getSchedule(size_t d) const From a1c64bc376fa0ca1d52cabbbcf44e59979cdf3ef Mon Sep 17 00:00:00 2001 From: chriselrod Date: Mon, 30 Oct 2023 03:43:01 -0400 Subject: [PATCH 056/112] start skeleton of constructor --- include/IR/CostFunction.hpp | 17 +++++++++++++++-- include/IR/CostModeling.hpp | 15 ++++----------- include/IR/Node.hpp | 7 +++---- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp index cc36faa45..d02a4dae9 100644 --- a/include/IR/CostFunction.hpp +++ b/include/IR/CostFunction.hpp @@ -520,8 +520,21 @@ class LoopTreeCostFn { } return c; } - LoopTreeCostFn(alloc::Arena<>* alloc, IR::Loop*root){ - + LoopTreeCostFn(alloc::Arena<> *alloc, IR::Loop *root) { + // the root is top-level + IR::Loop *L = root->getSubLoop(); + ptrdiff_t depth = 0; + for (IR::Node *N = L->getChild(); N;) { + if (auto *A = llvm::dyn_cast(N)) { + } else if (auto *I = llvm::dyn_cast(N)) { + } else if (auto *S = llvm::dyn_cast(N)) { + // we enter subloop, S + } else if (auto *E = llvm::dyn_cast(N)) { + // E->getParent()->getNext() returns following instr + // With this, we increment exit count + } + N = N->getNext(); + } } }; diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index 6454b84f9..12b8eefea 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -12,12 +12,8 @@ #include #include #include -#include -#include -#include #include #include -#include #include #include #include @@ -36,16 +32,13 @@ #include #include #include -#include -#include - namespace poly::CostModeling { using poly::Dependence; class CPURegisterFile { - [[no_unique_address]] uint8_t maximumVectorWidth; - [[no_unique_address]] uint8_t numVectorRegisters; - [[no_unique_address]] uint8_t numGeneralPurposeRegisters; - [[no_unique_address]] uint8_t numPredicateRegisters; + uint8_t maximumVectorWidth; + uint8_t numVectorRegisters; + uint8_t numGeneralPurposeRegisters; + uint8_t numPredicateRegisters; #if defined(__x86_64__) // hacky check for has AVX512 diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index 698ff1a4f..f18a7ec0e 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -79,7 +79,7 @@ class Loop; /// while (C){ /// // do stuff with `C` /// C = C->getNext() -/// C = (C || llvm::isa(C)) ? C : C->getChild(); +/// C = (!C || llvm::isa(C)) ? C : C->getChild(); /// } /// ``` /// IR types: Loop, Block, Addr, Instr, Consts @@ -324,7 +324,7 @@ class Loop : public Node { /// Get the first subloop. [[nodiscard]] constexpr auto getSubLoop() const -> Loop * { Node *C = getChild(); - C = (C || llvm::isa(C)) ? C : C->getChild(); + C = (!C || llvm::isa(C)) ? C : C->getChild(); return static_cast(C); } /// Return the enclosing, parent loop. @@ -387,8 +387,7 @@ class Loop : public Node { -> LegalTransforms; }; [[nodiscard]] inline constexpr auto Node::getLoop() const noexcept -> Loop * { - if (!parent) return nullptr; - if (parent->kind != VK_Loop) return nullptr; + if (!parent || (parent->kind != VK_Loop)) return nullptr; return static_cast(parent); } From 04513f507ac5fa212b364d06a2f77f6c012533c1 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Tue, 31 Oct 2023 04:26:21 -0400 Subject: [PATCH 057/112] A bit of progress --- include/IR/Address.hpp | 79 +++++++++++- include/IR/CostFunction.hpp | 153 +++++++++++++++--------- include/IR/CostModeling.hpp | 77 +----------- include/IR/Instruction.hpp | 1 - include/IR/InstructionCost.hpp | 1 - include/IR/Node.hpp | 3 + include/IR/OrthogonalAxes.hpp | 13 ++ include/IR/RegisterFile.hpp | 78 ++++++++++++ include/LinearProgramming/LoopBlock.hpp | 8 +- include/Polyhedra/Loops.hpp | 20 ++-- 10 files changed, 282 insertions(+), 151 deletions(-) create mode 100644 include/IR/OrthogonalAxes.hpp create mode 100644 include/IR/RegisterFile.hpp diff --git a/include/IR/Address.hpp b/include/IR/Address.hpp index ef066dd43..e91f3125c 100644 --- a/include/IR/Address.hpp +++ b/include/IR/Address.hpp @@ -2,15 +2,16 @@ #include "IR/InstructionCost.hpp" #include "IR/Node.hpp" +#include "IR/OrthogonalAxes.hpp" #include "IR/Users.hpp" #include "Polyhedra/Loops.hpp" #include "Support/OStream.hpp" #include "Utilities/ListRanges.hpp" +#include #include #include #include #include -#include #include #include #include @@ -87,6 +88,7 @@ class Addr : public Instruction { Addr *origNext{nullptr}; uint16_t numDim{0}, numDynSym{0}; int32_t topologicalPosition; + OrthogonalAxes axes; #if !defined(__clang__) && defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wpedantic" @@ -131,6 +133,32 @@ class Addr : public Instruction { } public: + [[nodiscard]] constexpr auto getOrthAxes() const -> OrthogonalAxes { + return axes; + } + constexpr auto calcOrthAxes(ptrdiff_t depth) -> OrthogonalAxes { + invariant((depth <= 24) && (depth >= 0)); + invariant(depth >= naturalDepth); + invariant(currentDepth >= depth); + bool indepAxes = true; + uint32_t contig{0}, indep{(uint32_t(1) << depth) - 1}; + /// indexMatrix() -> arrayDim() x getNumLoops() + DensePtrMatrix inds{indexMatrix()}; + for (ptrdiff_t l = 0; l < inds.numCol(); ++l) { + if (!inds[0, l]) continue; + contig |= uint32_t(1) << l; + indep &= ~(uint32_t(1) << l); + } + for (ptrdiff_t d = 1; d < inds.numRow(); ++d) { + for (ptrdiff_t l = 0; l < inds.numCol(); ++l) { + if (!inds[d, l]) continue; + if (!(indep & (uint32_t(1) << l))) indepAxes = false; + indep &= ~(uint32_t(1) << l); + } + } + axes = {indepAxes, contig, indep}; + return axes; + } [[nodiscard]] constexpr auto isDropped() const -> bool { return (getNext() == nullptr) && (getPrev() == nullptr); } @@ -474,10 +502,12 @@ class Addr : public Instruction { return {getIntMemory() + 1, getArrayDim()}; } /// indexMatrix() -> arrayDim() x getNumLoops() + /// First dimension is contiguous [[nodiscard]] constexpr auto indexMatrix() -> MutDensePtrMatrix { return {indMatPtr(), DenseDims<>{{getArrayDim()}, {getNaturalDepth()}}}; } /// indexMatrix() -> arrayDim() x getNumLoops() + /// First dimension is contiguous [[nodiscard]] constexpr auto indexMatrix() const -> DensePtrMatrix { return {indMatPtr(), DenseDims<>{{getArrayDim()}, {getNaturalDepth()}}}; } @@ -529,11 +559,50 @@ class Addr : public Instruction { llvm::TargetTransformInfo::TCK_Latency)}; } - auto getCost(const llvm::TargetTransformInfo &TTI, cost::VectorWidth W) - -> cost::RecipThroughputLatency { - // TODO: cache? - return calculateCostContiguousLoadStore(TTI, W.getWidth()); + /// RecipThroughput + struct Costs { + double contiguous; + double discontiguous; + double scalar; + }; + auto calcCostContigDiscontig(const llvm::TargetTransformInfo &TTI, + unsigned int vectorWidth) -> Costs { + constexpr unsigned int addrSpace = 0; + llvm::Type *T = cost::getType(getType(), vectorWidth); + llvm::Align alignment = getAlign(); + + llvm::Intrinsic::ID id = + isLoad() ? llvm::Instruction::Load : llvm::Instruction::Store; + + llvm::InstructionCost gsc{TTI.getGatherScatterOpCost( + id, T, basePointer->getValue(), predicate, alignment, + llvm::TargetTransformInfo::TCK_RecipThroughput)}, + contig, scalar; + + if (!predicate) { + contig = + TTI.getMemoryOpCost(id, T, alignment, addrSpace, + llvm::TargetTransformInfo::TCK_RecipThroughput); + scalar = + TTI.getMemoryOpCost(id, T, alignment, addrSpace, + llvm::TargetTransformInfo::TCK_RecipThroughput); + } else { + llvm::Intrinsic::ID mid = + isLoad() ? llvm::Intrinsic::masked_load : llvm::Intrinsic::masked_store; + contig = TTI.getMaskedMemoryOpCost( + mid, T, alignment, addrSpace, + llvm::TargetTransformInfo::TCK_RecipThroughput); + scalar = TTI.getMaskedMemoryOpCost( + mid, T, alignment, addrSpace, + llvm::TargetTransformInfo::TCK_RecipThroughput); + } + double dc{NAN}, dd{NAN}, ds{NAN}; + if (std::optional o = contig.getValue()) dc = *o; + if (std::optional o = gsc.getValue()) dc = *o; + if (std::optional o = scalar.getValue()) dc = *o; + return {dc, dd, ds}; } + /// drop `this` and remove it from `Dependencies` inline void drop(Dependencies); diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp index d02a4dae9..9a26db3f2 100644 --- a/include/IR/CostFunction.hpp +++ b/include/IR/CostFunction.hpp @@ -1,10 +1,13 @@ #pragma once -#include "Containers/Pair.hpp" +#include "IR/Address.hpp" +#include "IR/Instruction.hpp" #include "IR/Node.hpp" -#include "Math/Constructors.hpp" +#include "IR/OrthogonalAxes.hpp" #include +#include #include +#include #include #include #include @@ -42,22 +45,23 @@ using utils::Optional; struct LoopCostCounts { uint16_t known_trip : 1; uint16_t trip_count : 15; - uint16_t omemory : 11; - uint16_t cmemory : 5; - uint16_t exit : 5; /// how many blocks we exit after this - uint16_t compute : 11; + uint16_t compute; + uint16_t omemory; + uint8_t cmemory; + uint8_t exit : 5; /// how many blocks we exit after this + uint8_t l2vectorWidth : 3; // 1<<7 == 128 }; -static_assert(sizeof(LoopCostCounts) == 6); +static_assert(sizeof(LoopCostCounts) == 8); /// Order is outermost -> innermost -/// Costs are relative to Scalar, i.e. scalar == 1 -struct MemoryCosts { - double contiguous; // vload/vstore - double discontiguous; // gather/scatter -}; struct VectorizationFactor { uint32_t l2factor; - uint32_t index; // outermost == 0 + // trailing bit is outermost loop, so if iterating by shifting, + // we go outer->inner + uint32_t indexMask; + constexpr operator IR::VectorWidth() const { + return IR::VectorWidth{unsigned(1) << l2factor, l2factor}; + } }; /// TODO: maybe two `uint8_t`s + `uint16_t` @@ -68,10 +72,9 @@ struct VectorizationFactor { /// between eltypes. /// Another option is to store individual `MemoryCosts`, /// so that we can aggregate/sum up. -struct OrthogonalAxes { - MemoryCosts memcost; - uint32_t contig : 8; // max number of array dims of 255 - uint32_t indep : 24; // max loop depth of 24 +struct MemCostSummary { + IR::Addr::Costs memcost; + OrthogonalAxes orth; // [[nodiscard]] constexpr auto contigAxis() const -> uint32_t { // return data & 0xff; // } @@ -87,8 +90,8 @@ struct OrthogonalAxes { // return data >> 8; // }; }; -constexpr auto operator&(OrthogonalAxes a, OrthogonalAxes b) -> uint32_t { - return a.indep & b.indep; +constexpr auto operator&(MemCostSummary a, MemCostSummary b) -> uint32_t { + return a.orth.indep & b.orth.indep; } constexpr auto cost(const AbstractMatrix auto &invunrolls, uint32_t indepAxes) -> utils::eltype_t { @@ -106,17 +109,17 @@ constexpr auto cost(const AbstractMatrix auto &invunrolls, uint32_t indepAxes) // costs is an array of length two. // memory costs, unnormalized by `prod(unrolls)` // `invunrolls` is a matrix, row-0 are the inverse unrolls, row-1 unrolls. -constexpr auto cost(const AbstractMatrix auto &invunrolls, OrthogonalAxes orth, +constexpr auto cost(const AbstractMatrix auto &invunrolls, MemCostSummary mcs, VectorizationFactor vfi) -> utils::eltype_t { - + auto [mc, orth] = mcs; utils::eltype_t c{cost(invunrolls, orth.indep)}; - if ((vfi.index < 32) && !(orth.indep & (1 << vfi.index))) { - // depends vectorized index - if (vfi.index == orth.contig) { - c *= orth.memcost.contiguous; - } else if (orth.contig >= 32) { - c *= orth.memcost.discontiguous; + if (!(orth.indep & vfi.indexMask)) { + // depends on vectorized index + if (vfi.indexMask & orth.contig) { + c *= mc.contiguous; + } else if (!orth.contig) { + c *= mc.discontiguous; } else { // Discontiguous vector load. // We consider two alternatives: @@ -136,11 +139,10 @@ constexpr auto cost(const AbstractMatrix auto &invunrolls, OrthogonalAxes orth, u{invunrolls[1, orth.contig]}, mr{math::smax((1 << vfi.l2factor) * iu, 1)}; utils::invariant(iu == 1 / u); - c *= - math::smin(orth.memcost.contiguous * mr + u * (vfi.l2factor + log2(mr)), - orth.memcost.discontiguous); + c *= math::smin(mc.contiguous * mr + u * (vfi.l2factor + log2(mr)), + mc.discontiguous); } - } + } else c *= mc.scalar; return c; } /// General fallback method for those without easy to represent structure @@ -150,7 +152,7 @@ constexpr auto cost(const AbstractMatrix auto &invunrolls, OrthogonalAxes orth, /// more than one array dimension. /// For these, we use the incorrect formula: /// -constexpr auto cost(const AbstractMatrix auto &invunrolls, OrthogonalAxes orth, +constexpr auto cost(const AbstractMatrix auto &invunrolls, MemCostSummary orth, VectorizationFactor vfi, DensePtrMatrix inds) -> utils::eltype_t { utils::eltype_t c{1}; @@ -164,7 +166,7 @@ constexpr auto cost(const AbstractMatrix auto &invunrolls, OrthogonalAxes orth, containers::BitSet64 bs; utils::eltype_t uprod; for (ptrdiff_t l = 0; l < numLoops; ++l) { - if (l == vfi.index) continue; + if ((uint32_t(1) << l) == vfi.indexMask) continue; int64_t a = inds[d, l]; if (!a) continue; bool docontinue{false}; @@ -187,7 +189,7 @@ constexpr auto cost(const AbstractMatrix auto &invunrolls, OrthogonalAxes orth, if (bs.size() < 2) continue; utils::eltype_t prod{1}; for (ptrdiff_t l : bs) { - if (l == vfi.index) continue; + if ((uint32_t(1) << l) == vfi.indexMask) continue; int64_t a = inds[d, l]; if (!a) continue; prod *= (1 - (a / g) * (uprod / invunrolls[0, l])); @@ -196,7 +198,7 @@ constexpr auto cost(const AbstractMatrix auto &invunrolls, OrthogonalAxes orth, } // c is a scaling factor; now we proceed to calculate cost similaly to the // orth-axis implementation above. - return c * cost(invunrolls, vfi, orth); + return c * cost(invunrolls, orth, vfi); } // We need to define an unroll ordering. @@ -227,19 +229,19 @@ constexpr auto registerPressure(const AbstractMatrix auto &invunrolls, return 0.25 * math::softplus(8.0 * (acc - r.register_count)); } -auto memcosts(const AbstractMatrix auto &invunrolls, VectorizationFactor vf, - math::PtrVector> orth_axes) { +auto memcosts( + const AbstractMatrix auto &invunrolls, VectorizationFactor vf, + math::PtrVector> orth_axes) { utils::eltype_t ic{}; for (auto [oa, mc] : orth_axes) ic += cost(invunrolls, oa, mc, vf); return ic; } -auto memcosts(const AbstractMatrix auto &invunrolls, VectorizationFactor vf, - math::PtrVector>> - orth_axes) { +auto memcosts( + const AbstractMatrix auto &invunrolls, VectorizationFactor vf, + math::PtrVector>> + orth_axes) { utils::eltype_t ic{}; - for (auto [oa, mc, inds] : orth_axes) - ic += cost(invunrolls, oa, mc, vf, inds); + for (auto [oa, inds] : orth_axes) ic += cost(invunrolls, oa, vf, inds); return ic; } auto compcosts(const AbstractMatrix auto &invunrolls, @@ -462,14 +464,23 @@ auto compcosts(const AbstractMatrix auto &invunrolls, /// /// /// class LoopTreeCostFn { - math::PtrVector cost_counts; - math::PtrVector orth_axes; - math::PtrVector>> conv_axes; - math::PtrVector> compute_independence; - math::PtrVector>> leafs; - VectorizationFactor vf; + math::Vector cost_counts{}; + math::Vector orth_axes{}; + math::Vector>> conv_axes{}; + math::Vector> compute_independence{}; + math::Vector>> leafs{}; + unsigned maxVectorBytes; ptrdiff_t max_depth; + constexpr void clear() { + cost_counts.clear(); + orth_axes.clear(); + conv_axes.clear(); + compute_independence.clear(); + leafs.clear(); + max_depth = 0; + } + public: // this is a vector fun, where indexing may do non-trivial computation // also, mapping from this vector to loop position isn't trivial either @@ -481,16 +492,27 @@ class LoopTreeCostFn { const AbstractVector auto &x) const { using T = utils::eltype_t; utils::invariant(max_depth < 16); - math::MutArray> invunrolls{ - math::matrix(alloc, math::Row<2>{}, math::Col<>{max_depth})}; + // row 0: inverse unrolls + // row 1: unrolls + // row 2: cumprod invunroll + math::MutArray> invunrolls{ + math::matrix(alloc, math::Row<3>{}, math::Col<>{max_depth})}; ptrdiff_t i = 0, depth = 0, mi = 0, mc = 0, ci = 0, li = 0; double tripcounts[16]; + VectorizationFactor vf{}; // we evaluate every iteration T c{}; - for (auto [comptimetrip, trip_count, omem, cmem, exit, compute] : + for (auto [comptimetrip, trip_count, compute, omem, cmem, exit, l2vw] : cost_counts) { + if (l2vw) { + invariant(vf.l2factor == 0); + invariant(vf.indexMask == 0); + vf.l2factor = l2vw; + vf.indexMask = uint32_t(1) << depth; + } invunrolls[1, depth] = x[i++]; - invunrolls[0, depth] = 1 / invunrolls[1, depth]; + invunrolls[2, depth] = invunrolls[0, depth] = 1 / invunrolls[1, depth]; + if (depth) invunrolls[2, depth] *= invunrolls[2, depth - 1]; tripcounts[depth] = (depth ? tripcounts[depth - 1] * trip_count : trip_count); T cc{compcosts(invunrolls, compute_independence[_(0, compute) + ci])}; @@ -500,7 +522,7 @@ class LoopTreeCostFn { auto [l, numreduct] = lt; // we're now in a leaf, meaning we must consider register costs, // as well as reduction costs and latency of reduction chains. - cc = smax(cc, l / invunrolls[depth]); + cc = smax(cc, l * invunrolls[2, depth]); cc += registerPressure(invunrolls, reguse); if (numreduct) { cc += @@ -517,25 +539,44 @@ class LoopTreeCostFn { // Decrement depth by `exit - 1`; the `-1` corresponds // to descending into this header, while we exit `exit` loops afterwards. depth -= exit - 1; + if (depth <= std::countr_zero(vf.indexMask)) { + vf.l2factor = 0; + vf.indexMask = 0; + } } return c; } - LoopTreeCostFn(alloc::Arena<> *alloc, IR::Loop *root) { + // should only have to `init` once per `root`, with `VectorizationFactor` + // being adjustable. + // TODO: vec factor should be a tree-flag + void init(IR::Loop *root, unsigned maxVF, + const llvm::TargetTransformInfo &TTI) { + clear(); // max_depth = 0; // the root is top-level IR::Loop *L = root->getSubLoop(); ptrdiff_t depth = 0; + uint16_t omemory, cmemory, exit, compute; + IR::Node *child; for (IR::Node *N = L->getChild(); N;) { if (auto *A = llvm::dyn_cast(N)) { - } else if (auto *I = llvm::dyn_cast(N)) { + OrthogonalAxes oa = A->calcOrthAxes(depth); + IR::Addr::Costs rtl = A->calcCostContigDiscontig(TTI, maxVF); + + } else if (auto *C = llvm::dyn_cast(N)) { } else if (auto *S = llvm::dyn_cast(N)) { // we enter subloop, S } else if (auto *E = llvm::dyn_cast(N)) { + max_depth = std::max(max_depth, depth); // E->getParent()->getNext() returns following instr // With this, we increment exit count } N = N->getNext(); } } + LoopTreeCostFn(IR::Loop *root, unsigned maxVF, + const llvm::TargetTransformInfo &TTI) { + init(root, maxVF, TTI); + } }; } // namespace poly::CostModeling diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index 12b8eefea..075091684 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -5,7 +5,6 @@ #include "Dicts/BumpMapSet.hpp" #include "Graphs/Graphs.hpp" #include "IR/Address.hpp" -#include "IR/OptimizationPossibilities.hpp" #include "LinearProgramming/LoopBlock.hpp" #include "LinearProgramming/ScheduledNode.hpp" #include "Polyhedra/Dependence.hpp" @@ -23,7 +22,6 @@ #include #include #include -#include #include #include #include @@ -34,75 +32,6 @@ #include namespace poly::CostModeling { using poly::Dependence; -class CPURegisterFile { - uint8_t maximumVectorWidth; - uint8_t numVectorRegisters; - uint8_t numGeneralPurposeRegisters; - uint8_t numPredicateRegisters; - -#if defined(__x86_64__) - // hacky check for has AVX512 - static inline auto hasAVX512(llvm::LLVMContext &C, - const llvm::TargetTransformInfo &TTI) -> bool { - return TTI.isLegalMaskedExpandLoad( - llvm::FixedVectorType::get(llvm::Type::getDoubleTy(C), 8)); - } -#else - // assume we're not cross-compiling to x64 from some other arch to reduce the - // risk of false positives - static constexpr hasAVX512(llvm::LLVMContext &, - const llvm::TargetTransformInfo &) - ->bool { - return false; - } -#endif - - static auto estimateNumPredicateRegisters( - llvm::LLVMContext &C, const llvm::TargetTransformInfo &TTI) -> uint8_t { - if (TTI.supportsScalableVectors()) return 8; - // hacky check for AVX512 - if (hasAVX512(C, TTI)) return 7; // 7, because k0 is reserved for unmasked - return 0; - } - // returns vector width in bits, ignoring mprefer-vector-width - static auto estimateMaximumVectorWidth(llvm::LLVMContext &C, - const llvm::TargetTransformInfo &TTI) - -> uint8_t { - uint8_t twiceMaxVectorWidth = 2; - auto *f32 = llvm::Type::getFloatTy(C); - llvm::InstructionCost prevCost = TTI.getArithmeticInstrCost( - llvm::Instruction::FAdd, - llvm::FixedVectorType::get(f32, twiceMaxVectorWidth)); - while (true) { - llvm::InstructionCost nextCost = TTI.getArithmeticInstrCost( - llvm::Instruction::FAdd, - llvm::FixedVectorType::get(f32, twiceMaxVectorWidth *= 2)); - if (nextCost > prevCost) break; - prevCost = nextCost; - } - return 16 * twiceMaxVectorWidth; - } - -public: - CPURegisterFile(llvm::LLVMContext &C, const llvm::TargetTransformInfo &TTI) { - maximumVectorWidth = estimateMaximumVectorWidth(C, TTI); - numVectorRegisters = TTI.getNumberOfRegisters(true); - numGeneralPurposeRegisters = TTI.getNumberOfRegisters(false); - numPredicateRegisters = estimateNumPredicateRegisters(C, TTI); - } - [[nodiscard]] constexpr auto getNumVectorBits() const -> uint8_t { - return maximumVectorWidth; - } - [[nodiscard]] constexpr auto getNumVector() const -> uint8_t { - return numVectorRegisters; - } - [[nodiscard]] constexpr auto getNumScalar() const -> uint8_t { - return numGeneralPurposeRegisters; - } - [[nodiscard]] constexpr auto getNumPredicate() const -> uint8_t { - return numPredicateRegisters; - } -}; // struct CPUExecutionModel {}; // Plan for cost modeling: @@ -272,7 +201,7 @@ inline auto searchLoopIndependentUsers(IR::Dependencies deps, IR::Loop *L, return ret; } } - // if it isn't a Loop, must be an `Instruction` + // if it isn't a Loop or Addr, must be an `Instruction` IR::Value *I = llvm::cast(N); for (IR::Node *U : I->getUsers()) { ret *= searchLoopIndependentUsers(deps, L, U, depth, summary); @@ -340,10 +269,6 @@ inline auto visitLoopDependent(IR::Dependencies deps, IR::Loop *L, IR::Node *N, if (N->getLoop() == L) body = N->setNext(body); return body; } -struct LoopBuild { - IR::Node *node; - uint32_t count; -}; inline void addBody(IR::Dependencies deps, IR::Loop *root, unsigned depth, IR::Node *nodes) { IR::Exit exit{}; // use to capture last node diff --git a/include/IR/Instruction.hpp b/include/IR/Instruction.hpp index f51156cfc..abc1fdf2c 100644 --- a/include/IR/Instruction.hpp +++ b/include/IR/Instruction.hpp @@ -27,7 +27,6 @@ #include #include #include -#include namespace poly { using math::PtrVector, math::MutPtrVector, alloc::Arena, utils::invariant, diff --git a/include/IR/InstructionCost.hpp b/include/IR/InstructionCost.hpp index f801e6cb7..2ce8a9b80 100644 --- a/include/IR/InstructionCost.hpp +++ b/include/IR/InstructionCost.hpp @@ -1,7 +1,6 @@ #pragma once #include #include -#include #include #include #include diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index f18a7ec0e..097043580 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -278,6 +278,7 @@ static_assert(sizeof(Node) == 4 * sizeof(Node *) + 8); /// Loop /// parent: outer loop /// child: inner (sub) loop +/// last is the last instruction in the body /// exit is the associated exit block class Loop : public Node { enum LegalTransforms { @@ -391,6 +392,8 @@ class Loop : public Node { return static_cast(parent); } +/// This is used for convenience in top sort, but our canonical IR +/// does not actually contain Exit nodes! struct Exit : Node { Exit() : Node(VK_Exit) {} static constexpr auto classof(const Node *v) -> bool { diff --git a/include/IR/OrthogonalAxes.hpp b/include/IR/OrthogonalAxes.hpp new file mode 100644 index 000000000..b2da1a7c3 --- /dev/null +++ b/include/IR/OrthogonalAxes.hpp @@ -0,0 +1,13 @@ +#pragma once +#ifndef OrthogonalAxes_hpp_INCLUDED +#define OrthogonalAxes_hpp_INCLUDED + +/// `indep` must be `0` for any `invunrolls` it doesn't depend on +struct OrthogonalAxes { + uint32_t indep_axes : 1; + uint32_t contig : 31; // max number of dims of 31 + uint32_t indep; // max loop depth of 32 +}; +static_assert(sizeof(OrthogonalAxes) == 8); + +#endif // OrthogonalAxes_hpp_INCLUDED diff --git a/include/IR/RegisterFile.hpp b/include/IR/RegisterFile.hpp new file mode 100644 index 000000000..62bbb37de --- /dev/null +++ b/include/IR/RegisterFile.hpp @@ -0,0 +1,78 @@ +#pragma once +#ifndef RegisterFile_hpp_INCLUDED +#define RegisterFile_hpp_INCLUDED + +#include +#include + +class CPURegisterFile { + uint8_t maximumVectorWidth; + uint8_t numVectorRegisters; + uint8_t numGeneralPurposeRegisters; + uint8_t numPredicateRegisters; + +#if defined(__x86_64__) + // hacky check for has AVX512 + static inline auto hasAVX512(llvm::LLVMContext &C, + const llvm::TargetTransformInfo &TTI) -> bool { + return TTI.isLegalMaskedExpandLoad( + llvm::FixedVectorType::get(llvm::Type::getDoubleTy(C), 8)); + } +#else + // assume we're not cross-compiling to x64 from some other arch to reduce the + // risk of false positives + static constexpr hasAVX512(llvm::LLVMContext &, + const llvm::TargetTransformInfo &) + ->bool { + return false; + } +#endif + + static auto estimateNumPredicateRegisters( + llvm::LLVMContext &C, const llvm::TargetTransformInfo &TTI) -> uint8_t { + if (TTI.supportsScalableVectors()) return 8; + // hacky check for AVX512 + if (hasAVX512(C, TTI)) return 7; // 7, because k0 is reserved for unmasked + return 0; + } + // returns vector width in bytes, ignoring mprefer-vector-width + static auto estimateMaximumVectorWidth(llvm::LLVMContext &C, + const llvm::TargetTransformInfo &TTI) + -> uint8_t { + uint8_t twiceMaxVectorWidth = 2; + auto *f32 = llvm::Type::getFloatTy(C); + llvm::InstructionCost prevCost = TTI.getArithmeticInstrCost( + llvm::Instruction::FAdd, + llvm::FixedVectorType::get(f32, twiceMaxVectorWidth)); + while (true) { + llvm::InstructionCost nextCost = TTI.getArithmeticInstrCost( + llvm::Instruction::FAdd, + llvm::FixedVectorType::get(f32, twiceMaxVectorWidth *= 2)); + if (nextCost > prevCost) break; + prevCost = nextCost; + } + return 2 * twiceMaxVectorWidth; + } + +public: + CPURegisterFile(llvm::LLVMContext &C, const llvm::TargetTransformInfo &TTI) { + maximumVectorWidth = estimateMaximumVectorWidth(C, TTI); + numVectorRegisters = TTI.getNumberOfRegisters(true); + numGeneralPurposeRegisters = TTI.getNumberOfRegisters(false); + numPredicateRegisters = estimateNumPredicateRegisters(C, TTI); + } + [[nodiscard]] constexpr auto getNumVectorBits() const -> uint8_t { + return maximumVectorWidth; + } + [[nodiscard]] constexpr auto getNumVector() const -> uint8_t { + return numVectorRegisters; + } + [[nodiscard]] constexpr auto getNumScalar() const -> uint8_t { + return numGeneralPurposeRegisters; + } + [[nodiscard]] constexpr auto getNumPredicate() const -> uint8_t { + return numPredicateRegisters; + } +}; + +#endif // RegisterFile_hpp_INCLUDED diff --git a/include/LinearProgramming/LoopBlock.hpp b/include/LinearProgramming/LoopBlock.hpp index def450d78..468182981 100644 --- a/include/LinearProgramming/LoopBlock.hpp +++ b/include/LinearProgramming/LoopBlock.hpp @@ -198,6 +198,11 @@ class LoopBlock { } private: + struct LoadSummary { + Value *store; + poly::Loop *deepestLoop; + IR::AddrChain ac; + }; auto addScheduledNode(IR::Cache &cache, IR::Stow stow, IR::AddrChain addr) -> OptimizationResult { // how are we going to handle load duplication? @@ -258,8 +263,7 @@ class LoopBlock { /// // NOLINTNEXTLINE(misc-no-recursion) auto searchOperandsForLoads(IR::Cache &cache, IR::Stow stow, Value *val, - IR::AddrChain addr) - -> std::tuple { + IR::AddrChain addr) -> LoadSummary { auto *inst = llvm::dyn_cast(val); if (!inst) return {val, nullptr, addr}; // we use parent/child relationships here instead of next/prev diff --git a/include/Polyhedra/Loops.hpp b/include/Polyhedra/Loops.hpp index a5078ce41..5c91113d8 100644 --- a/include/Polyhedra/Loops.hpp +++ b/include/Polyhedra/Loops.hpp @@ -182,9 +182,8 @@ inline auto addRecMatchesLoop(const llvm::SCEV *S, llvm::Loop *L) -> bool { return x->getLoop() == L; return false; } -[[nodiscard]] inline auto -addSymbol(std::array>, 2> - &AB, // NOLINT(misc-no-recursion) +[[nodiscard]] inline auto // NOLINTNEXTLINE(misc-no-recursion) +addSymbol(std::array>, 2> &AB, llvm::SmallVectorImpl &symbols, llvm::Loop *L, const llvm::SCEV *v, llvm::ScalarEvolution &SE, math::Range lu, int64_t mlt, ptrdiff_t minDepth) @@ -222,7 +221,6 @@ addSymbol(std::array>, 2> minDepth = addSymbol(AB, symbols, L, x->getOperand(0), SE, lu, mlt, minDepth); if (auto opc = getConstantInt(x->getOperand(1))) { - // swap order vs recDepth to go inner<->outer B[lu, recDepth - 1] << mlt * (*opc); return minDepth; } @@ -836,13 +834,15 @@ class Loop : public BasePolyhedra { const void *ptr = memory + sizeof(const llvm::SCEV *const *) * numDynSymbols; auto *p = (int64_t *)const_cast(ptr); - return {p, math::DenseDims<>{{numConstraints}, {numLoops + numDynSymbols + 1}}}; + return { + p, math::DenseDims<>{{numConstraints}, {numLoops + numDynSymbols + 1}}}; }; [[nodiscard]] constexpr auto getA() const -> DensePtrMatrix { const void *ptr = memory + sizeof(const llvm::SCEV *const *) * numDynSymbols; auto *p = (int64_t *)const_cast(ptr); - return {p, math::DenseDims<>{{numConstraints}, {numLoops + numDynSymbols + 1}}}; + return { + p, math::DenseDims<>{{numConstraints}, {numLoops + numDynSymbols + 1}}}; }; [[nodiscard]] constexpr auto getOuterA(ptrdiff_t subLoop) -> MutPtrMatrix { @@ -850,8 +850,8 @@ class Loop : public BasePolyhedra { memory + sizeof(const llvm::SCEV *const *) * numDynSymbols; auto *p = (int64_t *)const_cast(ptr); ptrdiff_t numSym = numDynSymbols + 1; - return {p, math::StridedDims<>{{numConstraints}, {subLoop + numSym}, - {numLoops + numSym}}}; + return {p, math::StridedDims<>{ + {numConstraints}, {subLoop + numSym}, {numLoops + numSym}}}; }; [[nodiscard]] constexpr auto getOuterA(ptrdiff_t subLoop) const -> PtrMatrix { @@ -859,8 +859,8 @@ class Loop : public BasePolyhedra { memory + sizeof(const llvm::SCEV *const *) * numDynSymbols; auto *p = (int64_t *)const_cast(ptr); ptrdiff_t numSym = numDynSymbols + 1; - return {p, math::StridedDims<>{{numConstraints}, {subLoop + numSym}, - {numLoops + numSym}}}; + return {p, math::StridedDims<>{ + {numConstraints}, {subLoop + numSym}, {numLoops + numSym}}}; }; [[nodiscard]] auto getSyms() -> llvm::MutableArrayRef { void *ptr = memory; From 130f346f7264f6661dd3bee2300d3292fbe42744 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Wed, 1 Nov 2023 03:37:58 -0400 Subject: [PATCH 058/112] compute and load rt cost --- include/IR/Address.hpp | 7 ++++++ include/IR/CostFunction.hpp | 43 +++++++++++++++++++++++++++++++---- include/IR/Instruction.hpp | 31 +++++++++++++++++++++++-- include/IR/OrthogonalAxes.hpp | 6 +++++ 4 files changed, 81 insertions(+), 6 deletions(-) diff --git a/include/IR/Address.hpp b/include/IR/Address.hpp index e91f3125c..261cb230d 100644 --- a/include/IR/Address.hpp +++ b/include/IR/Address.hpp @@ -140,6 +140,7 @@ class Addr : public Instruction { invariant((depth <= 24) && (depth >= 0)); invariant(depth >= naturalDepth); invariant(currentDepth >= depth); + currentDepth=depth; bool indepAxes = true; uint32_t contig{0}, indep{(uint32_t(1) << depth) - 1}; /// indexMatrix() -> arrayDim() x getNumLoops() @@ -564,6 +565,12 @@ class Addr : public Instruction { double contiguous; double discontiguous; double scalar; + constexpr auto operator+=(Costs c) -> Costs & { + contiguous += c.contiguous; + discontiguous += c.discontiguous; + scalar += c.scalar; + return *this; + } }; auto calcCostContigDiscontig(const llvm::TargetTransformInfo &TTI, unsigned int vectorWidth) -> Costs { diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp index 9a26db3f2..50ce9e946 100644 --- a/include/IR/CostFunction.hpp +++ b/include/IR/CostFunction.hpp @@ -467,7 +467,7 @@ class LoopTreeCostFn { math::Vector cost_counts{}; math::Vector orth_axes{}; math::Vector>> conv_axes{}; - math::Vector> compute_independence{}; + math::Vector> compute_independence{}; math::Vector>> leafs{}; unsigned maxVectorBytes; ptrdiff_t max_depth; @@ -548,21 +548,56 @@ class LoopTreeCostFn { } // should only have to `init` once per `root`, with `VectorizationFactor` // being adjustable. + // Note: we are dependent upon scanning in top order, so that operands' + // `calcLoopDepFlag()` are calculated before we get. // TODO: vec factor should be a tree-flag - void init(IR::Loop *root, unsigned maxVF, + void init(IR::Loop *root, unsigned maxl2VF, const llvm::TargetTransformInfo &TTI) { clear(); // max_depth = 0; // the root is top-level IR::Loop *L = root->getSubLoop(); ptrdiff_t depth = 0; - uint16_t omemory, cmemory, exit, compute; + uint16_t omemory{0}, cmemory{0}, exit{0}, compute{0}; + unsigned maxVF = 1 << maxl2VF; IR::Node *child; for (IR::Node *N = L->getChild(); N;) { if (auto *A = llvm::dyn_cast(N)) { OrthogonalAxes oa = A->calcOrthAxes(depth); IR::Addr::Costs rtl = A->calcCostContigDiscontig(TTI, maxVF); - + if (oa.indep_axes) { + // check for duplicate + bool found = false; + for (ptrdiff_t i = omemory; i < orth_axes.size(); ++i) { + if (orth_axes[i].orth != oa) continue; + found = true; + orth_axes[i].memcost += rtl; + break; + } + if (!found) orth_axes.emplace_back(rtl, oa); + } else { + bool found = false; + for (ptrdiff_t i = cmemory; i < conv_axes.size(); ++i) { + if (conv_axes[i].first.orth != oa) continue; + if (conv_axes[i].second != A->indexMatrix()) continue; + found = true; + conv_axes[i].first.memcost += rtl; + break; + } + if (!found) + conv_axes.emplace_back(MemCostSummary{rtl, oa}, A->indexMatrix()); + } } else if (auto *C = llvm::dyn_cast(N)) { + bool found = false; + uint32_t indep = C->calcLoopDepFlag(depth); + float cc{float( + C->getCost(TTI, IR::VectorWidth{maxVF, maxl2VF}).recipThroughput)}; + for (ptrdiff_t i = compute; i < compute_independence.size(); ++i) { + if (compute_independence[i].second != indep) continue; + found = true; + compute_independence[i].first += cc; + break; + } + if (!found) compute_independence.emplace_back(cc, indep); } else if (auto *S = llvm::dyn_cast(N)) { // we enter subloop, S } else if (auto *E = llvm::dyn_cast(N)) { diff --git a/include/IR/Instruction.hpp b/include/IR/Instruction.hpp index abc1fdf2c..a20e5cc77 100644 --- a/include/IR/Instruction.hpp +++ b/include/IR/Instruction.hpp @@ -5,9 +5,9 @@ #include "IR/InstructionCost.hpp" #include "IR/Node.hpp" #include "IR/Predicate.hpp" +#include #include #include -#include #include #include #include @@ -72,9 +72,10 @@ class Compute : public Instruction { llvm::Instruction *inst{nullptr}; llvm::Type *type; llvm::Intrinsic::ID opId; // unsigned - int numOperands; // negative means incomplete llvm::FastMathFlags fastMathFlags; // holds unsigned VectorizationCosts costs; + uint32_t loopIndepFlag; + int numOperands; // negative means incomplete #if !defined(__clang__) && defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wpedantic" @@ -89,6 +90,19 @@ class Compute : public Instruction { #pragma clang diagnostic pop #endif + static constexpr auto diffMask(ptrdiff_t smaller, ptrdiff_t larger) + -> uint32_t { + invariant(smaller <= larger); + invariant(larger < 32); + // return ((uint32_t(1) << (larger - smaller)) - 1) << smaller; + uint32_t umask = ((uint32_t(1) << larger) - 1), + lmask = ((uint32_t(1) << smaller) - 1); + return umask ^ lmask; + } + static constexpr auto diffMask(Value *v, ptrdiff_t depth) -> uint32_t { + return diffMask(v->getCurrentDepth(), depth); + } + public: Compute(const Compute &) = delete; Compute(ValKind k, llvm::Instruction *i, llvm::Intrinsic::ID id, int numOps) @@ -146,6 +160,19 @@ class Compute : public Instruction { constexpr auto getOperands() -> MutPtrVector { return {operands, numOperands}; } + [[nodiscard]] constexpr auto getLoopIndepFlag() const { + return loopIndepFlag; + } + constexpr auto calcLoopDepFlag(ptrdiff_t depth) -> uint32_t { + this->currentDepth = depth; + loopIndepFlag = (1 << depth) - 1; + for (auto *op : getOperands()) + if (auto *C = llvm::dyn_cast(op)) + loopIndepFlag &= C->getLoopIndepFlag() | diffMask(C, depth); + else if (auto *A = llvm::dyn_cast(op)) + loopIndepFlag &= A->getOrthAxes().indep | diffMask(C, depth); + return loopIndepFlag; + } [[nodiscard]] constexpr auto getOperands() const -> PtrVector { return {const_cast(operands), unsigned(numOperands)}; } diff --git a/include/IR/OrthogonalAxes.hpp b/include/IR/OrthogonalAxes.hpp index b2da1a7c3..37a283749 100644 --- a/include/IR/OrthogonalAxes.hpp +++ b/include/IR/OrthogonalAxes.hpp @@ -2,12 +2,18 @@ #ifndef OrthogonalAxes_hpp_INCLUDED #define OrthogonalAxes_hpp_INCLUDED +#include +#include + /// `indep` must be `0` for any `invunrolls` it doesn't depend on struct OrthogonalAxes { uint32_t indep_axes : 1; uint32_t contig : 31; // max number of dims of 31 uint32_t indep; // max loop depth of 32 }; +constexpr auto operator==(OrthogonalAxes a, OrthogonalAxes b) -> bool { + return std::bit_cast(a) == std::bit_cast(b); +} static_assert(sizeof(OrthogonalAxes) == 8); #endif // OrthogonalAxes_hpp_INCLUDED From a2e68091ad9358c1bb5d0eed1b524112aded34a1 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Thu, 2 Nov 2023 08:31:11 -0400 Subject: [PATCH 059/112] comments on costfun init iter order --- include/IR/CostFunction.hpp | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp index 50ce9e946..4c92f0cd0 100644 --- a/include/IR/CostFunction.hpp +++ b/include/IR/CostFunction.hpp @@ -538,7 +538,7 @@ class LoopTreeCostFn { c += tripcounts[depth] * cc; // Decrement depth by `exit - 1`; the `-1` corresponds // to descending into this header, while we exit `exit` loops afterwards. - depth -= exit - 1; + depth -= exit - 1; // don't fuse `-1` to keep `exit` unsigned if (depth <= std::countr_zero(vf.indexMask)) { vf.l2factor = 0; vf.indexMask = 0; @@ -551,6 +551,25 @@ class LoopTreeCostFn { // Note: we are dependent upon scanning in top order, so that operands' // `calcLoopDepFlag()` are calculated before we get. // TODO: vec factor should be a tree-flag + // Iteration order: + // We fully iterate over a loop before descending + // for (i : I){ + // // block 0 + // for (j : J){ + // // block 1 + // } + // // block 2 + // for (j : J){ + // // block 3 + // } + // // block 4 + // } + // we'd iterate 0, 2, 4, 1, 3. + // This way we can store once we hit the end. + // If there are no subloops to iterate to after, then we store the exit count. + // If there are, then the exit-count is 0, forward '1+exit' count to the last + // sub-loop, and `1` to all previous sub-loops. + // It's thus natural to implement recursively. void init(IR::Loop *root, unsigned maxl2VF, const llvm::TargetTransformInfo &TTI) { clear(); // max_depth = 0; From 32f436e7fb2dea70f74321a7eae62402e2792347 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Fri, 3 Nov 2023 04:36:31 -0400 Subject: [PATCH 060/112] some further progress --- include/IR/CostFunction.hpp | 189 ++++++++++++++++++++---------------- include/Polyhedra/Loops.hpp | 32 +++++- 2 files changed, 138 insertions(+), 83 deletions(-) diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp index 4c92f0cd0..9fa86ca78 100644 --- a/include/IR/CostFunction.hpp +++ b/include/IR/CostFunction.hpp @@ -48,8 +48,8 @@ struct LoopCostCounts { uint16_t compute; uint16_t omemory; uint8_t cmemory; - uint8_t exit : 5; /// how many blocks we exit after this - uint8_t l2vectorWidth : 3; // 1<<7 == 128 + uint8_t exit : 5; /// how many blocks we exit after this + uint8_t l2vectorWidth : 3 {0}; // 1<<7 == 128 }; static_assert(sizeof(LoopCostCounts) == 8); @@ -469,8 +469,8 @@ class LoopTreeCostFn { math::Vector>> conv_axes{}; math::Vector> compute_independence{}; math::Vector>> leafs{}; - unsigned maxVectorBytes; - ptrdiff_t max_depth; + unsigned maxVectorWidth; + ptrdiff_t max_depth{}; constexpr void clear() { cost_counts.clear(); @@ -481,6 +481,106 @@ class LoopTreeCostFn { max_depth = 0; } + // should only have to `init` once per `root`, with `VectorizationFactor` + // being adjustable. + // Note: we are dependent upon scanning in top order, so that operands' + // `calcLoopDepFlag()` are calculated before we get. + // TODO: vec factor should be a tree-flag + // Iteration order: + // We fully iterate over a loop before descending + // for (i : I){ + // // block 0 + // for (j : J){ + // // block 1 + // } + // // block 2 + // for (j : J){ + // // block 3 + // } + // // block 4 + // } + // we'd iterate 0, 2, 4, 1, 3. + // This way we can store once we hit the end. + // If there are no subloops to iterate to after, then we store the exit count. + // If there are, then the exit-count is 0, forward '1+exit' count to the last + // sub-loop, and `1` to all previous sub-loops. + // It's thus natural to implement recursively. + // NOLINTNEXTLINE(misc-no-recursion) + void initLoop(IR::Loop *L, unsigned maxl2VF, + const llvm::TargetTransformInfo &TTI, ptrdiff_t depth, + unsigned exitCount) { + invariant(depth > 0); + ptrdiff_t compute = compute_independence.size(), omemory = orth_axes.size(), + cmemory = conv_axes.size(); + unsigned maxVF = 1 << maxl2VF; + // Loop and push throughput costs + for (IR::Node *N = L->getChild(); N; N = N->getNext()) { + if (auto *A = llvm::dyn_cast(N)) { + OrthogonalAxes oa = A->calcOrthAxes(depth); + IR::Addr::Costs rtl = A->calcCostContigDiscontig(TTI, maxVF); + if (oa.indep_axes) { + // check for duplicate + bool found = false; + for (ptrdiff_t i = omemory; i < orth_axes.size(); ++i) { + if (orth_axes[i].orth != oa) continue; + found = true; + orth_axes[i].memcost += rtl; + break; + } + if (!found) orth_axes.emplace_back(rtl, oa); + } else { + bool found = false; + for (ptrdiff_t i = cmemory; i < conv_axes.size(); ++i) { + if (conv_axes[i].first.orth != oa) continue; + if (conv_axes[i].second != A->indexMatrix()) continue; + found = true; + conv_axes[i].first.memcost += rtl; + break; + } + if (!found) + conv_axes.emplace_back(MemCostSummary{rtl, oa}, A->indexMatrix()); + } + } else if (auto *C = llvm::dyn_cast(N)) { + bool found = false; + uint32_t indep = C->calcLoopDepFlag(depth); + float cc{float( + C->getCost(TTI, IR::VectorWidth{maxVF, maxl2VF}).recipThroughput)}; + for (ptrdiff_t i = compute; i < compute_independence.size(); ++i) { + if (compute_independence[i].second != indep) continue; + found = true; + compute_independence[i].first += cc; + break; + } + if (!found) compute_independence.emplace_back(cc, indep); + } // else if (auto *S = llvm::dyn_cast(N)) { + } + auto [known_trip, trip_count] = L->getAffineLoop()->tripCount(depth); + uint16_t compcnt = compute_independence.size() - compute, + omemcnt = orth_axes.size() - omemory, + cmemcnt = conv_axes.size() - cmemory; + IR::Loop *SL = L->getSubLoop(); + cost_counts.emplace_back(known_trip, trip_count, compcnt, omemcnt, cmemcnt, + SL ? 0 : exitCount); + if (SL) iterLoopLevel(SL, maxl2VF, TTI, ++depth, exitCount); + // TODO: if (!SL) we're in a leaf, and need compute latency + // The process here is to check if any computations are stored outside of + // this loop. If so, walk predecessors (counting accumulated latency as we + // go) to find a chain. We also track if we're able to reassociate the + // chain, i.e. if we're able to split accumulators (e.g. are they all + // additions with reassoc flag?). + } + // NOLINTNEXTLINE(misc-no-recursion) + void iterLoopLevel(IR::Loop *L, unsigned maxl2VF, + const llvm::TargetTransformInfo &TTI, ptrdiff_t depth, + unsigned exitCount) { + do { + IR::Loop *N = L->getNextLoop(); + unsigned ec = N ? ++exitCount : 1; + initLoop(L, maxl2VF, TTI, depth, ec); + L = N; + } while (L); + } + public: // this is a vector fun, where indexing may do non-trivial computation // also, mapping from this vector to loop position isn't trivial either @@ -546,89 +646,14 @@ class LoopTreeCostFn { } return c; } - // should only have to `init` once per `root`, with `VectorizationFactor` - // being adjustable. - // Note: we are dependent upon scanning in top order, so that operands' - // `calcLoopDepFlag()` are calculated before we get. - // TODO: vec factor should be a tree-flag - // Iteration order: - // We fully iterate over a loop before descending - // for (i : I){ - // // block 0 - // for (j : J){ - // // block 1 - // } - // // block 2 - // for (j : J){ - // // block 3 - // } - // // block 4 - // } - // we'd iterate 0, 2, 4, 1, 3. - // This way we can store once we hit the end. - // If there are no subloops to iterate to after, then we store the exit count. - // If there are, then the exit-count is 0, forward '1+exit' count to the last - // sub-loop, and `1` to all previous sub-loops. - // It's thus natural to implement recursively. void init(IR::Loop *root, unsigned maxl2VF, const llvm::TargetTransformInfo &TTI) { clear(); // max_depth = 0; - // the root is top-level - IR::Loop *L = root->getSubLoop(); - ptrdiff_t depth = 0; - uint16_t omemory{0}, cmemory{0}, exit{0}, compute{0}; - unsigned maxVF = 1 << maxl2VF; - IR::Node *child; - for (IR::Node *N = L->getChild(); N;) { - if (auto *A = llvm::dyn_cast(N)) { - OrthogonalAxes oa = A->calcOrthAxes(depth); - IR::Addr::Costs rtl = A->calcCostContigDiscontig(TTI, maxVF); - if (oa.indep_axes) { - // check for duplicate - bool found = false; - for (ptrdiff_t i = omemory; i < orth_axes.size(); ++i) { - if (orth_axes[i].orth != oa) continue; - found = true; - orth_axes[i].memcost += rtl; - break; - } - if (!found) orth_axes.emplace_back(rtl, oa); - } else { - bool found = false; - for (ptrdiff_t i = cmemory; i < conv_axes.size(); ++i) { - if (conv_axes[i].first.orth != oa) continue; - if (conv_axes[i].second != A->indexMatrix()) continue; - found = true; - conv_axes[i].first.memcost += rtl; - break; - } - if (!found) - conv_axes.emplace_back(MemCostSummary{rtl, oa}, A->indexMatrix()); - } - } else if (auto *C = llvm::dyn_cast(N)) { - bool found = false; - uint32_t indep = C->calcLoopDepFlag(depth); - float cc{float( - C->getCost(TTI, IR::VectorWidth{maxVF, maxl2VF}).recipThroughput)}; - for (ptrdiff_t i = compute; i < compute_independence.size(); ++i) { - if (compute_independence[i].second != indep) continue; - found = true; - compute_independence[i].first += cc; - break; - } - if (!found) compute_independence.emplace_back(cc, indep); - } else if (auto *S = llvm::dyn_cast(N)) { - // we enter subloop, S - } else if (auto *E = llvm::dyn_cast(N)) { - max_depth = std::max(max_depth, depth); - // E->getParent()->getNext() returns following instr - // With this, we increment exit count - } - N = N->getNext(); - } + iterLoopLevel(root->getSubLoop(), maxl2VF, TTI, 0, 0); } LoopTreeCostFn(IR::Loop *root, unsigned maxVF, - const llvm::TargetTransformInfo &TTI) { + const llvm::TargetTransformInfo &TTI) + : maxVectorWidth{unsigned(1) << maxVF} { init(root, maxVF, TTI); } }; diff --git a/include/Polyhedra/Loops.hpp b/include/Polyhedra/Loops.hpp index 5c91113d8..86e85da2b 100644 --- a/include/Polyhedra/Loops.hpp +++ b/include/Polyhedra/Loops.hpp @@ -416,7 +416,32 @@ class Loop : public BasePolyhedra { // removeInnerMost later. // pruneBounds(); } - + /// Gives a very rough trip count estimate (second return value) + /// with a boolean fist arg indicating whether it is exact or estimated. + /// The estimation approach here can be seriously improved. + /// Currently, if not exact, it simply returns 128. + [[nodiscard]] auto tripCount(ptrdiff_t depth) const + -> std::array { + auto A{getA()}; + // `i` is position of depth's indvar + ptrdiff_t i = 1 + numDynSymbols + depth, j = -1, k = -1; + // `A * loopindvars >= 0` + // Aci >= 0 is a lower bound + // Aci <= 0 is an upper bound + for (ptrdiff_t c = 0; c < A.numRow(); ++c) { + int64_t Aci = A[c, i]; + if (Aci > 0) { + if ((j >= 0) || (!math::allZero(A[c, _(1, i)]))) return {0, 128}; + j = c; + } else if (Aci < 0) { + if ((k >= 0) || (!math::allZero(A[c, _(1, i)]))) return {0, 128}; + k = c; + } + } + invariant(j >= 0); // must have lower bound + invariant(k >= 0); // must have upper bound + return {1, std::min(0xffff, A[k, 0] - A[j, 0])}; + } auto findIndex(const llvm::SCEV *v) const -> ptrdiff_t { return findSymbolicIndex(getSyms(), v); } @@ -837,6 +862,11 @@ class Loop : public BasePolyhedra { return { p, math::DenseDims<>{{numConstraints}, {numLoops + numDynSymbols + 1}}}; }; + /// returns the `A` where `A * i >= 0`, `i` are loop indvars + /// Number of rows indicate number of constraints, columns are + /// /// returns the `A` where `A * i >= 0`, `i` are loop indvars + /// Number of rows indicate number of constraints, columns are + /// 1 (constant) + numDynSymbols + number of loops [[nodiscard]] constexpr auto getA() const -> DensePtrMatrix { const void *ptr = memory + sizeof(const llvm::SCEV *const *) * numDynSymbols; From 6fb9a7193c1abf196307bc70d27cd61688dc1499 Mon Sep 17 00:00:00 2001 From: chriselrod Date: Sat, 4 Nov 2023 21:32:14 -0400 Subject: [PATCH 061/112] minor progress; thread loop dep sat through to cost fun constructor --- include/IR/ControlFlowMerging.hpp | 24 +++++++-------- include/IR/CostFunction.hpp | 51 ++++++++++++++++++++++--------- include/IR/CostModeling.hpp | 22 +++++++++++-- include/IR/Instruction.hpp | 17 ++++++++--- include/IR/Node.hpp | 2 +- 5 files changed, 82 insertions(+), 34 deletions(-) diff --git a/include/IR/ControlFlowMerging.hpp b/include/IR/ControlFlowMerging.hpp index a275c437a..a228756a0 100644 --- a/include/IR/ControlFlowMerging.hpp +++ b/include/IR/ControlFlowMerging.hpp @@ -1,11 +1,11 @@ #pragma once +#include "Alloc/Arena.hpp" #include "Dicts/BumpMapSet.hpp" #include "IR/BBPredPath.hpp" #include "IR/Cache.hpp" #include "IR/Instruction.hpp" #include "IR/Predicate.hpp" -#include "Alloc/Arena.hpp" #include #include #include @@ -216,7 +216,7 @@ struct MergingCost { // select(p, f(a,b), f(c,d)) => f(select(p, a, c), select(p, b, d)) // but we can often do better, e.g. we may have // select(p, f(a,b), f(c,b)) => f(select(p, a, c), b) - // additionally, we can check `I->associativeOperandsFlag()` + // additionally, we can check `I->commutativeOperandsFlag()` // select(p, f(a,b), f(c,a)) => f(a, select(p, b, c)) // we need to figure out which operands we're merging with which, // @@ -224,26 +224,26 @@ struct MergingCost { // arguments are merged, as this may be common when two // control flow branches have relatively similar pieces. // E.g., if b and c are already merged, - // and if `f`'s ops are associative, then we'd get + // and if `f`'s ops are commutative, then we'd get // select(p, f(a,b), f(c,a)) => f(a, b) // so we need to check if any operand pairs are merged with each other. // note `isMerged(a,a) == true`, so that's the one query we need to use. auto selector = init(selects, A, B); MutPtrVector operandsA = A->getOperands(); MutPtrVector operandsB = B->getOperands(); - size_t numOperands = operandsA.size(); + ptrdiff_t numOperands = operandsA.size(); assert(numOperands == operandsB.size()); /// associate ops means `f(a, b) == f(b, a)` - uint8_t associativeOpsFlag = B->associativeOperandsFlag(); + uint8_t commutativeOpsFlag = B->commutativeOperandsFlag(); // For example, // we keep track of which operands we've already merged, // f(a, b), f(b, b) // we can't merge b twice! - for (size_t i = 0; i < numOperands; ++i) { + for (ptrdiff_t i = 0; i < numOperands; ++i) { auto *opA = A->getOperand(i); auto *opB = B->getOperand(i); - auto [assoc, assocFlag] = popBit(associativeOpsFlag); - associativeOpsFlag = assocFlag; + auto [assoc, assocFlag] = popBit(commutativeOpsFlag); + commutativeOpsFlag = assocFlag; if (opA == opB) continue; // if both operands were merged, we can ignore it's associativity if (isMerged(opB, opA)) { @@ -252,7 +252,7 @@ struct MergingCost { continue; } if (!((assoc) && (assocFlag))) { - // this op isn't associative with any remaining + // this op isn't commutative with any remaining selector.select(i, opA, opB); continue; } @@ -371,7 +371,7 @@ struct MergingCost { inline void mergeInstructions( Arena<> *alloc, IR::Cache &cache, Predicate::Map &predMap, const llvm::TargetTransformInfo &TTI, unsigned int vectorBits, - amap> + amap> opMap, amap &valToPred, llvm::SmallVectorImpl &mergingCosts, Instruction *J, @@ -429,7 +429,7 @@ inline void mergeInstructions( } // descendants aren't legal merge candidates, so push after merging if (vec.getCapacity() <= vec.size()) - vec.reserve(alloc, std::max(unsigned(8), 2 * vec.size())); + vec.reserve(alloc, std::max(ptrdiff_t(8), 2 * vec.size())); vec.push_back(J); valToPred[J] = preds; // TODO: prune bad candidates from mergingCosts @@ -454,7 +454,7 @@ mergeInstructions(IR::Cache &cache, Predicate::Map &predMap, tr = trret; if (!predMap.isDivergent()) return tr; // there is a divergence in the control flow that we can ideally merge - amap> + amap> opMap{&tAlloc}; amap valToPred{&tAlloc}; llvm::SmallVector mergingCosts; diff --git a/include/IR/CostFunction.hpp b/include/IR/CostFunction.hpp index 9fa86ca78..a5d0a0d26 100644 --- a/include/IR/CostFunction.hpp +++ b/include/IR/CostFunction.hpp @@ -3,7 +3,9 @@ #include "IR/Address.hpp" #include "IR/Instruction.hpp" #include "IR/Node.hpp" +#include "IR/CostModeling.hpp" #include "IR/OrthogonalAxes.hpp" +#include "Polyhedra/Dependence.hpp" #include #include #include @@ -506,7 +508,7 @@ class LoopTreeCostFn { // sub-loop, and `1` to all previous sub-loops. // It's thus natural to implement recursively. // NOLINTNEXTLINE(misc-no-recursion) - void initLoop(IR::Loop *L, unsigned maxl2VF, + void initLoop(LoopDepSatisfaction deps, IR::Loop *L, unsigned maxl2VF, const llvm::TargetTransformInfo &TTI, ptrdiff_t depth, unsigned exitCount) { invariant(depth > 0); @@ -561,22 +563,43 @@ class LoopTreeCostFn { IR::Loop *SL = L->getSubLoop(); cost_counts.emplace_back(known_trip, trip_count, compcnt, omemcnt, cmemcnt, SL ? 0 : exitCount); - if (SL) iterLoopLevel(SL, maxl2VF, TTI, ++depth, exitCount); - // TODO: if (!SL) we're in a leaf, and need compute latency - // The process here is to check if any computations are stored outside of - // this loop. If so, walk predecessors (counting accumulated latency as we - // go) to find a chain. We also track if we're able to reassociate the - // chain, i.e. if we're able to split accumulators (e.g. are they all - // additions with reassoc flag?). + if (SL) iterLoopLevel(deps, SL, maxl2VF, TTI, ++depth, exitCount); + else leafCosts(deps, L, maxl2VF, TTI); } + void leafCosts(LoopDepSatisfaction deps, IR::Loop *L, unsigned maxl2VF, + const llvm::TargetTransformInfo &TTI) { + // TODO: if (!SL) we're in a leaf, and need compute latency + // We use the `IROptimizer::loopDepSats` to check the depencencies held at + // the loop. We check these for those that look like reductions that are + // legal to reassociate, e.g. integer add chains or floating point with the + // reassociate FMF set. We can also calculate the latency while walking the + // chain. Note that in our IR, dependencies may look something like this + // after load/store hoisting: for (j in J){ // arbitrary number of outer + // loops + // %w = %array[j...]; + // %x = foo(%w); + // for (i in I){ // inner loop(s) + // %y = bar(%x); + // } + // %z = quz(%y); + // %array[j...] = %z; + // } + // Rather than using PhiNodes, we represent dependencies through addresses. + bool vectorizationLegal = true, unrollLegal = true; + for (poly::Dependence d : deps.depencencies(L)){ + // is + } + // for (IR::Node *N = L->getChild(); N; N = N->getNext()) {} + return; + }; // NOLINTNEXTLINE(misc-no-recursion) - void iterLoopLevel(IR::Loop *L, unsigned maxl2VF, + void iterLoopLevel(LoopDepSatisfaction deps, IR::Loop *L, unsigned maxl2VF, const llvm::TargetTransformInfo &TTI, ptrdiff_t depth, unsigned exitCount) { do { IR::Loop *N = L->getNextLoop(); unsigned ec = N ? ++exitCount : 1; - initLoop(L, maxl2VF, TTI, depth, ec); + initLoop(deps, N, maxl2VF, TTI, depth, ec); L = N; } while (L); } @@ -646,15 +669,15 @@ class LoopTreeCostFn { } return c; } - void init(IR::Loop *root, unsigned maxl2VF, + void init(LoopDepSatisfaction deps, IR::Loop *root, unsigned maxl2VF, const llvm::TargetTransformInfo &TTI) { clear(); // max_depth = 0; - iterLoopLevel(root->getSubLoop(), maxl2VF, TTI, 0, 0); + iterLoopLevel(deps, root->getSubLoop(), maxl2VF, TTI, 0, 0); } - LoopTreeCostFn(IR::Loop *root, unsigned maxVF, + LoopTreeCostFn(LoopDepSatisfaction deps, IR::Loop *root, unsigned maxVF, const llvm::TargetTransformInfo &TTI) : maxVectorWidth{unsigned(1) << maxVF} { - init(root, maxVF, TTI); + init(deps, root, maxVF, TTI); } }; diff --git a/include/IR/CostModeling.hpp b/include/IR/CostModeling.hpp index 075091684..6bee96924 100644 --- a/include/IR/CostModeling.hpp +++ b/include/IR/CostModeling.hpp @@ -380,6 +380,18 @@ inline auto hasFutureReads(Arena<> *alloc, dict::set &LBBs, return hasFutureReadsCore(successors, I); } +struct LoopDepSatisfaction { + IR::Dependencies deps; + MutPtrVector loopDeps; + + constexpr auto dependencyIDs(IR::Loop *L) { + return utils::VForwardRange{loopDeps.begin(), L->getEdge()}; + } + constexpr auto depencencies(IR::Loop *L) { + return depIDs(L) | deps.getEdgeTransform(); + } +}; + class IROptimizer { IR::Dependencies deps; IR::Cache &instructions; @@ -394,11 +406,14 @@ class IROptimizer { /// we can more easily check all dependencies carried by a particular loop. /// We use these for checks w/ respect to unrolling and vectorization /// legality. + /// The returned vector is an integer vector, giving a mapping of loops + /// to depencencies handled at that level. + /// We can use these dependencies for searching reductions for + /// trying to prove legality. static auto loopDepSats(Arena<> *alloc, IR::Dependencies deps, lp::LoopBlock::OptimizationResult res) -> MutPtrVector { - IR::MutPtrVector loopDeps{ - math::vector(alloc, unsigned(deps.size()))}; + MutPtrVector loopDeps{math::vector(alloc, deps.size())}; // place deps at sat level for loops for (IR::Addr *a : res.addr.getAddr()) { IR::Loop *L = a->getLoop(); @@ -409,6 +424,9 @@ class IROptimizer { } return loopDeps; } + [[nodiscard]] constexpr auto getLoopDeps() const -> LoopDepSatisfaction { + return {deps, loopDeps}; + } // this compares `a` with each of its active outputs. inline void eliminateAddr(IR::Addr *a) { for (int32_t id : a->outputEdgeIDs(deps, a->getCurrentDepth())) { diff --git a/include/IR/Instruction.hpp b/include/IR/Instruction.hpp index a20e5cc77..e63526493 100644 --- a/include/IR/Instruction.hpp +++ b/include/IR/Instruction.hpp @@ -173,9 +173,11 @@ class Compute : public Instruction { loopIndepFlag &= A->getOrthAxes().indep | diffMask(C, depth); return loopIndepFlag; } + /// Get the arguments to this function [[nodiscard]] constexpr auto getOperands() const -> PtrVector { return {const_cast(operands), unsigned(numOperands)}; } + /// Get the `i`th argument of this function [[nodiscard]] constexpr auto getOperand(size_t i) const -> Value * { return operands[i]; } @@ -204,7 +206,12 @@ class Compute : public Instruction { return (getKind() == VK_Call) && ((opId == llvm::Intrinsic::fmuladd) || (opId == llvm::Intrinsic::fma)); } - [[nodiscard]] auto associativeOperandsFlag() const -> uint8_t { + // Bitmask indicating which args are commutative + // E.g. `muladd(a, b, c)` returns `0x3` + // where the bitpattern is 11000000 + // indicating that the first two arguments are commutative. + // That is, `muladd(a, b, c) == muladd(b, a, c)`. + [[nodiscard]] auto commuatativeOperandsFlag() const -> uint8_t { switch (getKind()) { case VK_Call: return (isMulAdd() || isCommutativeCall()) ? 0x3 : 0; case VK_Oprn: @@ -233,7 +240,7 @@ class Compute : public Instruction { size_t offset = 0; auto opst = getOperands(); auto opso = other.getOperands(); - if (uint8_t flag = associativeOperandsFlag()) { + if (uint8_t flag = commuatativeOperandsFlag()) { invariant(flag, uint8_t(3)); auto *ot0 = opst[0]; auto *oo0 = opso[0]; @@ -776,9 +783,9 @@ Compute::calcCost(const llvm::TargetTransformInfo &TTI, unsigned vectorWidth) if (const auto *I = llvm::dyn_cast(this)) return I->getNumOperands(); return getKind() == VK_Stow; } -[[nodiscard]] inline auto Value::associativeOperandsFlag() const -> uint8_t { +[[nodiscard]] inline auto Value::commutativeOperandsFlag() const -> uint8_t { if (const auto *I = llvm::dyn_cast(this)) - return I->associativeOperandsFlag(); + return I->commuatativeOperandsFlag(); return 0; } [[nodiscard]] inline auto Value::getNumScalarBits() const -> unsigned int { @@ -842,7 +849,7 @@ ankerl::unordered_dense::hash::operator()( seed = combineHash(seed, getHash(x.inst->getOpId())); if (x.inst->isIncomplete()) return combineHash(seed, getHash(x.inst->getLLVMInstruction())); - uint8_t assocFlag = x.inst->associativeOperandsFlag(); + uint8_t assocFlag = x.inst->commuatativeOperandsFlag(); // combine all operands size_t offset = 0; poly::PtrVector operands = x.inst->getOperands(); diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index 097043580..1c9ec0592 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -468,7 +468,7 @@ class Value : public Node { [[nodiscard]] inline auto getNumOperands() const -> unsigned; [[nodiscard]] inline auto getOperand(unsigned) -> Value *; [[nodiscard]] inline auto getOperand(unsigned) const -> const Value *; - [[nodiscard]] inline auto associativeOperandsFlag() const -> uint8_t; + [[nodiscard]] inline auto commutativeOperandsFlag() const -> uint8_t; [[nodiscard]] inline auto getNumScalarBits() const -> unsigned; [[nodiscard]] inline auto getNumScalarBytes() const -> unsigned; [[nodiscard]] inline auto getBasicBlock() -> llvm::BasicBlock *; From 6a2a418f397d1a7ef2db6070eb105cdcb6ad1e6a Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Tue, 28 Nov 2023 06:34:12 -0500 Subject: [PATCH 062/112] Some initial progress updating for Math breakages --- include/IR/Address.hpp | 7 ++++--- include/LinearProgramming/LoopBlock.hpp | 4 ++-- include/Polyhedra/Comparators.hpp | 24 +++++++++++------------ include/Polyhedra/DependencyPolyhedra.hpp | 19 +++++++++--------- test/ArrayReference.hpp | 2 +- test/comparator_test.cpp | 2 +- test/orthogonalize_test.cpp | 11 ++++++----- tools/prettyprinters.py | 10 +++++----- 8 files changed, 41 insertions(+), 38 deletions(-) diff --git a/include/IR/Address.hpp b/include/IR/Address.hpp index 261cb230d..be28fa9bb 100644 --- a/include/IR/Address.hpp +++ b/include/IR/Address.hpp @@ -140,7 +140,7 @@ class Addr : public Instruction { invariant((depth <= 24) && (depth >= 0)); invariant(depth >= naturalDepth); invariant(currentDepth >= depth); - currentDepth=depth; + currentDepth = depth; bool indepAxes = true; uint32_t contig{0}, indep{(uint32_t(1) << depth) - 1}; /// indexMatrix() -> arrayDim() x getNumLoops() @@ -201,7 +201,8 @@ class Addr : public Instruction { // as a temporary, to avoid the aliasing problem. // // Use `M` before updating it, to update `offsetOmega` - if (offsets) offsetOmega -= M * PtrVector{offsets, oldNatDepth}; + if (offsets) + offsetOmega -= PtrVector{offsets, oldNatDepth} * M.t(); // update `M` into `mStar` // mStar << M * Pinv(_(0, oldNumLoops), _); MutPtrVector buff{getFusionOmega()[_(0, math::last)]}; @@ -219,7 +220,7 @@ class Addr : public Instruction { newNatDepth = depth - std::distance(range.begin(), m); } // use `mStar` to update offsetOmega` - offsetOmega -= mStar * omega; + offsetOmega -= omega * mStar.t(); if (newNatDepth == depth) return; invariant(newNatDepth < depth); this->naturalDepth = newNatDepth; diff --git a/include/LinearProgramming/LoopBlock.hpp b/include/LinearProgramming/LoopBlock.hpp index 468182981..2e7827446 100644 --- a/include/LinearProgramming/LoopBlock.hpp +++ b/include/LinearProgramming/LoopBlock.hpp @@ -616,7 +616,7 @@ class LoopBlock { } // auto s = allocator->scope(); // TODO: use bumpalloc DenseMatrix nullSpace; // d x lfull - DenseMatrix A{node->getPhi()[_(0, depth), _].transpose()}; + DenseMatrix A{node->getPhi()[_(0, depth), _].t()}; math::NormalForm::nullSpace11(nullSpace, A); invariant(ptrdiff_t(nullSpace.numRow()), ptrdiff_t(node->getNumLoops()) - depth); @@ -1107,7 +1107,7 @@ class LoopBlock { continue; A.resizeForOverwrite(Row<>{ptrdiff_t(node->getPhi().numCol())}, Col<>{d}); - A << node->getPhi()[_(0, d), _].transpose(); + A << node->getPhi()[_(0, d), _].t(); math::NormalForm::nullSpace11(N, A); // we add sum(NullSpace,dims=1) >= 1 // via 1 = sum(NullSpace,dims=1) - s, s >= 0 diff --git a/include/Polyhedra/Comparators.hpp b/include/Polyhedra/Comparators.hpp index 70c9e11cd..5b37b878b 100644 --- a/include/Polyhedra/Comparators.hpp +++ b/include/Polyhedra/Comparators.hpp @@ -335,7 +335,7 @@ struct BaseSymbolicComparator : BaseComparator> { // V = [A_0' 0 0 // A_1' I 0 // S_0 S_1 I] - B[_(begin, numVar), _(1, numConExplicit)] << A.transpose(); + B[_(begin, numVar), _(1, numConExplicit)] << A.t(); for (ptrdiff_t j = 0; j < numNonNegative; ++j) B[j + numVar - numNonNegative, numConExplicit + j] = 1; for (ptrdiff_t j = 0; j < numConTotal; ++j) { @@ -368,9 +368,9 @@ struct BaseSymbolicComparator : BaseComparator> { // A_1' I E_1' 0 // S_0 S_1 0 I] numEquations = numInEqConTotal + numEqCon; - B[_(begin, numVar), _(1, numInEqConExplicit)] << A.transpose(); + B[_(begin, numVar), _(1, numInEqConExplicit)] << A.t(); B[_(begin, numVar), _(numInEqConTotal, numInEqConTotal + numEqCon)] - << E.transpose(); + << E.t(); if (numNonNegative) B[_(numVar - numNonNegative, numVar), _(numInEqConExplicit, numInEqConExplicit + numNonNegative)] @@ -433,7 +433,7 @@ struct BaseSymbolicComparator : BaseComparator> { B[0, 0] = pos0; // V = [A' 0 // S I] - B[_(begin, numVar), _(pos0, numCon)] << A.transpose(); + B[_(begin, numVar), _(pos0, numCon)] << A.t(); for (ptrdiff_t j = 0; j < numCon; ++j) { B[j + numVar, j] = -1; B[j + numVar, j + numCon] = 1; @@ -457,9 +457,9 @@ struct BaseSymbolicComparator : BaseComparator> { // V = [A' E' 0 // S 0 I] B[0, 0] = pos0; - B[_(begin, numVar), _(pos0, numInEqCon)] << A.transpose(); - // A(_, _(pos0, end)).transpose(); - B[_(begin, numVar), _(numInEqCon, numInEqCon + numEqCon)] << E.transpose(); + B[_(begin, numVar), _(pos0, numInEqCon)] << A.t(); + // A(_, _(pos0, end)).t(); + B[_(begin, numVar), _(numInEqCon, numInEqCon + numEqCon)] << E.t(); numEquations = numInEqCon + numEqCon; for (ptrdiff_t j = 0; j < numInEqCon; ++j) { @@ -492,14 +492,14 @@ struct BaseSymbolicComparator : BaseComparator> { // Ht.numRow() > Ht.numCol() = R // (2*numInEq + numEq) x R auto Ht = matrix(alloc, Row<>{numColB}, Col<>{ptrdiff_t(R)}); - Ht << B[_(0, R), _].transpose(); + Ht << B[_(0, R), _].t(); solveSystem(Ht, Vt); // upper bounded by numVar + numInEq // rows/cols, but of rank R // smaller based on rank getD(R) << Ht.diag(); // d.size() == R // upper bounded by 2*numInEq + numEq x 2*numInEq + numEq - getV() << Vt.transpose(); + getV() << Vt.t(); } // Note that this is only valid when the comparator was constructed @@ -532,7 +532,7 @@ struct BaseSymbolicComparator : BaseComparator> { // Vector b2 = -b * Dlcm / d; ptrdiff_t numRowTrunc = ptrdiff_t(U.numRow()); auto c{vector(&alloc, ptrdiff_t(V.numRow()) - numEquations)}; - c << V[_(numEquations, end), _(begin, numRowTrunc)] * b2; + c << b2 * V[_(numEquations, end), _(begin, numRowTrunc)].t(); // Vector c = V(_(numEquations, end), _(begin, numRowTrunc)) * // b2; ptrdiff_t dimNS = ptrdiff_t(V.numCol()) - numRowTrunc; @@ -594,7 +594,7 @@ struct BaseSymbolicComparator : BaseComparator> { } ptrdiff_t numRowTrunc = getURank(); auto c = vector(alloc, ptrdiff_t(V.numRow()) - numEquations); - c << V[_(numEquations, end), _(begin, numRowTrunc)] * b; + c << b * V[_(numEquations, end), _(begin, numRowTrunc)].t(); auto dimNS = ptrdiff_t(V.numCol()) - numRowTrunc; // expand W stores [c -JV2 JV2] // we use simplex to solve [-JV2 JV2][y2+ y2-]' <= JV1D^(-1)Uq @@ -617,7 +617,7 @@ struct BaseSymbolicComparator : BaseComparator> { -> bool { auto U = getU(); auto b = vector(&alloc, ptrdiff_t(U.numRow())); - b << U[_, _(begin, query.size())] * query; + b << query * U[_, _(begin, query.size())].t(); return getD().size() ? greaterEqualRankDeficient(&alloc, b) : greaterEqualFullRank(&alloc, b); } diff --git a/include/Polyhedra/DependencyPolyhedra.hpp b/include/Polyhedra/DependencyPolyhedra.hpp index 92e920487..6f174e61c 100644 --- a/include/Polyhedra/DependencyPolyhedra.hpp +++ b/include/Polyhedra/DependencyPolyhedra.hpp @@ -25,6 +25,7 @@ #include namespace poly::poly { +using math::shape; /// prints in current permutation order. /// TODO: decide if we want to make poly::Loop a `SymbolicPolyhedra` /// in which case, we have to remove `currentToOriginalPerm`, @@ -295,7 +296,7 @@ class DepPoly : public BasePolyhedra { math::DenseMatrix A(math::DenseDims<>{numLoopsCommon, dim}); if (!numLoopsCommon) return A; // indMats cols are [outerMostLoop,...,innerMostLoop] - A[_(0, natDepth), _] << x->indexMatrix().transpose(); + A[_(0, natDepth), _] << x->indexMatrix().t(); if (natDepth < numLoopsCommon) A[_(natDepth, end), _] << 0; // returns rank x num loops return orthogonalNullSpace(std::move(A)); @@ -360,8 +361,8 @@ class DepPoly : public BasePolyhedra { invariant(Cx.numRow(), Cy.numRow()); invariant(Cx.numCol() <= numDep0Var); invariant(Cy.numCol() <= numDep1Var); - auto [nc0, nv0] = Ax.size(); - auto [nc1, nv1] = Ay.size(); + auto [nc0, nv0] = shape(Ax); + auto [nc1, nv1] = shape(Ay); math::Vector map; unsigned numDynSym = mergeMap(map, Sx, Sy); @@ -386,7 +387,7 @@ class DepPoly : public BasePolyhedra { ptrdiff_t nc = nc0 + nc1; unsigned indexDim{aix->getArrayDim()}; auto nullStep{dp->getNullStep()}; - for (ptrdiff_t i = 0; i < timeDim; ++i) nullStep[i] = selfDot(NS[i, _]); + for (ptrdiff_t i = 0; i < timeDim; ++i) nullStep[i] = norm2(NS[i, _]); // column meansing in in order // const size_t numSymbols = getNumSymbols(); auto A{dp->getA()}; @@ -444,7 +445,7 @@ class DepPoly : public BasePolyhedra { // numLoops x numDim PtrMatrix C{ai->indexMatrix()}, O{ai->offsetMatrix()}; - auto [nco, nv] = B.size(); + auto [nco, nv] = shape(B); math::DenseMatrix NS{nullSpace(ai)}; ptrdiff_t numDynSym = ptrdiff_t(S.size()), numSym = numDynSym + 1, timeDim = ptrdiff_t{NS.numRow()}, @@ -464,7 +465,7 @@ class DepPoly : public BasePolyhedra { ptrdiff_t nc = nco + nco; unsigned indexDim{ai->getArrayDim()}; auto nullStep{dp->getNullStep()}; - for (ptrdiff_t i = 0; i < timeDim; ++i) nullStep[i] = selfDot(NS[i, _]); + for (ptrdiff_t i = 0; i < timeDim; ++i) nullStep[i] = norm2(NS[i, _]); // column meansing in in order // const size_t numSymbols = getNumSymbols(); auto A{dp->getA()}; @@ -559,9 +560,9 @@ class DepPoly : public BasePolyhedra { // fC(_, 0) << 0; fC[0, 0] = 1; // lambda_0 fC[_, _(1, 1 + numInequalityConstraintsOld)] - << A[_, _(math::begin, numConstraintsNew)].transpose(); - // fC(_, _(ineqEnd, posEqEnd)) = E.transpose(); - // fC(_, _(posEqEnd, numVarNew)) = -E.transpose(); + << A[_, _(math::begin, numConstraintsNew)].t(); + // fC(_, _(ineqEnd, posEqEnd)) = E.t(); + // fC(_, _(posEqEnd, numVarNew)) = -E.t(); // loading from `E` is expensive // NOTE: if optimizing expression templates, should also // go through and optimize loops like this diff --git a/test/ArrayReference.hpp b/test/ArrayReference.hpp index 0e1305b25..f33b917b1 100644 --- a/test/ArrayReference.hpp +++ b/test/ArrayReference.hpp @@ -38,7 +38,7 @@ struct ArrayReference { // omegas) // -> Valid { -// math::IntMatrix indMatT{ar.indMat.transpose()}; +// math::IntMatrix indMatT{ar.indMat.t()}; // return IR::Addr::construct(alloc, ar.basePointer, *ar.loop, IC, indMatT, // {ar.sizes, {}}, ar.offsetMatrix(), omegas); // } diff --git a/test/comparator_test.cpp b/test/comparator_test.cpp index 5df6100a5..63fe63821 100644 --- a/test/comparator_test.cpp +++ b/test/comparator_test.cpp @@ -98,7 +98,7 @@ TEST(V2Matrix, BasicAssertions) { // 0 0 0 1 0 0 -1 0; 0 0 0 0 0 0 0 0 1 0 0 1; 0 0 0 0 0 0 0 0 0 1 0 0]"_mat; auto comp = poly::comparator::LinearSymbolicComparator::construct(A, false); auto [H, U] = NormalForm::hermite(std::move(A)); - IntMatrix Ht = H.transpose(); + IntMatrix Ht = H.t(); // llvm::errs() << "Ht matrix:" << Ht << "\n"; auto Vt = IntMatrix::identity(Ht.numRow()); auto NS = NormalForm::nullSpace(Ht); diff --git a/test/orthogonalize_test.cpp b/test/orthogonalize_test.cpp index b04094544..a2254a7f3 100644 --- a/test/orthogonalize_test.cpp +++ b/test/orthogonalize_test.cpp @@ -65,8 +65,7 @@ auto orthogonalize(alloc::Arena<> *alloc, // now, we have (A = alnp.aln->A, r = alnp.aln->r) // (A*K')*J <= r DenseMatrix AK{alnp.getA()}; - AK(_, _(numSymbols, end)) - << alnp.getA()(_, _(numSymbols, end)) * K.transpose(); + AK(_, _(numSymbols, end)) << alnp.getA()(_, _(numSymbols, end)) * K.t(); auto *alnNew = poly::Loop::construct(alloc, nullptr, std::move(AK), alnp.getSyms(), true); @@ -158,7 +157,8 @@ TEST(OrthogonalizeTest, BasicAssertions) { llvm::SmallVector ai{ allArrayRefs.data(), allArrayRefs.data() + 1, allArrayRefs.data() + 2}; - std::optional>> + std::optional< + containers::Pair>> orth(orthogonalize(tlf.getAlloc(), ai)); EXPECT_TRUE(orth.has_value()); @@ -280,7 +280,8 @@ TEST(BadMul, BasicAssertions) { llvm::SmallVector ai{ allArrayRefs.data(), allArrayRefs.data() + 1, allArrayRefs.data() + 2}; - std::optional>> + std::optional< + containers::Pair>> orth{orthogonalize(tlf.getAlloc(), ai)}; EXPECT_TRUE(orth.has_value()); @@ -327,7 +328,7 @@ TEST(OrthogonalizeMatricesTest, BasicAssertions) { // llvm::errs() << "Orthogonal A =\n" << A << "\n"; // note, A'A is not diagonal // but AA' is - B = A * A.transpose(); + B = A * A.t(); // llvm::errs() << "A'A =\n" << B << "\n"; #if !defined(__clang__) && defined(__GNUC__) #pragma GCC diagnostic push diff --git a/tools/prettyprinters.py b/tools/prettyprinters.py index b1cdcb207..50eb504cb 100644 --- a/tools/prettyprinters.py +++ b/tools/prettyprinters.py @@ -99,21 +99,21 @@ def __init__(self, val): ) pp = gdb.printing.RegexpCollectionPrettyPrinter("LoopModels") -pp.add_printer("poly::math::Array", "^poly::math::Array<.*, unsigned int>$", VectorPrinter) -pp.add_printer("poly::math::::ManagedArray", "^poly::math::ManagedArray<.*, unsigned int, .*, alloc::Mallocator<.*>, .*>$", VectorPrinter) +pp.add_printer("poly::math::Array", "^poly::math::Array<.*, ptrdiff_t>$", VectorPrinter) +pp.add_printer("poly::math::::ManagedArray", "^poly::math::ManagedArray<.*, ptrdiff_t, .*, alloc::Mallocator<.*>, .*>$", VectorPrinter) pp.add_printer( "poly::math::::Array", - "^poly::math::::Array<.*, poly::math::::SquareDims>$", + "^poly::math::::Array<.*, poly::math::::SquareDims<>>$", SquareMatrixPrinter, ) pp.add_printer( "poly::math::::Array", - "^poly::math::::Array<.*, poly::math::::DenseDims>$", + "^poly::math::::Array<.*, poly::math::::DenseDims<>>$", DenseMatrixPrinter, ) pp.add_printer( "poly::math::::Array", - "^poly::math::::Array<.*, poly::math::::StridedDims>$", + "^poly::math::::Array<.*, poly::math::::StridedDims<>>$", StridedMatrixPrinter, ) gdb.printing.register_pretty_printer(gdb.current_objfile(), pp) From 9be43c8e384bcc18f96e08c039f497ffa16f8cb8 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Tue, 28 Nov 2023 09:54:10 -0500 Subject: [PATCH 063/112] some fixes/updates --- include/LinearProgramming/LoopBlock.hpp | 10 +++++----- include/{IR => Optimize}/CostFunction.hpp | 0 include/{IR => Optimize}/CostModeling.hpp | 0 include/{IR => Optimize}/OptimizationPossibilities.hpp | 0 include/{IR => Optimize}/RegisterFile.hpp | 0 5 files changed, 5 insertions(+), 5 deletions(-) rename include/{IR => Optimize}/CostFunction.hpp (100%) rename include/{IR => Optimize}/CostModeling.hpp (100%) rename include/{IR => Optimize}/OptimizationPossibilities.hpp (100%) rename include/{IR => Optimize}/RegisterFile.hpp (100%) diff --git a/include/LinearProgramming/LoopBlock.hpp b/include/LinearProgramming/LoopBlock.hpp index 2e7827446..4de077344 100644 --- a/include/LinearProgramming/LoopBlock.hpp +++ b/include/LinearProgramming/LoopBlock.hpp @@ -985,9 +985,9 @@ class LoopBlock { // add it constants auto sch = outNode->getSchedule(d); C[_(c, cc), 0] -= - satPc * sch[_(0, nPc)] + satPp * sch[_(0, nPp)]; + satPc * sch[_(0, nPc)].t() + satPp * sch[_(0, nPp)].t(); C[_(cc, ccc), 0] -= - bndPc * sch[_(0, nPc)] + bndPp * sch[_(0, nPp)]; + bndPc * sch[_(0, nPc)].t() + bndPp * sch[_(0, nPp)].t(); } else { // FIXME: phiChild = [14:18), 4 cols // while Dependence seems to indicate 2 @@ -1002,8 +1002,8 @@ class LoopBlock { // inner -> outer // so we need to drop inner most if one has less auto sch = outNode->getSchedule(d); - auto schP = sch[_(0, nPp)]; - auto schC = sch[_(0, nPc)]; + auto schP = sch[_(0, nPp)].t(); + auto schC = sch[_(0, nPc)].t(); C[_(c, cc), 0] -= satPc * schC + satPp * schP; C[_(cc, ccc), 0] -= bndPc * schC + bndPp * schP; } else if (nPc < nPp) { @@ -1069,7 +1069,7 @@ class LoopBlock { invariant(sat.numCol(), bnd.numCol()); if (node->phiIsScheduled(d)) { // add it constants - auto sch = node->getSchedule(d)[_(0, sat.numCol())]; + auto sch = node->getSchedule(d)[_(0, sat.numCol())].t(); // order is inner <-> outer // so we need the end of schedule if it is larger C[_(c, cc), 0] -= sat * sch; diff --git a/include/IR/CostFunction.hpp b/include/Optimize/CostFunction.hpp similarity index 100% rename from include/IR/CostFunction.hpp rename to include/Optimize/CostFunction.hpp diff --git a/include/IR/CostModeling.hpp b/include/Optimize/CostModeling.hpp similarity index 100% rename from include/IR/CostModeling.hpp rename to include/Optimize/CostModeling.hpp diff --git a/include/IR/OptimizationPossibilities.hpp b/include/Optimize/OptimizationPossibilities.hpp similarity index 100% rename from include/IR/OptimizationPossibilities.hpp rename to include/Optimize/OptimizationPossibilities.hpp diff --git a/include/IR/RegisterFile.hpp b/include/Optimize/RegisterFile.hpp similarity index 100% rename from include/IR/RegisterFile.hpp rename to include/Optimize/RegisterFile.hpp From c1bd1f32dcd6123f0fd3d938b53e7442bea3a161 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Tue, 28 Nov 2023 17:35:34 -0500 Subject: [PATCH 064/112] minor progress --- include/Optimize/CostFunction.hpp | 9 ++++----- include/Optimize/CostModeling.hpp | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/include/Optimize/CostFunction.hpp b/include/Optimize/CostFunction.hpp index a5d0a0d26..d6f4066a4 100644 --- a/include/Optimize/CostFunction.hpp +++ b/include/Optimize/CostFunction.hpp @@ -3,8 +3,8 @@ #include "IR/Address.hpp" #include "IR/Instruction.hpp" #include "IR/Node.hpp" -#include "IR/CostModeling.hpp" #include "IR/OrthogonalAxes.hpp" +#include "Optimize/CostModeling.hpp" #include "Polyhedra/Dependence.hpp" #include #include @@ -14,7 +14,6 @@ #include #include #include -#include namespace poly::CostModeling { using containers::Pair; using math::AbstractVector, math::AbstractMatrix, math::DensePtrMatrix, math::_; @@ -158,7 +157,7 @@ constexpr auto cost(const AbstractMatrix auto &invunrolls, MemCostSummary orth, VectorizationFactor vfi, DensePtrMatrix inds) -> utils::eltype_t { utils::eltype_t c{1}; - auto [arrayDim, numLoops] = inds.size(); + auto [arrayDim, numLoops] = shape(inds); utils::invariant(numLoops > 0); utils::invariant(arrayDim > 0); utils::invariant(arrayDim <= 64); @@ -586,8 +585,8 @@ class LoopTreeCostFn { // } // Rather than using PhiNodes, we represent dependencies through addresses. bool vectorizationLegal = true, unrollLegal = true; - for (poly::Dependence d : deps.depencencies(L)){ - // is + for (poly::Dependence d : deps.depencencies(L)) { + // is } // for (IR::Node *N = L->getChild(); N; N = N->getNext()) {} return; diff --git a/include/Optimize/CostModeling.hpp b/include/Optimize/CostModeling.hpp index 6bee96924..d45accc2b 100644 --- a/include/Optimize/CostModeling.hpp +++ b/include/Optimize/CostModeling.hpp @@ -388,7 +388,7 @@ struct LoopDepSatisfaction { return utils::VForwardRange{loopDeps.begin(), L->getEdge()}; } constexpr auto depencencies(IR::Loop *L) { - return depIDs(L) | deps.getEdgeTransform(); + return dependencyIDs(L) | deps.getEdgeTransform(); } }; From 06de317df740064c9f38ed465a4dce92461ce8b1 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Wed, 29 Nov 2023 14:00:36 -0500 Subject: [PATCH 065/112] write a few lines of comment --- include/Optimize/CostFunction.hpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/include/Optimize/CostFunction.hpp b/include/Optimize/CostFunction.hpp index d6f4066a4..d38b53178 100644 --- a/include/Optimize/CostFunction.hpp +++ b/include/Optimize/CostFunction.hpp @@ -565,6 +565,21 @@ class LoopTreeCostFn { if (SL) iterLoopLevel(deps, SL, maxl2VF, TTI, ++depth, exitCount); else leafCosts(deps, L, maxl2VF, TTI); } + // checks a loop for legality of vectorization and unrolling + // If a loop doesn't carry a dependency, it is legal + // If a loop does carry a dependency, we can still consider + // unrolling and vectorization if at least one of: + // - that depenedncy is a reassociable reduction + // - the overlap is for a bounded number of iters, in which case we can peel + // + void checkLegality(LoopDepSatisfaction deps, IR::Loop *L) { + bool canVectorize = true, canUnroll = true; + for (poly::Dependence d : deps.depencencies(L)) { + // analyze d + canVectorize = false; + } + } + void leafCosts(LoopDepSatisfaction deps, IR::Loop *L, unsigned maxl2VF, const llvm::TargetTransformInfo &TTI) { // TODO: if (!SL) we're in a leaf, and need compute latency @@ -591,6 +606,7 @@ class LoopTreeCostFn { // for (IR::Node *N = L->getChild(); N; N = N->getNext()) {} return; }; + // NOLINTNEXTLINE(misc-no-recursion) void iterLoopLevel(LoopDepSatisfaction deps, IR::Loop *L, unsigned maxl2VF, const llvm::TargetTransformInfo &TTI, ptrdiff_t depth, From 58367cdb8227d076f54fc0f19ec605ada22fa834 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Wed, 29 Nov 2023 19:28:18 -0500 Subject: [PATCH 066/112] Add legality file for summarizing loop transform legality. Additionally, fix `timeCheck` to add an extra dependence per time dim. This is so that each of these can be carried by a loop; earlier we wouldn't have properly captured time dependencies. --- include/Optimize/CostFunction.hpp | 6 - include/Optimize/Legality.hpp | 72 +++++++++++ include/Polyhedra/Dependence.hpp | 140 ++++++++++------------ include/Polyhedra/DependencyPolyhedra.hpp | 10 +- 4 files changed, 143 insertions(+), 85 deletions(-) create mode 100644 include/Optimize/Legality.hpp diff --git a/include/Optimize/CostFunction.hpp b/include/Optimize/CostFunction.hpp index d38b53178..162a0381b 100644 --- a/include/Optimize/CostFunction.hpp +++ b/include/Optimize/CostFunction.hpp @@ -566,12 +566,6 @@ class LoopTreeCostFn { else leafCosts(deps, L, maxl2VF, TTI); } // checks a loop for legality of vectorization and unrolling - // If a loop doesn't carry a dependency, it is legal - // If a loop does carry a dependency, we can still consider - // unrolling and vectorization if at least one of: - // - that depenedncy is a reassociable reduction - // - the overlap is for a bounded number of iters, in which case we can peel - // void checkLegality(LoopDepSatisfaction deps, IR::Loop *L) { bool canVectorize = true, canUnroll = true; for (poly::Dependence d : deps.depencencies(L)) { diff --git a/include/Optimize/Legality.hpp b/include/Optimize/Legality.hpp new file mode 100644 index 000000000..83c6b1b69 --- /dev/null +++ b/include/Optimize/Legality.hpp @@ -0,0 +1,72 @@ +#pragma once +#ifndef POLY_LEGALITY_HPP_INCLUDED +#define POLY_LEGALITY_HPP_INCLUDED + +#include "Optimize/CostModeling.hpp" +#include "Polyhedra/Dependence.hpp" +#include +#include +#include + +namespace poly::CostModeling { + +// If a loop doesn't carry a dependency, it is legal +// If a loop does carry a dependency, we can still consider +// unrolling and vectorization if at least one of: +// - that depenedncy is a reassociable reduction +// - the overlap is for a bounded number of iters, in which case we can peel +// Contains: +// - `getReduction()` enum indicating +// none vs unordered vs ordered +// - `minDistance()`, indicates the minimum distance +// between dependent loop iterations. +// for (ptrdiff_t i; i Reduction { + return Reduction(reduction); + } + [[nodiscard]] constexpr auto minDistance() const -> uint16_t { + return mindistance; + } + [[nodiscard]] constexpr auto maxDistance() const -> uint16_t { + return mindistance; + } + [[nodiscard]] constexpr auto maxIters() const -> uint16_t { return maxiters; } + constexpr auto operator&=(Legality other) -> Legality & { + reduction = std::max(reduction, other.reduction); + mindistance = std::min(mindistance, other.mindistance); + maxdistance = std::max(maxdistance, other.maxdistance); + maxiters = std::max(maxiters, other.maxiters); + return *this; + } + [[nodiscard]] constexpr auto operator&(Legality other) const -> Legality { + Legality l{*this}; + return l &= other; + } + constexpr Legality() = default; + constexpr Legality(const Legality &) = default; + Legality(Dependence d){ + // TODO: check if addr match + // "Reduction" dependences should correspond to time dims. + // In the memory-optimized IR, we have read/write to the + // same address hoisted outside of the loop carrying `d` + }; + Legality(LoopDepSatisfaction deps, IR::Loop *L) { + for (poly::Dependence d : deps.depencencies(L)) (*this) &= Legality(d); + } +}; + +} // namespace poly::CostModeling +#endif // POLY_LEGALITY_HPP_INCLUDED diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index e8dc00b29..e8fdbbbc3 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -391,7 +391,7 @@ class Dependence { // Vector schv(dependenceSatisfaction->getNumVars(),int64_t(0)); const unsigned numLambda = getNumLambda(); // when i == numLoopsCommon, we've passed the last loop - for (size_t i = 0; i <= numLoopsCommon; ++i) { + for (ptrdiff_t i = 0; i <= numLoopsCommon; ++i) { if (int64_t o2idiff = outFusOmega[i] - inFusOmega[i]) return (o2idiff > 0); // we should not be able to reach `numLoopsCommon` @@ -607,11 +607,10 @@ class Dependencies { return N * memPer; } - void timelessCheck(Arena<> *alloc, Valid dxy, Valid x, - Valid y, - std::array, 2> pair, bool isFwd) { - const size_t numLambda = dxy->getNumLambda(); - invariant(dxy->getTimeDim(), unsigned(0)); + void addOrdered(Arena<> *alloc, Valid dxy, Valid x, + Valid y, std::array, 2> pair, + bool isFwd) { + ptrdiff_t numLambda = dxy->getNumLambda(); if (!isFwd) { std::swap(pair[0], pair[1]); std::swap(x, y); @@ -622,19 +621,44 @@ class Dependencies { void timelessCheck(Arena<> *alloc, Valid dxy, Valid x, Valid y, std::array, 2> pair) { - return timelessCheck(alloc, dxy, x, y, pair, - checkDirection(*alloc, pair, x, y, dxy->getNumLambda(), - Col<>{dxy->getNumVar() + 1})); + invariant(dxy->getTimeDim(), unsigned(0)); + return addOrdered(alloc, dxy, x, y, pair, + checkDirection(*alloc, pair, x, y, dxy->getNumLambda(), + Col<>{dxy->getNumVar() + 1})); } // emplaces dependencies with repeat accesses to the same memory across // time void timeCheck(Arena<> *alloc, Valid dxy, Valid x, Valid y, std::array, 2> pair) { - bool isFwd = checkDirection(*alloc, pair, x, y, dxy->getNumLambda(), - Col<>{ptrdiff_t(dxy->getA().numCol()) - dxy->getTimeDim()}); + bool isFwd = checkDirection( + *alloc, pair, x, y, dxy->getNumLambda(), + Col<>{ptrdiff_t(dxy->getA().numCol()) - dxy->getTimeDim()}); timeCheck(alloc, dxy, x, y, pair, isFwd); } + static void timeStep(Valid dxy, MutPtrMatrix fE, + MutPtrMatrix sE, + ptrdiff_t numInequalityConstraintsOld, + ptrdiff_t numEqualityConstraintsOld, ptrdiff_t ineqEnd, + ptrdiff_t posEqEnd, ptrdiff_t v, ptrdiff_t step) { + for (ptrdiff_t c = 0; c < numInequalityConstraintsOld; ++c) { + int64_t Acv = dxy->getA(Row<>{c}, Col<>{v}); + if (!Acv) continue; + Acv *= step; + fE[0, c + 1] -= Acv; // *1 + sE[0, c + 1] -= Acv; // *1 + } + for (ptrdiff_t c = 0; c < numEqualityConstraintsOld; ++c) { + // each of these actually represents 2 inds + int64_t Ecv = dxy->getE(Row<>{c}, Col<>{v}); + if (!Ecv) continue; + Ecv *= step; + fE[0, c + ineqEnd] -= Ecv; + fE[0, c + posEqEnd] += Ecv; + sE[0, c + ineqEnd] -= Ecv; + sE[0, c + posEqEnd] += Ecv; + } + } void timeCheck(Arena<> *alloc, Valid dxy, Valid x, Valid y, std::array, 2> pair, bool isFwd) { @@ -675,77 +699,45 @@ class Dependencies { // now we need to check the time direction for all times // anything approaching 16 time dimensions would be absolutely // insane - math::Vector timeDirection(timeDim); - ptrdiff_t t = 0; - auto fE{farkasBackups[0]->getConstraints()[_, _(1, end)]}; - auto sE{farkasBackups[1]->getConstraints()[_, _(1, end)]}; - do { + for (ptrdiff_t t = 0;;) { // set `t`th timeDim to +1/-1 // basically, what we do here is set it to `step` and pretend it was // a constant. so a value of c = a'x + t*step -> c - t*step = a'x so // we update the constant `c` via `c -= t*step`. // we have the problem that. int64_t step = dxy->getNullStep(t); - ptrdiff_t v = numVar + t, i = 0; - while (true) { - for (ptrdiff_t c = 0; c < numInequalityConstraintsOld; ++c) { - int64_t Acv = dxy->getA(Row<>{c}, Col<>{v}); - if (!Acv) continue; - Acv *= step; - fE[0, c + 1] -= Acv; // *1 - sE[0, c + 1] -= Acv; // *1 - } - for (ptrdiff_t c = 0; c < numEqualityConstraintsOld; ++c) { - // each of these actually represents 2 inds - int64_t Ecv = dxy->getE(Row<>{c}, Col<>{v}); - if (!Ecv) continue; - Ecv *= step; - fE[0, c + ineqEnd] -= Ecv; - fE[0, c + posEqEnd] += Ecv; - sE[0, c + ineqEnd] -= Ecv; - sE[0, c + posEqEnd] += Ecv; - } - if (i++ != 0) break; // break after undoing - timeDirection[t] = - checkDirection(*alloc, farkasBackups, *out, *in, numLambda, - Col<>{ptrdiff_t(dxy->getA().numCol()) - dxy->getTimeDim()}); - step *= -1; // flip to undo, then break - } - } while (++t < timeDim); - t = 0; - do { - // checkDirection(farkasBackups, x, y, numLambda) == false - // correct time direction would make it return true - // thus sign = timeDirection[t] ? 1 : -1 - int64_t step = (2 * timeDirection[t] - 1) * dxy->getNullStep(t); ptrdiff_t v = numVar + t; - for (ptrdiff_t c = 0; c < numInequalityConstraintsOld; ++c) { - int64_t Acv = dxy->getA(Row<>{c}, Col<>{v}); - if (!Acv) continue; - Acv *= step; - dxy->getA(Row<>{c}, Col<>{0}) -= Acv; - fE[0, c + 1] -= Acv; // *1 - sE[0, c + 1] -= Acv; // *-1 - } - for (ptrdiff_t c = 0; c < numEqualityConstraintsOld; ++c) { - // each of these actually represents 2 inds - int64_t Ecv = dxy->getE(Row<>{c}, Col<>{v}); - if (!Ecv) continue; - Ecv *= step; - dxy->getE(Row<>{c}, Col<>{0}) -= Ecv; - fE[0, c + ineqEnd] -= Ecv; - fE[0, c + posEqEnd] += Ecv; - sE[0, c + ineqEnd] -= Ecv; - sE[0, c + posEqEnd] += Ecv; + bool repeat = (++t < timeDim); + std::array, 2> fp{farkasBackups}; + if (repeat) { + fp[0] = fp[0]->copy(alloc); + fp[1] = fp[1]->copy(alloc); } - } while (++t < timeDim); - // dxy->truncateVars(numVar); - // dxy->setTimeDim(0); - farkasBackups[0]->truncateVars(1 + numLambda + numScheduleCoefs); - auto dep1 = Dependence{dxy, farkasBackups, out, in, !isFwd}; - invariant(out->getCurrentDepth() + in->getCurrentDepth(), - dep1.getNumPhiCoefficients()); - addEdge(alloc, dep1); + // set (or unset) for this timedim + auto fE{fp[0]->getConstraints()[_, _(1, end)]}; + auto sE{fp[1]->getConstraints()[_, _(1, end)]}; + timeStep(dxy, fE, sE, numInequalityConstraintsOld, + numEqualityConstraintsOld, ineqEnd, posEqEnd, v, step); + // checkDirection should be `true`, so if `false` we flip the sign + // this is because `isFwd = checkDirection` of the original + // `if (isFwd)`, we swapped farkasBackups args, making the result + // `false`; for our timeDim to capture the opposite movement + // through time, we thus need to flip it back to `true`. + // `if (!isFwd)`, i.e. the `else` branch above, we don't flip the + // args, so it'd still return `false` and a flip would still mean `true`. + if (!checkDirection( + *alloc, fp, *out, *in, numLambda, + Col<>{ptrdiff_t(dxy->getA().numCol()) - dxy->getTimeDim()})) + timeStep(dxy, fE, sE, numInequalityConstraintsOld, + numEqualityConstraintsOld, ineqEnd, posEqEnd, v, -2 * step); + + fp[0]->truncateVars(1 + numLambda + numScheduleCoefs); + auto dep1 = Dependence{dxy, farkasBackups, out, in, !isFwd}; + invariant(out->getCurrentDepth() + in->getCurrentDepth(), + dep1.getNumPhiCoefficients()); + addEdge(alloc, dep1); + if (!repeat) break; + } } static auto checkDirection(Arena<> alloc, const std::array, 2> &p, diff --git a/include/Polyhedra/DependencyPolyhedra.hpp b/include/Polyhedra/DependencyPolyhedra.hpp index 6f174e61c..1acdec1ab 100644 --- a/include/Polyhedra/DependencyPolyhedra.hpp +++ b/include/Polyhedra/DependencyPolyhedra.hpp @@ -34,8 +34,8 @@ using math::shape; inline auto printConstraints(std::ostream &os, DensePtrMatrix A, llvm::ArrayRef syms, bool inequality = true) -> std::ostream & { - const Row numConstraints = A.numRow(); - const unsigned numSyms = syms.size() + 1; + Row numConstraints = A.numRow(); + unsigned numSyms = syms.size() + 1; for (ptrdiff_t c = 0; c < numConstraints; ++c) { printConstraint(os, A[c, _], numSyms, inequality); for (ptrdiff_t v = 1; v < numSyms; ++v) { @@ -180,12 +180,12 @@ class DepPoly : public BasePolyhedra { constexpr void decrementNumConstraints() { invariant(numCon-- > 0); } constexpr auto getA() -> MutDensePtrMatrix { void *p = memory; - return {(int64_t *)p, math::DenseDims<>{numCon, getNumVar() + 1}}; + return {(int64_t *)p, math::DenseDims<>{{numCon}, {getNumVar() + 1}}}; } constexpr auto getE() -> MutDensePtrMatrix { void *p = memory; return {(int64_t *)p + size_t(conCapacity) * (getNumVar() + 1), - math::DenseDims<>{numEqCon, getNumVar() + 1}}; + math::DenseDims<>{{numEqCon}, {getNumVar() + 1}}}; } constexpr auto getNullStep() -> math::MutPtrVector { void *p = memory; @@ -210,7 +210,7 @@ class DepPoly : public BasePolyhedra { [[nodiscard]] auto getA() const -> DensePtrMatrix { const char *p = memory; return {const_cast(reinterpret_cast(p)), - math::DenseDims<>{numCon, getNumVar() + 1}}; + math::DenseDims<>{{numCon}, {getNumVar() + 1}}}; } [[nodiscard]] auto getA(Row<> r, Col<> c) -> int64_t & { auto *p = reinterpret_cast(memory); From 1af6b31ef82c75ee11f96e653f6fcedd15200cd0 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Thu, 30 Nov 2023 13:49:38 -0500 Subject: [PATCH 067/112] Maybe going to implement a more generic SOA in math lib to simplify Dependencies definition here. We want to add a field to Depenence struct to indicate the matching forward-time Dependence, helping identify reductions --- include/Polyhedra/Dependence.hpp | 35 +++++++++++++++++++------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index e8fdbbbc3..9d14bf3f6 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -552,13 +552,14 @@ static_assert(sizeof(Dependence) <= 64); class Dependencies { char *data{nullptr}; int32_t numData{0}; + static constexpr int32_t initialCapacity = 64; // int32_t tombstone{-1}; public: using ID = Dependence::ID; constexpr Dependencies() noexcept = default; constexpr Dependencies(Arena<> *alloc) - : data(alloc->allocate(memNeeded(64))) {} + : data(alloc->allocate(memNeeded(initialCapacity))) {} constexpr Dependencies(const Dependencies &) noexcept = default; // or delete? constexpr Dependencies(Dependencies &&) noexcept = default; // or delete? constexpr auto operator=(Dependencies &&other) noexcept @@ -589,20 +590,26 @@ class Dependencies { in->setEdgeOut(i.id); out->setEdgeIn(i.id); } - auto addEdge(Arena<> *alloc, Dependence d) -> void * { - void *ret = nullptr; - if (numData == getCapacity()) { - auto newCapacity = getCapacity() * 2; - auto *newData = alloc->allocate(memNeeded(newCapacity)); - std::memcpy(newData, data, memNeeded(numData)); - ret = std::exchange(data, newData); - } + void reallocate(Arena<> *alloc) { + auto newCapacity = getCapacity() * 2; + auto *newData = alloc->allocate(memNeeded(newCapacity)); + std::memcpy(newData, data, memNeeded(numData)); + data = newData; + // return std::exchange(data, newData); + } + void addEdge(Arena<> *alloc, Dependence d) { + if (numData == getCapacity()) reallocate(alloc); set(ID{numData++}, d); - return ret; } static constexpr auto memNeeded(size_t N) -> size_t { - constexpr size_t memPer = sizeof(int32_t) * 2 + sizeof(DepPoly *) + - sizeof(Valid) * 2 + sizeof(bool) + + // memory per: + // - 3 `int32_t` vectors + // - `DepPoly*` + // - 2x Simplex + // - bool // pack?? + // - uint8_t + constexpr size_t memPer = 3 * sizeof(int32_t) + sizeof(DepPoly *) + + 2 * sizeof(Valid) + sizeof(bool) + sizeof(uint8_t); return N * memPer; } @@ -835,7 +842,7 @@ class Dependencies { } [[nodiscard]] constexpr auto getCapacity() const noexcept -> int32_t { - return int32_t(std::bit_ceil(uint32_t(numData))); + return std::max(initialCapacity, int32_t(std::bit_ceil(uint32_t(numData)))); } // field order: @@ -1088,7 +1095,7 @@ class Dependencies { Valid load = store->reload(alloc); copyDependencies(alloc, store, load); if (dxy->getTimeDim()) timeCheck(alloc, dxy, store, load, pair, true); - else timelessCheck(alloc, dxy, store, load, pair, true); + else addOrdered(alloc, dxy, store, load, pair, true); return load; } [[nodiscard]] constexpr auto inputEdgeIDs(int32_t id) const { From 0e21a901b9481fe80b106d1318c21748211593f7 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Thu, 30 Nov 2023 17:01:01 -0500 Subject: [PATCH 068/112] update offseting dependence code --- include/Polyhedra/Dependence.hpp | 156 +++++++++++++++++-------------- 1 file changed, 84 insertions(+), 72 deletions(-) diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 9d14bf3f6..d215daa55 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -552,7 +552,7 @@ static_assert(sizeof(Dependence) <= 64); class Dependencies { char *data{nullptr}; int32_t numData{0}; - static constexpr int32_t initialCapacity = 64; + static constexpr int32_t initialCapacity = 16; // int32_t tombstone{-1}; public: @@ -590,28 +590,52 @@ class Dependencies { in->setEdgeOut(i.id); out->setEdgeIn(i.id); } + /// NOTE: this reallocate implementation is dependent on `getCapacity()` + /// being defined as `std::bit_ceil(numData)`, and only getting called + /// when `numData == getCapacity()` and we're about to increment `numData` + /// after the call + /// TODO: would perhaps make more sense to use a normal heap allocator here... void reallocate(Arena<> *alloc) { - auto newCapacity = getCapacity() * 2; + size_t oldCapaciy = numData, newCapacity = 2 * oldCapaciy; auto *newData = alloc->allocate(memNeeded(newCapacity)); - std::memcpy(newData, data, memNeeded(numData)); + std::memcpy(newData + outAddrOffset * newCapacity, + data + outAddrOffset * oldCapaciy, + numData * sizeof(IR::Addr *)); + std::memcpy(newData + inAddrOffset * newCapacity, + data + inAddrOffset * oldCapaciy, numData * sizeof(IR::Addr *)); + std::memcpy(newData + depSatBndOffset * newCapacity, + data + depSatBndOffset * oldCapaciy, + numData * sizeof(std::array, 2>)); + std::memcpy(newData + depPolyOffset * newCapacity, + data + depPolyOffset * oldCapaciy, numData * sizeof(DepPoly *)); + std::memcpy(newData + nextEdgeOutOffset * newCapacity, + data + nextEdgeOutOffset * oldCapaciy, + numData * sizeof(int32_t)); + std::memcpy(newData + prevEdgeOutOffset * newCapacity, + data + prevEdgeOutOffset * oldCapaciy, + numData * sizeof(int32_t)); + std::memcpy(newData + nextEdgeInOffset * newCapacity, + data + nextEdgeInOffset * oldCapaciy, + numData * sizeof(int32_t)); + std::memcpy(newData + prevEdgeInOffset * newCapacity, + data + prevEdgeInOffset * oldCapaciy, + numData * sizeof(int32_t)); + std::memcpy(newData + revTimeEdgeOffset * newCapacity, + data + revTimeEdgeOffset * oldCapaciy, + numData * sizeof(int32_t)); + std::memcpy(newData + satLevelsOffset * newCapacity, + data + satLevelsOffset * oldCapaciy, + numData * sizeof(std::array)); + std::memcpy(newData + isForwardOffset * newCapacity, + data + isForwardOffset * oldCapaciy, numData * sizeof(bool)); data = newData; - // return std::exchange(data, newData); } void addEdge(Arena<> *alloc, Dependence d) { if (numData == getCapacity()) reallocate(alloc); set(ID{numData++}, d); } static constexpr auto memNeeded(size_t N) -> size_t { - // memory per: - // - 3 `int32_t` vectors - // - `DepPoly*` - // - 2x Simplex - // - bool // pack?? - // - uint8_t - constexpr size_t memPer = 3 * sizeof(int32_t) + sizeof(DepPoly *) + - 2 * sizeof(Valid) + sizeof(bool) + - sizeof(uint8_t); - return N * memPer; + return N * memNeededPer; } void addOrdered(Arena<> *alloc, Valid dxy, Valid x, @@ -846,125 +870,113 @@ class Dependencies { } // field order: - // AddrOut - // AddrIn - // nextOut - // prevOut - // nextIn - // prevIn - // dependenceSatisfaction - // dependenceBounding - // depPoly - // satLevel - // isForward - [[nodiscard]] static constexpr auto inAddrOffset() -> size_t { - return sizeof(IR::Addr *); - } - [[nodiscard]] static constexpr auto nextEdgeOutOffset() -> size_t { - return inAddrOffset() + sizeof(IR::Addr *); - } - [[nodiscard]] static constexpr auto prevEdgeOutOffset() -> size_t { - return nextEdgeOutOffset() + sizeof(int32_t); - } - [[nodiscard]] static constexpr auto nextEdgeInOffset() -> size_t { - return prevEdgeOutOffset() + sizeof(int32_t); - } - [[nodiscard]] static constexpr auto prevEdgeInOffset() -> size_t { - return nextEdgeInOffset() + sizeof(int32_t); - } - [[nodiscard]] static constexpr auto depSatBndOffset() -> size_t { - return prevEdgeInOffset() + sizeof(int32_t); - } - [[nodiscard]] static constexpr auto depPolyOffset() -> size_t { - return depSatBndOffset() + sizeof(std::array, 2>); - } - [[nodiscard]] static constexpr auto satLevelsOffset() -> size_t { - return depPolyOffset() + sizeof(DepPoly *); - } - [[nodiscard]] static constexpr auto isForwardOffset() -> size_t { - return satLevelsOffset() + sizeof(std::array); - } + // IR::Addr* AddrOut + // IR::Addr* AddrIn + // std::array, 2> {depSat, depBnd} + // DepPoly* depPoly + // int32_t nextOut + // int32_t prevOut + // int32_t nextIn + // int32_t prevIn + // int32_t revTimeEdge + // std::array satLevel + // bool isForward + static constexpr size_t outAddrOffset = 0; + static constexpr size_t inAddrOffset = outAddrOffset + sizeof(IR::Addr *); + static constexpr size_t depSatBndOffset = inAddrOffset + sizeof(IR::Addr *); + static constexpr size_t depPolyOffset = + inAddrOffset + sizeof(std::array, 2>); + static constexpr size_t nextEdgeOutOffset = depPolyOffset + sizeof(DepPoly *); + static constexpr size_t prevEdgeOutOffset = depPolyOffset + sizeof(int32_t); + static constexpr size_t nextEdgeInOffset = + prevEdgeOutOffset + sizeof(int32_t); + static constexpr size_t prevEdgeInOffset = nextEdgeInOffset + sizeof(int32_t); + static constexpr size_t revTimeEdgeOffset = depSatBndOffset + sizeof(int32_t); + static constexpr size_t satLevelsOffset = prevEdgeInOffset + sizeof(int32_t); + static constexpr size_t isForwardOffset = + satLevelsOffset + sizeof(std::array); + static constexpr size_t memNeededPer = isForwardOffset + sizeof(bool); constexpr auto outAddrPtr() -> IR::Addr ** { - void *p = data; + void *p = data + outAddrOffset * getCapacity(); return static_cast(p); } [[nodiscard]] constexpr auto outAddrPtr() const -> IR::Addr *const * { - const void *p = data; + const void *p = data + outAddrOffset * getCapacity(); return static_cast(p); } constexpr auto inAddrPtr() -> IR::Addr ** { - void *p = data + inAddrOffset() * getCapacity(); + void *p = data + inAddrOffset * getCapacity(); return static_cast(p); } [[nodiscard]] constexpr auto inAddrPtr() const -> IR::Addr *const * { - const void *p = data + inAddrOffset() * getCapacity(); + const void *p = data + inAddrOffset * getCapacity(); return static_cast(p); } constexpr auto outEdgePtr() -> int32_t * { - void *p = data + nextEdgeOutOffset() * getCapacity(); + void *p = data + nextEdgeOutOffset * getCapacity(); return static_cast(p); } [[nodiscard]] constexpr auto outEdgePtr() const -> const int32_t * { - const void *p = data + nextEdgeOutOffset() * getCapacity(); + const void *p = data + nextEdgeOutOffset * getCapacity(); return static_cast(p); } constexpr auto prevOutEdgePtr() -> int32_t * { - void *p = data + prevEdgeOutOffset() * getCapacity(); + void *p = data + prevEdgeOutOffset * getCapacity(); return static_cast(p); } [[nodiscard]] constexpr auto prevOutEdgePtr() const -> const int32_t * { - const void *p = data + prevEdgeOutOffset() * getCapacity(); + const void *p = data + prevEdgeOutOffset * getCapacity(); return static_cast(p); } constexpr auto inEdgePtr() -> int32_t * { - void *p = data + nextEdgeInOffset() * getCapacity(); + void *p = data + nextEdgeInOffset * getCapacity(); return static_cast(p); } [[nodiscard]] constexpr auto inEdgePtr() const -> const int32_t * { - const void *p = data + nextEdgeInOffset() * getCapacity(); + const void *p = data + nextEdgeInOffset * getCapacity(); return static_cast(p); } constexpr auto prevInEdgePtr() -> int32_t * { - void *p = data + prevEdgeInOffset() * getCapacity(); + void *p = data + prevEdgeInOffset * getCapacity(); return static_cast(p); } [[nodiscard]] constexpr auto prevEdgePtr() const -> const int32_t * { - const void *p = data + prevEdgeInOffset() * getCapacity(); + const void *p = data + prevEdgeInOffset * getCapacity(); return static_cast(p); } constexpr auto depSatBndPtr() -> std::array, 2> * { - void *p = data + depSatBndOffset() * getCapacity(); + void *p = data + depSatBndOffset * getCapacity(); return static_cast, 2> *>(p); } [[nodiscard]] constexpr auto depSatBndPtr() const -> const std::array, 2> * { - const void *p = data + depSatBndOffset() * getCapacity(); + const void *p = data + depSatBndOffset * getCapacity(); return static_cast, 2> *>(p); } constexpr auto depPolyPtr() -> DepPoly ** { - void *p = data + depPolyOffset() * getCapacity(); + void *p = data + depPolyOffset * getCapacity(); return static_cast(p); } [[nodiscard]] constexpr auto depPolyPtr() const -> DepPoly *const * { - const void *p = data + depPolyOffset() * getCapacity(); + const void *p = data + depPolyOffset * getCapacity(); return static_cast(p); } constexpr auto satLevelsPtr() -> std::array * { - void *p = data + satLevelsOffset() * getCapacity(); + void *p = data + satLevelsOffset * getCapacity(); return static_cast *>(p); } [[nodiscard]] constexpr auto satLevelsPtr() const -> const std::array * { - const void *p = data + satLevelsOffset() * getCapacity(); + const void *p = data + satLevelsOffset * getCapacity(); return static_cast *>(p); } constexpr auto isForwardPtr() -> bool * { - void *p = data + isForwardOffset() * getCapacity(); + void *p = data + isForwardOffset * getCapacity(); return static_cast(p); } [[nodiscard]] constexpr auto isForwardPtr() const -> const bool * { - const void *p = data + isForwardOffset() * getCapacity(); + const void *p = data + isForwardOffset * getCapacity(); return static_cast(p); } From b09e518d7ba3012027ead075a255cda706441df0 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Fri, 1 Dec 2023 08:12:36 -0500 Subject: [PATCH 069/112] Make Dependence POD so we can use kwarg-type initialization, add the revTimeEdge field and store in dependencies --- include/IR/Address.hpp | 2 +- include/Polyhedra/Dependence.hpp | 95 +++++++++++++++++++++----------- 2 files changed, 65 insertions(+), 32 deletions(-) diff --git a/include/IR/Address.hpp b/include/IR/Address.hpp index be28fa9bb..06a6f78c1 100644 --- a/include/IR/Address.hpp +++ b/include/IR/Address.hpp @@ -25,7 +25,7 @@ namespace lp { class ScheduledNode; } // namespace lp namespace poly { -class Dependence; +struct Dependence; class Dependencies; } // namespace poly namespace IR { diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index d215daa55..1f250c697 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -20,13 +20,13 @@ namespace poly { /// Represents a dependence relationship between two memory accesses. /// It contains simplices representing constraints that affine schedules /// are allowed to take. -class Dependence { -public: +struct Dependence { + // public: struct ID { int32_t id; }; -private: + // private: // // Valid depPoly; @@ -42,6 +42,7 @@ class Dependence { // // was because of offsets when solving the linear program (value = // // 1). // std::array satLvl{255, 255, 255, 255, 255, 255, 255}; + ID revTimeEdge_{-1}; std::array satLvl; bool forward; @@ -49,7 +50,7 @@ class Dependence { return {dependenceSatisfaction, dependenceBounding}; } -public: + // public: friend class Dependencies; // constexpr auto getNextInput() -> Dependence * { return nextInput; } // [[nodiscard]] constexpr auto getNextInput() const -> const Dependence * { @@ -61,13 +62,10 @@ class Dependence { // [[nodiscard]] constexpr auto getNextOutput() const -> const Dependence * { // return nextOutput; // } - [[nodiscard]] constexpr auto input() -> Valid { return in; } - [[nodiscard]] constexpr auto output() -> Valid { return out; } - [[nodiscard]] constexpr auto input() const -> Valid { - return in; - } - [[nodiscard]] constexpr auto output() const -> Valid { - return out; + [[nodiscard]] constexpr auto input() const -> Valid { return in; } + [[nodiscard]] constexpr auto output() const -> Valid { return out; } + [[nodiscard]] constexpr auto revTimeEdge() const -> ID { + return revTimeEdge_; } // constexpr auto setNextInput(Dependence *n) -> Dependence * { // return nextInput = n; @@ -75,18 +73,18 @@ class Dependence { // constexpr auto setNextOutput(Dependence *n) -> Dependence * { // return nextOutput = n; // } - constexpr Dependence(Valid poly, - std::array, 2> depSatBound, - Valid i, Valid o, bool fwd) - : depPoly(poly), dependenceSatisfaction(depSatBound[0]), - dependenceBounding(depSatBound[1]), in(i), out(o), forward(fwd) {} - constexpr Dependence(Valid poly, - std::array, 2> depSatBound, - Valid i, Valid o, - std::array sL, bool fwd) - : depPoly(poly), dependenceSatisfaction(depSatBound[0]), - dependenceBounding(depSatBound[1]), in(i), out(o), satLvl(sL), - forward(fwd) {} + // constexpr Dependence(Valid poly, + // std::array, 2> depSatBound, + // Valid i, Valid o, bool fwd) + // : depPoly(poly), dependenceSatisfaction(depSatBound[0]), + // dependenceBounding(depSatBound[1]), in(i), out(o), forward(fwd) {} + // constexpr Dependence(Valid poly, + // std::array, 2> depSatBound, + // Valid i, Valid o, + // std::array sL, bool fwd) + // : depPoly(poly), dependenceSatisfaction(depSatBound[0]), + // dependenceBounding(depSatBound[1]), in(i), out(o), satLvl(sL), + // forward(fwd) {} /// stashSatLevel() -> Dependence & /// This is used to track sat levels in the LP recursion. @@ -572,6 +570,9 @@ class Dependencies { } private: + /// set(ID i, Dependence d) + /// stores `d` at index `i` + /// Dependence `d` is pushed to the fronts of the edgeOut and edgeIn chains. constexpr void set(ID i, Dependence d) { auto out = d.output(); auto in = d.input(); @@ -584,6 +585,7 @@ class Dependencies { if (in->getEdgeIn() >= 0) prevIn(ID{in->getEdgeIn()}) = i.id; prevIn(i) = -1; depSatBnd(i) = d.getSimplexPair(); + revTimeEdge(i) = d.revTimeEdge().id; depPoly(i) = d.getDepPoly(); satLevelPair(i) = d.satLvl; isForward(i) = d.isForward(); @@ -630,9 +632,11 @@ class Dependencies { data + isForwardOffset * oldCapaciy, numData * sizeof(bool)); data = newData; } - void addEdge(Arena<> *alloc, Dependence d) { + auto addEdge(Arena<> *alloc, Dependence d) -> ID { if (numData == getCapacity()) reallocate(alloc); - set(ID{numData++}, d); + ID id{numData++}; + set(id, d); + return id; } static constexpr auto memNeeded(size_t N) -> size_t { return N * memNeededPer; @@ -647,7 +651,12 @@ class Dependencies { std::swap(x, y); } pair[0]->truncateVars(1 + numLambda + dxy->getNumScheduleCoef()); - addEdge(alloc, Dependence{dxy, pair, x, y, isFwd}); + addEdge(alloc, Dependence{.depPoly = dxy, + .dependenceSatisfaction = pair[0], + .dependenceBounding = pair[1], + .in = x, + .out = y, + .forward = isFwd}); } void timelessCheck(Arena<> *alloc, Valid dxy, Valid x, Valid y, @@ -712,10 +721,15 @@ class Dependencies { std::swap(pair[0], pair[1]); } pair[0]->truncateVars(1 + numLambda + numScheduleCoefs); - auto dep0 = Dependence{dxy->copy(alloc), pair, in, out, isFwd}; + Dependence dep0{.depPoly = dxy->copy(alloc), + .dependenceSatisfaction = pair[0], + .dependenceBounding = pair[1], + .in = in, + .out = out, + .forward = isFwd}; invariant(out->getCurrentDepth() + in->getCurrentDepth(), dep0.getNumPhiCoefficients()); - addEdge(alloc, dep0); + ID d0id{addEdge(alloc, dep0)}; // pair is invalid const ptrdiff_t timeDim = dxy->getTimeDim(), numVar = 1 + dxy->getNumVar() - timeDim; @@ -763,7 +777,13 @@ class Dependencies { numEqualityConstraintsOld, ineqEnd, posEqEnd, v, -2 * step); fp[0]->truncateVars(1 + numLambda + numScheduleCoefs); - auto dep1 = Dependence{dxy, farkasBackups, out, in, !isFwd}; + Dependence dep1{.depPoly = dxy, + .dependenceSatisfaction = farkasBackups[0], + .dependenceBounding = farkasBackups[1], + .in = out, + .out = in, + .revTimeEdge_ = d0id, + .forward = !isFwd}; invariant(out->getCurrentDepth() + in->getCurrentDepth(), dep1.getNumPhiCoefficients()); addEdge(alloc, dep1); @@ -859,8 +879,14 @@ class Dependencies { return false; } constexpr auto get(ID i, IR::Addr *in, IR::Addr *out) const -> Dependence { - return Dependence{depPoly(i), depSatBnd(i), in, out, - satLevelPair(i), isForward(i) + auto [depSat, depBnd] = depSatBnd(i); + return Dependence{.depPoly = depPoly(i), + .dependenceSatisfaction = depSat, + .dependenceBounding = depBnd, + .in = in, + .out = out, + .satLvl = satLevelPair(i), + .forward = isForward(i) }; } @@ -945,6 +971,10 @@ class Dependencies { const void *p = data + prevEdgeInOffset * getCapacity(); return static_cast(p); } + constexpr auto revTimeEdgePtr() -> int32_t * { + void *p = data + revTimeEdgeOffset * getCapacity(); + return static_cast(p); + } constexpr auto depSatBndPtr() -> std::array, 2> * { void *p = data + depSatBndOffset * getCapacity(); return static_cast, 2> *>(p); @@ -1041,6 +1071,9 @@ class Dependencies { constexpr auto depSatBnd(ID i) -> std::array, 2> & { return depSatBndPtr()[i.id]; } + constexpr auto revTimeEdge(ID i) -> int32_t & { + return revTimeEdgePtr()[i.id]; + } constexpr auto depPoly(ID i) -> DepPoly *& { return depPolyPtr()[i.id]; } [[nodiscard]] constexpr auto depSatBnd(ID i) const -> std::array, 2> { From 03fef4ce5ea60aba1910882d6a11943c6b5f2992 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Fri, 1 Dec 2023 11:59:20 -0500 Subject: [PATCH 070/112] minor progress --- include/LinearProgramming/LoopBlock.hpp | 3 ++ include/Optimize/Legality.hpp | 43 ++++++++++++++++++------- include/Polyhedra/Dependence.hpp | 1 + 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/include/LinearProgramming/LoopBlock.hpp b/include/LinearProgramming/LoopBlock.hpp index 4de077344..300b9991d 100644 --- a/include/LinearProgramming/LoopBlock.hpp +++ b/include/LinearProgramming/LoopBlock.hpp @@ -317,6 +317,9 @@ class LoopBlock { return {val, maxLoop, addr}; } + // We canonicalize offsets from `x[i - 1]` to `x[i]`, but being omega-shifted + // The LP minimizes omegas, which is intended to reduce distances. Thus, we + // want the distances to be reflected in the omegas. void shiftOmega(ScheduledNode *node) { unsigned nLoops = node->getNumLoops(); if (nLoops == 0) return; diff --git a/include/Optimize/Legality.hpp b/include/Optimize/Legality.hpp index 83c6b1b69..1ea1741c2 100644 --- a/include/Optimize/Legality.hpp +++ b/include/Optimize/Legality.hpp @@ -10,6 +10,11 @@ namespace poly::CostModeling { + +auto searchReduction(IR::Instruction* in, IR::Instruction*out)->bool{ + +} + // If a loop doesn't carry a dependency, it is legal // If a loop does carry a dependency, we can still consider // unrolling and vectorization if at least one of: @@ -29,14 +34,11 @@ namespace poly::CostModeling { // This is useful for considering, e.g., trapezoidal tiling. // - `maxIters()` - maximum number of iterations in which a dependence is held struct Legality { - enum class Reduction { None = 0, Unordered = 1, Ordered = 2 }; - uint8_t reduction : 2 {0}; - uint8_t mindistance : 6 {(1 << 6) - 1}; - uint8_t maxdistance{0}; + // enum class Reduction { None = 0, Unordered = 1, Ordered = 2 }; + uint16_t unordered_reduction_count{0}; + uint16_t mindistance{std::numeric_limits::max()}; + uint16_t maxdistance{0}; uint16_t maxiters{0}; - [[nodiscard]] constexpr auto getReduction() const -> Reduction { - return Reduction(reduction); - } [[nodiscard]] constexpr auto minDistance() const -> uint16_t { return mindistance; } @@ -45,7 +47,7 @@ struct Legality { } [[nodiscard]] constexpr auto maxIters() const -> uint16_t { return maxiters; } constexpr auto operator&=(Legality other) -> Legality & { - reduction = std::max(reduction, other.reduction); + unordered_reduction_count += other.unordered_reduction_count; mindistance = std::min(mindistance, other.mindistance); maxdistance = std::max(maxdistance, other.maxdistance); maxiters = std::max(maxiters, other.maxiters); @@ -57,14 +59,33 @@ struct Legality { } constexpr Legality() = default; constexpr Legality(const Legality &) = default; - Legality(Dependence d){ + Legality(IR::Dependencies deps, Dependence d) { // TODO: check if addr match // "Reduction" dependences should correspond to time dims. // In the memory-optimized IR, we have read/write to the // same address hoisted outside of the loop carrying `d` + if (d.revTimeEdge() && d.out->isLoad()) { + // Dependence rd = deps.get(rid); + // We don't actually need to use rid + // TODO: search between out and in + // If we have a reduction, then `d.out` is a load from an address + // that is then updated by some sequence of operations, before + // being stord in `d.in` + // (Because this is revTime, the load is the output as it must + // happen after the previous iteration's store.) + // We thus search the operation graph to find all paths + // from `d.out` to `d.in`. If there are none, then it is + // not a reduction, but updated in some other manner. + // If there is exactly one reassociable path, the reduction is unordered. + // Else, it is ordered? Do we need to consider ordered differently from no + // reduction? + IR::Addr *in = d.out, *out = d.in; + // If we have an operation chain leading from in->out + } }; - Legality(LoopDepSatisfaction deps, IR::Loop *L) { - for (poly::Dependence d : deps.depencencies(L)) (*this) &= Legality(d); + Legality(LoopDepSatisfaction deps, IR::Loop *L) { + for (poly::Dependence d : deps.depencencies(L)) + (*this) &= Legality(deps.deps, d); } }; diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 1f250c697..32df3ca69 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -24,6 +24,7 @@ struct Dependence { // public: struct ID { int32_t id; + [[nodiscard]] constexpr explicit operator bool() const { return id >= 0; } }; // private: From c90e7f04b6de137be7527b4a3fb6acbee8ea5eec Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Fri, 1 Dec 2023 15:30:14 -0500 Subject: [PATCH 071/112] add reassociable reduction checking --- compile_commands.json | 494 +++--------------------------- include/IR/Address.hpp | 18 ++ include/IR/Instruction.hpp | 42 ++- include/IR/Predicate.hpp | 9 +- include/Optimize/CostModeling.hpp | 4 + 5 files changed, 119 insertions(+), 448 deletions(-) diff --git a/compile_commands.json b/compile_commands.json index 680a03264..e5f51d923 100644 --- a/compile_commands.json +++ b/compile_commands.json @@ -1,667 +1,275 @@ [ { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -fpch-instantiate-templates -Xclang -emit-pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -x c++-header -o CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.cxx", + "command": "/bin/clang++ -DUSING_MIMALLOC -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -isystem /home/chriselrod/.local/include/mimalloc-2.1 -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -fpch-instantiate-templates -Xclang -emit-pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -x c++-header -o CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.cxx", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.cxx", "output": "CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/bumpmap_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/bumpmap_test.cpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/bumpmap_test.cpp", - "output": "CMakeFiles/LoopModelsTests.dir/bumpmap_test.cpp.o" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/comparator_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/comparator_test.cpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/comparator_test.cpp", - "output": "CMakeFiles/LoopModelsTests.dir/comparator_test.cpp.o" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/compat_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/compat_test.cpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/compat_test.cpp", - "output": "CMakeFiles/LoopModelsTests.dir/compat_test.cpp.o" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/dependence_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/dependence_test.cpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/dependence_test.cpp", - "output": "CMakeFiles/LoopModelsTests.dir/dependence_test.cpp.o" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/graph_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/graph_test.cpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/graph_test.cpp", - "output": "CMakeFiles/LoopModelsTests.dir/graph_test.cpp.o" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/orthogonalize_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/orthogonalize_test.cpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/orthogonalize_test.cpp", - "output": "CMakeFiles/LoopModelsTests.dir/orthogonalize_test.cpp.o" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/remarks_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/remarks_test.cpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/remarks_test.cpp", - "output": "CMakeFiles/LoopModelsTests.dir/remarks_test.cpp.o" + "command": "/bin/clang++ -DUSING_MIMALLOC -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -isystem /home/chriselrod/.local/include/mimalloc-2.1 -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/dict_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/dict_test.cpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/dict_test.cpp", + "output": "CMakeFiles/LoopModelsTests.dir/dict_test.cpp.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -o CMakeFiles/gtest.dir/src/gtest-all.cc.o -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-all.cc", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -o CMakeFiles/gtest.dir/src/gtest-all.cc.o -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-all.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-all.cc", "output": "_deps/googletest-build/googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -o CMakeFiles/gtest_main.dir/src/gtest_main.cc.o -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest_main.cc", + "command": "/bin/clang++ -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -o CMakeFiles/gtest_main.dir/src/gtest_main.cc.o -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest_main.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest_main.cc", "output": "_deps/googletest-build/googletest/CMakeFiles/gtest_main.dir/src/gtest_main.cc.o" }, -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++23 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -fpch-instantiate-templates -Xclang -emit-pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -x c++-header -o CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.cxx", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.cxx", - "output": "LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++23 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -o CMakeFiles/LoopModels.dir/lib/TurboLoop.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/lib/TurboLoop.cpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/lib/TurboLoop.cpp", - "output": "LoopModels/CMakeFiles/LoopModels.dir/lib/TurboLoop.cpp.o" -}, - { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/BumpMapSet.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/BumpMapSet.hpp" + "command": "/bin/clang++ -DUSING_MIMALLOC -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -isystem /home/chriselrod/.local/include/mimalloc-2.1 -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/Trie.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/Trie.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/BumpVector.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/BumpVector.hpp" + "command": "/bin/clang++ -DUSING_MIMALLOC -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -isystem /home/chriselrod/.local/include/mimalloc-2.1 -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/Pair.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/Pair.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Array.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Array.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/Storage.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/Storage.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/ArrayOps.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/ArrayOps.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Indexing.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Indexing.hpp" + "command": "/bin/clang++ -DUSING_MIMALLOC -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -isystem /home/chriselrod/.local/include/mimalloc-2.1 -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Alloc/Arena.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Alloc/Arena.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/AxisTypes.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/AxisTypes.hpp" + "command": "/bin/clang++ -DUSING_MIMALLOC -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -isystem /home/chriselrod/.local/include/mimalloc-2.1 -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Alloc/Mallocator.hpp", + "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Alloc/Mallocator.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Invariant.hpp", + "command": "/bin/clang++ -DUSING_MIMALLOC -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -isystem /home/chriselrod/.local/include/mimalloc-2.1 -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Invariant.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Invariant.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Iterators.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Iterators.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/MatrixDimensions.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/MatrixDimensions.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Matrix.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Matrix.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Vector.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Vector.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/TypePromotion.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/TypePromotion.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/UniformScaling.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/UniformScaling.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Rational.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Rational.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/GreatestCommonDivisor.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/GreatestCommonDivisor.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Alloc/Arena.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Alloc/Arena.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Valid.hpp", + "command": "/bin/clang++ -DUSING_MIMALLOC -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -isystem /home/chriselrod/.local/include/mimalloc-2.1 -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Valid.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Valid.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Optional.hpp", + "command": "/bin/clang++ -DUSING_MIMALLOC -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -isystem /home/chriselrod/.local/include/mimalloc-2.1 -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Optional.hpp", "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Optional.hpp" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include/ankerl/unordered_dense.h", + "command": "/bin/clang++ -DUSING_MIMALLOC -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -isystem /home/chriselrod/.local/include/mimalloc-2.1 -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include/ankerl/unordered_dense.h", "file": "/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include/ankerl/unordered_dense.h" }, -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Comparators.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Comparators.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Constraints.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Constraints.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/BitSets.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/BitSets.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Comparisons.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Comparisons.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/EmptyArrays.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/EmptyArrays.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Math.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Math.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/NormalForm.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/NormalForm.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Constructors.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Constructors.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/VectorGreatestCommonDivisor.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/VectorGreatestCommonDivisor.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Simplex.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Simplex.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/MatrixStringParse.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/MatrixStringParse.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Loops.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Loops.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Polyhedra.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Polyhedra.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/RemarkAnalysis.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/RemarkAnalysis.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Support/OStream.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Support/OStream.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/TestUtilities.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/TestUtilities.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/ArrayReference.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/ArrayReference.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Address.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Address.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/InstructionCost.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/InstructionCost.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Node.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Node.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/UnrolledList.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/UnrolledList.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Users.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Users.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Support/Iterators.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Support/Iterators.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/ListRanges.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/ListRanges.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/CostModeling.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/CostModeling.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Graphs/Graphs.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Graphs/Graphs.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/OptimizationPossibilities.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/OptimizationPossibilities.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Hash.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Hash.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++23 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Instruction.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Instruction.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++23 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Predicate.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Predicate.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++23 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/TinyVector.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/TinyVector.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/LoopBlock.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/LoopBlock.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Cache.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/Cache.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/BBPredPath.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/BBPredPath.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/MapVector.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/MapVector.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/ScheduledNode.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/LinearProgramming/ScheduledNode.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Dependence.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Dependence.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/DependencyPolyhedra.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/DependencyPolyhedra.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Orthogonalize.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/Orthogonalize.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Schedule.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Polyhedra/Schedule.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/StaticArrays.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Math/StaticArrays.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/usr/bin/clang++ -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Graphs/IndexGraphs.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Graphs/IndexGraphs.hpp" -}, - { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-assertion-result.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-assertion-result.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-assertion-result.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-message.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-message.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-message.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-port.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-port.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-port.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest-port.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest-port.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest-port.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-port-arch.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-port-arch.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-port-arch.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-death-test.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-death-test.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-death-test.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-death-test-internal.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-death-test-internal.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-death-test-internal.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-matchers.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-matchers.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-matchers.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-printers.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-printers.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-printers.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-internal.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-internal.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-internal.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-filepath.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-filepath.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-filepath.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-string.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-string.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-string.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-type-util.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-type-util.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-type-util.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest-printers.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest-printers.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest-printers.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-param-test.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-param-test.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-param-test.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-param-util.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-param-util.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-param-util.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-test-part.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-test-part.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-test-part.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-typed-test.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-typed-test.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-typed-test.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest_pred_impl.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest_pred_impl.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest_pred_impl.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest_prod.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest_prod.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest_prod.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-assertion-result.cc", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-assertion-result.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-assertion-result.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-death-test.cc", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-death-test.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-death-test.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-internal-inl.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-internal-inl.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-internal-inl.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-spi.h", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-spi.h", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-spi.h" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-filepath.cc", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-filepath.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-filepath.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-matchers.cc", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-matchers.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-matchers.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-port.cc", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-port.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-port.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-printers.cc", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-printers.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-printers.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-test-part.cc", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-test-part.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-test-part.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-typed-test.cc", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-typed-test.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-typed-test.cc" }, { "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/usr/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest.cc", + "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest.cc", "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest.cc" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++23 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/TurboLoop.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/TurboLoop.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels", - "command": "/usr/bin/clang++ -DLoopModels_EXPORTS -I/home/chriselrod/Documents/progwork/cxx/LoopModels/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/PackageProjectInclude -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -g -std=gnu++23 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fstrict-aliasing -fno-plt -fstrict-overflow -fno-omit-frame-pointer -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx.gch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/LoopModels/CMakeFiles/LoopModels.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/ControlFlowMerging.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/IR/ControlFlowMerging.hpp" } ] diff --git a/include/IR/Address.hpp b/include/IR/Address.hpp index 06a6f78c1..6aecf904c 100644 --- a/include/IR/Address.hpp +++ b/include/IR/Address.hpp @@ -86,6 +86,12 @@ class Addr : public Instruction { const llvm::SCEV **syms; Value *predicate{nullptr}; Addr *origNext{nullptr}; + /// We find reductionns during `IROptimizer` initialization + /// after sorting edges and removing redundant `Addr` + /// this is because we may have multiple repeat stores to the the same + /// location, and a reduction would be the closest pair. Thus, we want to have + /// an ordering. + Addr *reassociableReduction{nullptr}; // if reduction, corresponding addr uint16_t numDim{0}, numDynSym{0}; int32_t topologicalPosition; OrthogonalAxes axes; @@ -131,6 +137,7 @@ class Addr : public Instruction { [[nodiscard]] constexpr auto offsetMatrix() -> MutDensePtrMatrix { return {offSym, DenseDims<>{{getArrayDim()}, {numDynSym}}}; } + /// recursive reassociability search public: [[nodiscard]] constexpr auto getOrthAxes() const -> OrthogonalAxes { @@ -251,6 +258,17 @@ class Addr : public Instruction { origNext = a; return this; } + // Called from IROptimizer + // In a reduction, `in` must be a load and `out` a store + // This should only be called once, between nearest load/store pair + // as it doesn't store detecting invalidity. + // It checks for invalidity, in which case it doesn't set the reassociable + // reduction. + constexpr inline void maybeReassociableReduction(Addr *dst); + constexpr auto reassociableReductionPair() -> Addr * { + return reassociableReduction; + } + [[nodiscard]] static constexpr auto intMemNeeded(size_t numLoops, size_t dim) -> size_t { // d = dim, l = numLoops diff --git a/include/IR/Instruction.hpp b/include/IR/Instruction.hpp index e63526493..ef5b54e97 100644 --- a/include/IR/Instruction.hpp +++ b/include/IR/Instruction.hpp @@ -192,6 +192,10 @@ class Compute : public Instruction { [[nodiscard]] auto allowsContract() const -> bool { return fastMathFlags.allowContract(); } + [[nodiscard]] auto reassociableArgs() const -> uint32_t { + if (!fastMathFlags.allowReassoc()) return 0; + return isMulAdd() ? 0x4 : ((0x1 << numOperands) - 1); + } // Incomplete stores the correct number of ops it was allocated with as a // negative number. The primary reason for being able to check // completeness is for `==` checks and hashing. @@ -803,7 +807,7 @@ Compute::calcCost(const llvm::TargetTransformInfo &TTI, unsigned vectorWidth) if (auto *I = getInstruction()) return I->getParent(); return nullptr; } -[[nodiscard]] auto Instruction::getIdentifier() const +[[nodiscard]] inline auto Instruction::getIdentifier() const -> Instruction::Identifier { llvm::Intrinsic::ID id; if (const auto *I = llvm::dyn_cast(this)) id = I->getOpId(); @@ -837,6 +841,42 @@ inline void Instruction::setOperands(Arena<> *alloc, // llvm::Intrinsic::IndependentIntrinsics x = llvm::Intrinsic::sqrt; // llvm::Intrinsic::IndependentIntrinsics y = llvm::Intrinsic::sin; +/// Defined here, because we're using `Compute` +constexpr auto find(Addr *src, Compute *dst) -> bool { + return std::ranges::any_of(dst->getOperands(), [=](Value *op) -> bool { + if (op == src) return true; + if (auto *c = llvm::dyn_cast(op)) return find(src, c); + return false; + }); +} +// NOLINTNEXTLINE misc-no-recursion +constexpr auto findThroughReassociable(Addr *src, Compute *dst) -> unsigned { + uint32_t reassociable = dst->reassociableArgs(); + // foundflag&1 == found reassociable + // foundflag&2 == found non-reassociable + unsigned foundflag = 0; + for (Value *op : dst->getOperands()) { + auto *c = llvm::dyn_cast(op); + if (reassociable & 1) + if (op == src) foundflag |= 1; + else foundflag |= findThroughReassociable(src, c); + else if ((op == src) || (c && find(src, c))) return 0x2; + if (foundflag & 2) return 0x2; + reassociable >>= 1; + } + return foundflag; +} +constexpr inline void Addr::maybeReassociableReduction(Addr *dst) { + if (!isLoad()) return; + if (dst->isLoad()) return; + auto *c = llvm::dyn_cast(dst->getStoredVal()); + if (!c) return; + unsigned f = findThroughReassociable(this, c); + if (f != 1) return; + reassociableReduction = dst; + dst->reassociableReduction = this; +} + } // namespace poly::IR [[nodiscard]] inline auto diff --git a/include/IR/Predicate.hpp b/include/IR/Predicate.hpp index a4e73637b..d290bc9a6 100644 --- a/include/IR/Predicate.hpp +++ b/include/IR/Predicate.hpp @@ -2,9 +2,10 @@ #include "Containers/UnrolledList.hpp" #include "Dicts/BumpVector.hpp" -#include #include +#include #include +#include #include #include #include @@ -49,18 +50,18 @@ struct Intersection { constexpr Intersection(size_t index, Relation value) : predicates(static_cast(value) << (2 * index)) {} constexpr auto operator[](size_t index) const -> Relation { - assert(index < 32); + invariant(index < 32); return static_cast((predicates >> (2 * (index))) & 3); } void set(size_t index, Relation value) { - assert(index < 32); + invariant(index < 32); index += index; uint64_t maskedOff = predicates & ~(3ULL << (index)); predicates = maskedOff | static_cast(value) << (index); } [[nodiscard]] auto intersect(size_t index, Relation value) const -> Intersection { - assert(index < 32); + invariant(index < 32); index += index; return {predicates | static_cast(value) << (index)}; } diff --git a/include/Optimize/CostModeling.hpp b/include/Optimize/CostModeling.hpp index d45accc2b..d7437e925 100644 --- a/include/Optimize/CostModeling.hpp +++ b/include/Optimize/CostModeling.hpp @@ -597,6 +597,9 @@ class IROptimizer { } return pos; } + void findReductions(IR::AddrChain) { + static_assert(false, "not implemented yet"); + }; public: IROptimizer(IR::Dependencies deps, IR::Cache &instr, @@ -608,6 +611,7 @@ class IROptimizer { eraseCandidates{eraseCandidates_}, root_{root}, lalloc_{lalloc} { sortEdges(root_, 0); removeRedundantAddr(res.addr); + findReductions(res.addr); unsigned numAddr = eliminateTemporaries(res.addr); loopDeps = loopDepSats(lalloc, deps, res); // plan now is to have a `BitArray` big enough to hold `numLoops` entries From 9fcc11b3875e7ecc26090ddf1f1a7028f6e00d2f Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Sat, 2 Dec 2023 08:06:13 -0500 Subject: [PATCH 072/112] finish basic reassociable impl --- compile_commands.json | 275 ------------------------------ include/IR/Address.hpp | 2 +- include/IR/Instruction.hpp | 11 -- include/Optimize/CostModeling.hpp | 78 ++++----- include/Polyhedra/Dependence.hpp | 2 + 5 files changed, 35 insertions(+), 333 deletions(-) delete mode 100644 compile_commands.json diff --git a/compile_commands.json b/compile_commands.json deleted file mode 100644 index e5f51d923..000000000 --- a/compile_commands.json +++ /dev/null @@ -1,275 +0,0 @@ -[ -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -DUSING_MIMALLOC -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -isystem /home/chriselrod/.local/include/mimalloc-2.1 -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -fpch-instantiate-templates -Xclang -emit-pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -x c++-header -o CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.cxx", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.cxx", - "output": "CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -DUSING_MIMALLOC -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -isystem /home/chriselrod/.local/include/mimalloc-2.1 -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -o CMakeFiles/LoopModelsTests.dir/dict_test.cpp.o -c /home/chriselrod/Documents/progwork/cxx/LoopModels/test/dict_test.cpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/test/dict_test.cpp", - "output": "CMakeFiles/LoopModelsTests.dir/dict_test.cpp.o" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -o CMakeFiles/gtest.dir/src/gtest-all.cc.o -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-all.cc", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-all.cc", - "output": "_deps/googletest-build/googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -o CMakeFiles/gtest_main.dir/src/gtest_main.cc.o -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest_main.cc", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest_main.cc", - "output": "_deps/googletest-build/googletest/CMakeFiles/gtest_main.dir/src/gtest_main.cc.o" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -DUSING_MIMALLOC -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -isystem /home/chriselrod/.local/include/mimalloc-2.1 -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/Trie.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/include/Dicts/Trie.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -DUSING_MIMALLOC -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -isystem /home/chriselrod/.local/include/mimalloc-2.1 -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/Pair.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Containers/Pair.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -DUSING_MIMALLOC -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -isystem /home/chriselrod/.local/include/mimalloc-2.1 -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Alloc/Arena.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Alloc/Arena.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -DUSING_MIMALLOC -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -isystem /home/chriselrod/.local/include/mimalloc-2.1 -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Alloc/Mallocator.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Alloc/Mallocator.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -DUSING_MIMALLOC -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -isystem /home/chriselrod/.local/include/mimalloc-2.1 -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Invariant.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Invariant.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -DUSING_MIMALLOC -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -isystem /home/chriselrod/.local/include/mimalloc-2.1 -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Valid.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Valid.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -DUSING_MIMALLOC -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -isystem /home/chriselrod/.local/include/mimalloc-2.1 -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Optional.hpp", - "file": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include/Utilities/Optional.hpp" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan", - "command": "/bin/clang++ -DUSING_MIMALLOC -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test/../include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/test -I/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-src/include -I/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/math-build/PackageProjectInclude -isystem //include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -isystem /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -isystem /home/chriselrod/.local/include/mimalloc-2.1 -g -std=gnu++23 -fno-exceptions -fno-rtti -ferror-limit=8 -fcolor-diagnostics -Wall -Wpedantic -Wextra -Wshadow -D_GLIBCXX_ASSERTIONS -Winvalid-pch -Xclang -include-pch -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx.pch -Xclang -include -Xclang /home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/CMakeFiles/LoopModelsTests.dir/cmake_pch.hxx -c /home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include/ankerl/unordered_dense.h", - "file": "/home/chriselrod/.cache/CPM/unordered_dense/01b84887a44155645ad5caf7efee7b8e4141e179/include/ankerl/unordered_dense.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest.h", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-assertion-result.h", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-assertion-result.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-message.h", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-message.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-port.h", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-port.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest-port.h", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest-port.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-port-arch.h", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-port-arch.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-death-test.h", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-death-test.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-death-test-internal.h", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-death-test-internal.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-matchers.h", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-matchers.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-printers.h", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-printers.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-internal.h", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-internal.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-filepath.h", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-filepath.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-string.h", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-string.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-type-util.h", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-type-util.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest-printers.h", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest-printers.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-param-test.h", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-param-test.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-param-util.h", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/gtest-param-util.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-test-part.h", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-test-part.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-typed-test.h", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-typed-test.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest_pred_impl.h", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest_pred_impl.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest_prod.h", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest_prod.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-assertion-result.cc", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-assertion-result.cc" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-death-test.cc", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-death-test.cc" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest.h", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/internal/custom/gtest.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-internal-inl.h", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-internal-inl.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-spi.h", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include/gtest/gtest-spi.h" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-filepath.cc", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-filepath.cc" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-matchers.cc", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-matchers.cc" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-port.cc", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-port.cc" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-printers.cc", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-printers.cc" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-test-part.cc", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-test-part.cc" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-typed-test.cc", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest-typed-test.cc" -}, - -{ - "directory": "/home/chriselrod/Documents/progwork/cxx/LoopModels/buildclang/nosan/_deps/googletest-build/googletest", - "command": "/bin/clang++ -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/include -I/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest -g -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Wshadow -Wconversion -DGTEST_HAS_PTHREAD=1 -fexceptions -W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls -c /home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest.cc", - "file": "/home/chriselrod/.cache/CPM/googletest/96129d89f45386492ae46d6bb8c027bc3df5f949/googletest/src/gtest.cc" -} -] diff --git a/include/IR/Address.hpp b/include/IR/Address.hpp index 6aecf904c..472b303fa 100644 --- a/include/IR/Address.hpp +++ b/include/IR/Address.hpp @@ -264,7 +264,7 @@ class Addr : public Instruction { // as it doesn't store detecting invalidity. // It checks for invalidity, in which case it doesn't set the reassociable // reduction. - constexpr inline void maybeReassociableReduction(Addr *dst); + constexpr inline void maybeReassociableReduction(Dependencies); constexpr auto reassociableReductionPair() -> Addr * { return reassociableReduction; } diff --git a/include/IR/Instruction.hpp b/include/IR/Instruction.hpp index ef5b54e97..50669bf97 100644 --- a/include/IR/Instruction.hpp +++ b/include/IR/Instruction.hpp @@ -866,17 +866,6 @@ constexpr auto findThroughReassociable(Addr *src, Compute *dst) -> unsigned { } return foundflag; } -constexpr inline void Addr::maybeReassociableReduction(Addr *dst) { - if (!isLoad()) return; - if (dst->isLoad()) return; - auto *c = llvm::dyn_cast(dst->getStoredVal()); - if (!c) return; - unsigned f = findThroughReassociable(this, c); - if (f != 1) return; - reassociableReduction = dst; - dst->reassociableReduction = this; -} - } // namespace poly::IR [[nodiscard]] inline auto diff --git a/include/Optimize/CostModeling.hpp b/include/Optimize/CostModeling.hpp index d7437e925..451227dab 100644 --- a/include/Optimize/CostModeling.hpp +++ b/include/Optimize/CostModeling.hpp @@ -30,54 +30,40 @@ #include #include #include +namespace poly::IR { +/// If this is a store of a reassocialbe reduction, this sets the +/// `reassociableReduction` field to the corresponding load, and that field of +/// the load to `this` store. +/// It requires `Addr` to have been sorted, so we check the first output edge of +/// this store. If that edge is a load within the same loop, and has a time +/// dependence, we check for a reassociable chain of compute operations +/// connecting them. If such a chain, without any non-reassociable chains, +/// exists, then we mark them as reassociable. +constexpr inline void Addr::maybeReassociableReduction(Dependencies deps) { + if (isLoad()) return; + // we should have a store whose first output edge is the load for + // the following iteration. This iter is the reverse-time + // edge. + auto edges{outputEdgeIDs(deps, getCurrentDepth())}; + auto B = edges.begin(); + if (B == edges.end()) return; + poly::Dependence::ID id{*B}; + if (!deps.revTimeEdge(id)) return; + IR::Addr *dst = deps.output(id); + if (dst->isStore() || (getLoop() != dst->getLoop())) return; + auto *c = llvm::dyn_cast(getStoredVal()); + if (!c) return; + unsigned f = findThroughReassociable(dst, c); + if (f != 1) return; + reassociableReduction = dst; + dst->reassociableReduction = this; +} + +} // namespace poly::IR namespace poly::CostModeling { using poly::Dependence; // struct CPUExecutionModel {}; -// Plan for cost modeling: -// 1. Build Instruction graph -// 2. Iterate over all PredicatedChains, merging instructions across branches -// where possible -// 3. Create a loop tree structure for optimization -// 4. Create InstructionBlocks at each level. - -// void pushBlock(llvm::SmallPtrSet &trackInstr, -// llvm::SmallPtrSet &chainBBs, -// Predicates &pred, llvm::BasicBlock *BB) { -// assert(chainBBs.contains(block)); -// chainBBs.erase(BB); -// // we only want to extract relevant instructions, i.e. parents of -// stores for (llvm::Instruction &instr : *BB) { -// if (trackInstr.contains(&instr)) -// instructions.emplace_back(pred, instr); -// } -// llvm::Instruction *term = BB->getTerminator(); -// if (!term) -// return; -// switch (term->getNumSuccessors()) { -// case 0: -// return; -// case 1: -// BB = term->getSuccessor(0); -// if (chainBBs.contains(BB)) -// pushBlock(trackInstr, chainBBs, pred, BB); -// return; -// case 2: -// break; -// default: -// assert(false); -// } -// auto succ0 = term->getSuccessor(0); -// auto succ1 = term->getSuccessor(1); -// if (chainBBs.contains(succ0) && chainBBs.contains(succ1)) { -// // TODO: we need to fuse these blocks. - -// } else if (chainBBs.contains(succ0)) { -// pushBlock(trackInstr, chainBBs, pred, succ0); -// } else if (chainBBs.contains(succ1)) { -// pushBlock(trackInstr, chainBBs, pred, succ1); -// } -// } template using Vec = math::ResizeableView; // TODO: instead of this, update in-place and ensure all Addr are @@ -597,8 +583,8 @@ class IROptimizer { } return pos; } - void findReductions(IR::AddrChain) { - static_assert(false, "not implemented yet"); + void findReductions(IR::AddrChain addr) { + for (IR::Addr *a : addr.getAddr()) a->maybeReassociableReduction(deps); }; public: diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 32df3ca69..9cbbe184c 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -1015,6 +1015,7 @@ class Dependencies { constexpr void removeEdge(ID id) { removeOutEdge(id.id); removeInEdge(id.id); + /// TODO: remove revTimeEdge? } constexpr void removeOutEdge(int32_t id) { int32_t prev = prevOut(poly::Dependence::ID{id}); @@ -1256,6 +1257,7 @@ inline auto Loop::getLegality(poly::Dependencies deps, } return setLegal(None); } + } // namespace IR namespace poly { From 223a598ab47fba0cb7efabd5b6e8b86ada1449de Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Sat, 2 Dec 2023 10:21:07 -0500 Subject: [PATCH 073/112] a few reduction updates and legality comments --- include/IR/Address.hpp | 8 +++ include/Optimize/CostModeling.hpp | 33 +++++++++- include/Optimize/Legality.hpp | 102 ++++++++++++++++++++++-------- include/Polyhedra/Dependence.hpp | 2 +- 4 files changed, 116 insertions(+), 29 deletions(-) diff --git a/include/IR/Address.hpp b/include/IR/Address.hpp index 472b303fa..8af1b46b7 100644 --- a/include/IR/Address.hpp +++ b/include/IR/Address.hpp @@ -398,6 +398,10 @@ class Addr : public Instruction { [[nodiscard]] constexpr auto getAffLoop() const -> Valid { return loop; } + /// Get the value stored by this instruction. + /// invariant: this instruction must only be called if `Addr` is a store! + /// For a load, use `getUsers()` to get a range of the users. + /// Returns the parent (other than predicates). [[nodiscard]] constexpr auto getStoredVal() const -> Value * { invariant(isStore()); return users.getVal(); @@ -419,6 +423,10 @@ class Addr : public Instruction { invariant(Value::classof(n)); predicate = static_cast(n); } + /// Get the users of this load. + /// invariant: this instruction must only be called if `Addr` is a load! + /// For a store, use `getStoredVal()` to get the stored value. + /// Returns the children. [[nodiscard]] constexpr auto getUsers() -> Users & { invariant(isLoad()); return users; diff --git a/include/Optimize/CostModeling.hpp b/include/Optimize/CostModeling.hpp index 451227dab..77fe80498 100644 --- a/include/Optimize/CostModeling.hpp +++ b/include/Optimize/CostModeling.hpp @@ -39,6 +39,29 @@ namespace poly::IR { /// dependence, we check for a reassociable chain of compute operations /// connecting them. If such a chain, without any non-reassociable chains, /// exists, then we mark them as reassociable. +/// Note, with sorting +/// for (int i = 0; i < I; ++i) +/// for (int j = 0; j < J; ++j) +/// x[i] = x[i] + A[j,i] * y[j]; +/// x[i] = acc; +/// +/// we have the store `x[i]` is the source for the `x[i]` load on a future +/// `j` iteration. +/// However, our IR would be optimized into: + /// +/// for (int i = 0; i < I; ++i){ +/// acc = x[i]; +/// for (int j = 0; j < J; ++j) +/// acc += A[j,i] * y[j]; +/// x[i] = acc; +/// } +/// +/// The same thing applies: `j` is the loop that satifies the dependency, +/// but we hoisted the load/store pair out. +/// This must be called after `sortEdges`, so that output edges of the store +/// `x[i] = acc` are top sorted. The load `acc = x[i]` should be the very +/// first output topologically -- afterall, it occus before the store!! +/// TODO: does `Addr` hoisting handle this?? constexpr inline void Addr::maybeReassociableReduction(Dependencies deps) { if (isLoad()) return; // we should have a store whose first output edge is the load for @@ -51,6 +74,9 @@ constexpr inline void Addr::maybeReassociableReduction(Dependencies deps) { if (!deps.revTimeEdge(id)) return; IR::Addr *dst = deps.output(id); if (dst->isStore() || (getLoop() != dst->getLoop())) return; + // if we failed to hoist the `Addr` out of time-dims, then we cannot optimize. + if (getCurrentDepth() >= deps.satLevel(id)) return; + if (reassociableReduction == dst) return; // multiple time dims, already found auto *c = llvm::dyn_cast(getStoredVal()); if (!c) return; unsigned f = findThroughReassociable(dst, c); @@ -534,7 +560,7 @@ class IROptimizer { void removeRedundantAddr(IR::AddrChain addr) { // outputEdges are sorted topologically from first to last. // Example: - // for (int i = 0 : i < I; ++i){ + // for (int i = 0; i < I; ++i){ // acc = x[i]; // Statement: 0 // for (int j = 0; j < i; ++j){ // acc -= x[j]*U[j,i]; // Statement: 1 @@ -553,6 +579,9 @@ class IROptimizer { // current iter from the list. for (IR::Addr *a : addr.getAddr()) eliminateAddr(a); } + /// `sortEdges` sorts each `Addr`'s output edges + /// So that each `Addr`'s output edges are sorted based on the + /// topological ordering of the outputs. /// The approach to sorting edges is to iterate through nodes backwards /// whenever we encounter an `Addr`, we push it to the front of each /// output edge list to which it belongs. @@ -662,7 +691,7 @@ class IROptimizer { // Which gives: // i_l = i_s = j_l < i_l // a contradiction, meaning that the dependency is -// conditionally (on our schedule) independent. +// conditionally (on our schedule) satisfied. // Excluding the `i_s = i_l` constraint from the // polyhedra gives us the region of overlap. // diff --git a/include/Optimize/Legality.hpp b/include/Optimize/Legality.hpp index 1ea1741c2..7397f7264 100644 --- a/include/Optimize/Legality.hpp +++ b/include/Optimize/Legality.hpp @@ -10,10 +10,7 @@ namespace poly::CostModeling { - -auto searchReduction(IR::Instruction* in, IR::Instruction*out)->bool{ - -} +auto searchReduction(IR::Instruction *in, IR::Instruction *out) -> bool {} // If a loop doesn't carry a dependency, it is legal // If a loop does carry a dependency, we can still consider @@ -33,6 +30,71 @@ auto searchReduction(IR::Instruction* in, IR::Instruction*out)->bool{ // In the above example, the value is also `8`. // This is useful for considering, e.g., trapezoidal tiling. // - `maxIters()` - maximum number of iterations in which a dependence is held +// +// Note that it is always legal to unroll an innermost loop (scalarizing). +// But we need reorderability for unroll and jam. +// For example, this loop carries a dependency +// example 0: +// for (ptrdiff_t i = 1; i < x.size(); ++i) +// x[i] += x[i-1]; +// but we may wish to unroll it to reduce the amount of `mov` instructions +// needed, as well as `i` increments. +// However, if we had some other loop dependent on this +// +// example 1: +// for (ptrdiff_t i = 1; i < x.size(); ++i){ +// decltype(y[0,0]/x[0]) s = 0; +// for (ptrdiff_t j = 0; j < y.size(); ++j) +// s += y[i,j] / x[i-1]; +// x[i] += s * x[i-1]; +// } +// an unroll and jam would be illegal. +// TODO: what if the innermost loop isn't dependent? +// example 2: +// for (ptrdiff_t i = 1; i < x.size(); ++i){ +// decltype(y[0,0]+y[0,0]) s = 0; +// for (ptrdiff_t j = 0; j < y.size(); ++j) +// s += y[i,j]; +// x[i] += s * x[i-1]; +// } +// Here, we can unroll and jam. +// example 3: +// for (ptrdiff_t i = 1; i < x.size()-3; i+=4){ +// decltype(y[0,0]+y[0,0]) s0 = 0; +// decltype(y[0,0]+y[0,0]) s1 = 0; +// decltype(y[0,0]+y[0,0]) s2 = 0; +// decltype(y[0,0]+y[0,0]) s3 = 0; +// for (ptrdiff_t j = 0; j < y.size(); ++j){ +// s0 += y[i,j]; +// s1 += y[i+1,j]; +// s2 += y[i+2,j]; +// s3 += y[i+3,j]; +// } +// x[i] += s0 * x[i-1]; +// x[i+1] += s1 * x[i]; +// x[i+2] += s2 * x[i+1]; +// x[i+3] += s3 * x[i+2]; +// } +// So we can generalize to say, we can always unroll the innermost where the +// addr are read. +// +// example 4: +// for (i : I) +// for (j : J) +// for (k : K) +// for (l : L) +// B[i,j] += A[i+k,j+l] * K[k,l]; +// +// +// TODO items: +// 1. Store time deps in cycle w/in `Dependencies` object so we can iterate over +// all of them. This also requires pruning these as we drop deps, updating +// IR::Addr::operator->drop(Dependence). +// 2. Check `Addr` hoisting code for how it handles reductions, ensuring we can +// hoist them out. +// 3. Fuse legality checking, at least in part, with it, as that may indicate +// unrolling in example 3 above. +// 4. See discussionin CostModeling.hpp above `optimize` about unrolling. struct Legality { // enum class Reduction { None = 0, Unordered = 1, Ordered = 2 }; uint16_t unordered_reduction_count{0}; @@ -59,29 +121,17 @@ struct Legality { } constexpr Legality() = default; constexpr Legality(const Legality &) = default; - Legality(IR::Dependencies deps, Dependence d) { - // TODO: check if addr match - // "Reduction" dependences should correspond to time dims. - // In the memory-optimized IR, we have read/write to the - // same address hoisted outside of the loop carrying `d` - if (d.revTimeEdge() && d.out->isLoad()) { - // Dependence rd = deps.get(rid); - // We don't actually need to use rid - // TODO: search between out and in - // If we have a reduction, then `d.out` is a load from an address - // that is then updated by some sequence of operations, before - // being stord in `d.in` - // (Because this is revTime, the load is the output as it must - // happen after the previous iteration's store.) - // We thus search the operation graph to find all paths - // from `d.out` to `d.in`. If there are none, then it is - // not a reduction, but updated in some other manner. - // If there is exactly one reassociable path, the reduction is unordered. - // Else, it is ordered? Do we need to consider ordered differently from no - // reduction? - IR::Addr *in = d.out, *out = d.in; - // If we have an operation chain leading from in->out + constexpr Legality(IR::Dependencies deps, Dependence d) { + IR::Addr *in = d.out, *out = d.in; + if (d.revTimeEdge()) { + if (in->reassociableReductionPair() != out) { + mindistance = 0; + maxdistance = maxiters = std::numeric_limits::max(); + } else ++unordered_reduction_count; + return; } + // now we must analyze the dependence... + // }; Legality(LoopDepSatisfaction deps, IR::Loop *L) { for (poly::Dependence d : deps.depencencies(L)) diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 9cbbe184c..8167c14a0 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -1257,7 +1257,7 @@ inline auto Loop::getLegality(poly::Dependencies deps, } return setLegal(None); } - +// } // namespace IR namespace poly { From 28530c054aecf2157b1836b6cc28c8590a1c9528 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Sun, 3 Dec 2023 09:07:00 -0500 Subject: [PATCH 074/112] store revTime groups as a cycle --- include/Optimize/CostModeling.hpp | 32 +++++++++++++++---------------- include/Optimize/Legality.hpp | 17 +++++++--------- include/Polyhedra/Dependence.hpp | 12 ++++++------ 3 files changed, 29 insertions(+), 32 deletions(-) diff --git a/include/Optimize/CostModeling.hpp b/include/Optimize/CostModeling.hpp index 77fe80498..25dbc5d43 100644 --- a/include/Optimize/CostModeling.hpp +++ b/include/Optimize/CostModeling.hpp @@ -1,7 +1,6 @@ #pragma once -// #include "./ControlFlowMerging.hpp" #include "Dicts/BumpMapSet.hpp" #include "Graphs/Graphs.hpp" #include "IR/Address.hpp" @@ -44,18 +43,18 @@ namespace poly::IR { /// for (int j = 0; j < J; ++j) /// x[i] = x[i] + A[j,i] * y[j]; /// x[i] = acc; -/// +/// /// we have the store `x[i]` is the source for the `x[i]` load on a future /// `j` iteration. /// However, our IR would be optimized into: - /// +/// /// for (int i = 0; i < I; ++i){ /// acc = x[i]; /// for (int j = 0; j < J; ++j) /// acc += A[j,i] * y[j]; /// x[i] = acc; /// } -/// +/// /// The same thing applies: `j` is the loop that satifies the dependency, /// but we hoisted the load/store pair out. /// This must be called after `sortEdges`, so that output edges of the store @@ -175,18 +174,19 @@ struct LoopIndependent { return *this; } }; -// - -// searches `N` and it's users for loop-independent users -// this exits early if it finds a dependent user, becase we search everything -// meaning we'll revisit later anyway. -// We return a `IR::Node *, bool` pair, where the `bool` is true if -// `N` was loop independent. -// We do this rather than something like returning a `nullptr`, as -// we may have descended into instructions, found some users that are -// but then also found some that are not; we need to return `false` -// in this case, but we of course want to still return those we found. -// NOLINTNEXTLINE(misc-no-recursion) +/// inline auto searchLoopIndependentUsers(IR::Dependencies deps, IR::Loop *L, +/// IR::Node *N, uint8_t depth, +/// LoopDepSummary summary) +/// +/// Searches `N` and it's users for loop-independent users, and returns them +/// as a list to process. +/// This exits early if it finds a dependent user, meaning it will only return +/// a partial list in this case. We search the entire graph eventually, meaning +/// the remainder will be processed later. +/// We return a `LoopDepSummary, bool` pair, where the `bool` is true if `N` was +/// loop independent. We use the `bool` rather than a `nullptr` or optional so +/// that we can still return those results we did find on failure. +/// NOLINTNEXTLINE(misc-no-recursion) inline auto searchLoopIndependentUsers(IR::Dependencies deps, IR::Loop *L, IR::Node *N, uint8_t depth, LoopDepSummary summary) diff --git a/include/Optimize/Legality.hpp b/include/Optimize/Legality.hpp index 7397f7264..b0c554ba3 100644 --- a/include/Optimize/Legality.hpp +++ b/include/Optimize/Legality.hpp @@ -10,8 +10,6 @@ namespace poly::CostModeling { -auto searchReduction(IR::Instruction *in, IR::Instruction *out) -> bool {} - // If a loop doesn't carry a dependency, it is legal // If a loop does carry a dependency, we can still consider // unrolling and vectorization if at least one of: @@ -87,14 +85,13 @@ auto searchReduction(IR::Instruction *in, IR::Instruction *out) -> bool {} // // // TODO items: -// 1. Store time deps in cycle w/in `Dependencies` object so we can iterate over -// all of them. This also requires pruning these as we drop deps, updating -// IR::Addr::operator->drop(Dependence). -// 2. Check `Addr` hoisting code for how it handles reductions, ensuring we can -// hoist them out. -// 3. Fuse legality checking, at least in part, with it, as that may indicate -// unrolling in example 3 above. -// 4. See discussionin CostModeling.hpp above `optimize` about unrolling. +// [x] Store time deps in cycle w/in `Dependencies` object so we can iterate +// over all of them. +// [ ] Check `Addr` hoisting code for how it handles reductions, ensuring we can +// hoist them out. +// [ ] Fuse legality checking, at least in part, with it, as that may indicate +// unrolling in example 3 above. +// [ ] See discussionin CostModeling.hpp above `optimize` about unrolling. struct Legality { // enum class Reduction { None = 0, Unordered = 1, Ordered = 2 }; uint16_t unordered_reduction_count{0}; diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 8167c14a0..0a61ae746 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -730,7 +730,7 @@ class Dependencies { .forward = isFwd}; invariant(out->getCurrentDepth() + in->getCurrentDepth(), dep0.getNumPhiCoefficients()); - ID d0id{addEdge(alloc, dep0)}; + ID d0ID{addEdge(alloc, dep0)}, prevID = d0ID; // pair is invalid const ptrdiff_t timeDim = dxy->getTimeDim(), numVar = 1 + dxy->getNumVar() - timeDim; @@ -743,8 +743,7 @@ class Dependencies { invariant(out->getCurrentDepth() + in->getCurrentDepth(), dep0.getNumPhiCoefficients()); // now we need to check the time direction for all times - // anything approaching 16 time dimensions would be absolutely - // insane + // anything approaching 16 time dimensions would be insane for (ptrdiff_t t = 0;;) { // set `t`th timeDim to +1/-1 // basically, what we do here is set it to `step` and pretend it was @@ -783,13 +782,14 @@ class Dependencies { .dependenceBounding = farkasBackups[1], .in = out, .out = in, - .revTimeEdge_ = d0id, + .revTimeEdge_ = prevID, .forward = !isFwd}; invariant(out->getCurrentDepth() + in->getCurrentDepth(), dep1.getNumPhiCoefficients()); - addEdge(alloc, dep1); + prevID = addEdge(alloc, dep1); if (!repeat) break; } + revTimeEdge(d0ID) = prevID.id; } static auto checkDirection(Arena<> alloc, const std::array, 2> &p, @@ -1257,7 +1257,7 @@ inline auto Loop::getLegality(poly::Dependencies deps, } return setLegal(None); } -// +// } // namespace IR namespace poly { From cdb588f3601f7cc19c14d9d27a3de32616663785 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Mon, 4 Dec 2023 16:01:03 -0500 Subject: [PATCH 075/112] add some comments --- include/IR/Node.hpp | 1 + include/LinearProgramming/ScheduledNode.hpp | 2 ++ include/Optimize/CostModeling.hpp | 26 ++++++++++++++++++++- include/Polyhedra/Dependence.hpp | 2 ++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index 1c9ec0592..3673e210d 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -146,6 +146,7 @@ class Node { return visitDepth; } constexpr void clearVisited() { visitDepth = 255; } + /// wasVisited(d) { return visitDepth == d; } [[nodiscard]] constexpr auto wasVisited(uint8_t d) const -> bool { return visitDepth == d; } diff --git a/include/LinearProgramming/ScheduledNode.hpp b/include/LinearProgramming/ScheduledNode.hpp index a930cc0d1..eefe985d5 100644 --- a/include/LinearProgramming/ScheduledNode.hpp +++ b/include/LinearProgramming/ScheduledNode.hpp @@ -396,10 +396,12 @@ class ScheduledNode { -> math::Range { return _(phiOffset, phiOffset + getNumLoops()); } + /// numLoops x numLoops // NOLINTNEXTLINE(readability-make-member-function-const) [[nodiscard]] constexpr auto getPhi() -> MutSquarePtrMatrix { return {mem + 1, math::SquareDims<>{unsigned(getNumLoops())}}; } + /// numLoops x numLoops [[nodiscard]] constexpr auto getPhi() const -> SquarePtrMatrix { return {const_cast(mem) + 1, math::SquareDims<>{getNumLoops()}}; } diff --git a/include/Optimize/CostModeling.hpp b/include/Optimize/CostModeling.hpp index 25dbc5d43..5a20cdac4 100644 --- a/include/Optimize/CostModeling.hpp +++ b/include/Optimize/CostModeling.hpp @@ -183,7 +183,8 @@ struct LoopIndependent { /// This exits early if it finds a dependent user, meaning it will only return /// a partial list in this case. We search the entire graph eventually, meaning /// the remainder will be processed later. -/// We return a `LoopDepSummary, bool` pair, where the `bool` is true if `N` was +/// We return a `LoopDepSummary, bool` pair, where the `bool` is true if `N` +/// was /// loop independent. We use the `bool` rather than a `nullptr` or optional so /// that we can still return those results we did find on failure. /// NOLINTNEXTLINE(misc-no-recursion) @@ -259,6 +260,28 @@ inline auto visitLoopDependent(IR::Dependencies deps, IR::Loop *L, IR::Node *N, #endif // iterate over users if (auto *A = llvm::dyn_cast(N)) { + // How we handle reductions (repeated accesses across time): + // for (ptrdiff_t m = 0; m < M; ++m) + // for (ptrdiff_t n = 0; n < N; ++n) + // for (ptrdiff_t k = 0; k < K; ++k) C[m,n] = C[m,n] + A[m,k]*B[k,n]; + // we have cyclic dependencies between the load from/store to `C[m,n]`. + // Note that here `depth` is `0` for top-level, + // 1 for the outer most loop, etc. I.e., when we're inside the `k` loop, + // `depth = 3`. + // The `C[m,n]` load -> `C[m,n]` store was not satisfied by any loop, so + // the sat level is 255. + // The `C[m,n]` store -> `C[m,n]` load has satLevel = 2. + // `outputAddrs` filters, keeping + // !isSat(depth) == !(satLevel() <= depth) == satLevel() > depth + // FIXME: so we should probably do `depth-1`?? + // + // a. load->store is not satisfied by any loop, instead handled by sorting + // of instructions in the innermost loop, i.e. sat is depth=3. + // Because it is never marked satisfied, `outputAddrs` will always + // include this. + // b. store->load is carried by the `k` loop, i.e. sat is depth=2. + // when we're here in the inner most loop, depth=3 + // for (IR::Addr *m : A->outputAddrs(deps, depth)) { if (m->wasVisited(depth)) continue; body = visitLoopDependent(deps, L, m, depth, body); @@ -316,6 +339,7 @@ inline void topologicalSort(IR::Dependencies deps, IR::Loop *root, // // In this first pass, we iterate over all nodes, pushing those // that can be hoisted after the exit block. + // IR::Node *C = root->getChild(); LoopDepSummary summary{}; for (IR::Node *N : C->nodes()) diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 0a61ae746..53a1432b6 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -1226,6 +1226,8 @@ inline auto IR::Addr::outputAddrs(Dependencies deps, unsigned depth) const { return outputEdgeIDs(deps, depth) | deps.outputAddrTransform(); } +/// Addr::operator->(Dependencies deps) +/// drop `this` from the graph, and remove it from `deps` inline void IR::Addr::drop(Dependencies deps) { // NOTE: this doesn't get removed from the `origAddr` list/the addrChain if (IR::Loop *L = getLoop(); L->getChild() == this) L->setChild(getNext()); From 11079d64060c674f59b536cb59ee5c68377be95d Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Mon, 4 Dec 2023 21:30:50 -0500 Subject: [PATCH 076/112] minor progress on updating visitLoopDependent --- include/IR/Address.hpp | 12 ++--- include/IR/Node.hpp | 4 +- include/LinearProgramming/LoopBlock.hpp | 49 ++++++++++--------- include/LinearProgramming/ScheduledNode.hpp | 12 ++--- include/Optimize/CostModeling.hpp | 37 ++++++++++----- include/Polyhedra/Dependence.hpp | 52 +++++++++------------ 6 files changed, 87 insertions(+), 79 deletions(-) diff --git a/include/IR/Address.hpp b/include/IR/Address.hpp index 8af1b46b7..3c58d096a 100644 --- a/include/IR/Address.hpp +++ b/include/IR/Address.hpp @@ -306,16 +306,16 @@ class Addr : public Instruction { constexpr void setNode(lp::ScheduledNode *n) { node = n; } [[nodiscard]] inline auto inputAddrs(Dependencies) const; [[nodiscard]] inline auto outputAddrs(Dependencies) const; - [[nodiscard]] inline auto inputAddrs(Dependencies, unsigned depth) const; - [[nodiscard]] inline auto outputAddrs(Dependencies, unsigned depth) const; + [[nodiscard]] inline auto inputAddrs(Dependencies, int depth) const; + [[nodiscard]] inline auto outputAddrs(Dependencies, int depth) const; [[nodiscard]] inline auto inputEdges(Dependencies) const; [[nodiscard]] inline auto outputEdges(Dependencies) const; - [[nodiscard]] inline auto inputEdges(Dependencies, unsigned depth) const; - [[nodiscard]] inline auto outputEdges(Dependencies, unsigned depth) const; + [[nodiscard]] inline auto inputEdges(Dependencies, int depth) const; + [[nodiscard]] inline auto outputEdges(Dependencies, int depth) const; [[nodiscard]] inline auto inputEdgeIDs(Dependencies) const; [[nodiscard]] inline auto outputEdgeIDs(Dependencies) const; - [[nodiscard]] inline auto inputEdgeIDs(Dependencies, unsigned depth) const; - [[nodiscard]] inline auto outputEdgeIDs(Dependencies, unsigned depth) const; + [[nodiscard]] inline auto inputEdgeIDs(Dependencies, int depth) const; + [[nodiscard]] inline auto outputEdgeIDs(Dependencies, int depth) const; [[nodiscard]] static auto zeroDim(Arena<> *alloc, llvm::SCEVUnknown const *arrayPtr, diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index 3673e210d..2aa64dd38 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -176,10 +176,10 @@ class Node { // [[nodiscard]] constexpr auto getIndex() const -> unsigned { return index_; // } constexpr void setIndex(unsigned i) { index_ = i; } [[nodiscard]] constexpr auto getKind() const -> ValKind { return kind; } - [[nodiscard]] constexpr auto getCurrentDepth() const -> unsigned { + [[nodiscard]] constexpr auto getCurrentDepth() const -> int { return currentDepth; } - [[nodiscard]] constexpr auto getNaturalDepth() const -> unsigned { + [[nodiscard]] constexpr auto getNaturalDepth() const -> int { return naturalDepth; } diff --git a/include/LinearProgramming/LoopBlock.hpp b/include/LinearProgramming/LoopBlock.hpp index 300b9991d..6fc2a3664 100644 --- a/include/LinearProgramming/LoopBlock.hpp +++ b/include/LinearProgramming/LoopBlock.hpp @@ -508,13 +508,13 @@ class LoopBlock { } static constexpr auto countAuxParamsAndConstraints(IR::Dependencies deps, ScheduledNode *nodes, - unsigned depth) + int depth) -> math::SVector { math::SVector params{}; assert(allZero(params)); for (ScheduledNode *node : nodes->getVertices()) for (Dependence d : node->inputEdges(deps)) - if (d.isActive(depth)) params += numParams(d); + if (!d.isSat(depth)) params += numParams(d); return params; } using BackupSchedule = math::ResizeableView< @@ -541,7 +541,7 @@ class LoopBlock { return {numOmegaCoefs, numPhiCoefs, numSlack}; } static constexpr auto calcCoefs(Dependencies deps, ScheduledNode *nodes, - unsigned d) -> CoefCounts { + int d) -> CoefCounts { auto [numOmegaCoefs, numPhiCoefs, numSlack] = setScheduleMemoryOffsets(deps, nodes, d); auto [numLambda, numBounding, numConstraints, numActiveEdges] = @@ -551,11 +551,11 @@ class LoopBlock { } // NOLINTNEXTLINE(misc-no-recursion) - [[nodiscard]] auto optimize(ScheduledNode *nodes, unsigned d, - unsigned maxDepth) -> Result { + [[nodiscard]] auto optimize(ScheduledNode *nodes, int d, int maxDepth) + -> Result { if (d >= maxDepth) return Result::independent(); if (Result r = solveGraph(nodes, maxDepth, false)) { - unsigned descend = d + 1; + int descend = d + 1; if (descend == maxDepth) return r; if (Result n = optimize(nodes, descend, maxDepth)) { if ((r == Result::dependent()) && @@ -566,17 +566,17 @@ class LoopBlock { } return breakGraph(nodes, d); } - /// solveGraph(ScheduledNode *nodes, unsigned depth, bool satisfyDeps) + /// solveGraph(ScheduledNode *nodes, int depth, bool satisfyDeps) /// solve the `nodes` graph at depth `d` /// if `satisfyDeps` is true, then we are trying to satisfy dependencies at /// this level /// - [[nodiscard]] auto solveGraph(ScheduledNode *nodes, unsigned depth, + [[nodiscard]] auto solveGraph(ScheduledNode *nodes, int depth, bool satisfyDeps) -> Result { CoefCounts counts{calcCoefs(deps, nodes, depth)}; return solveGraph(nodes, depth, satisfyDeps, counts); } - [[nodiscard]] auto solveGraph(ScheduledNode *nodes, unsigned depth, + [[nodiscard]] auto solveGraph(ScheduledNode *nodes, int depth, bool satisfyDeps, CoefCounts counts) -> Result { if (counts.numLambda == 0) { setSchedulesIndependent(nodes, depth); @@ -596,7 +596,7 @@ class LoopBlock { nodes, depth, counts, sol[_(counts.numPhiCoefs + counts.numOmegaCoefs, end)]); } - void setSchedulesIndependent(ScheduledNode *nodes, unsigned depth) { + void setSchedulesIndependent(ScheduledNode *nodes, int depth) { // IntMatrix A, N; for (ScheduledNode *node : nodes->getVertices()) { if ((depth >= node->getNumLoops()) || node->phiIsScheduled(depth)) @@ -605,7 +605,7 @@ class LoopBlock { setDepFreeSchedule(node, depth); } } - static void setDepFreeSchedule(ScheduledNode *node, unsigned depth) { + static void setDepFreeSchedule(ScheduledNode *node, int depth) { node->getOffsetOmega(depth) = 0; if (node->phiIsScheduled(depth)) return; // we'll check the null space of the phi's so far @@ -629,7 +629,7 @@ class LoopBlock { // arbitrarily. // Here, we collect candidates for the next schedule DenseMatrix candidates{ - math::DenseDims<>{0, node->getNumLoops() + 1}}; + math::DenseDims<>{{0}, {node->getNumLoops() + 1}}}; Vector indv; indv.resizeForOverwrite(node->getNumLoops()); for (Addr *mem : node->localAddr()) { @@ -674,7 +674,7 @@ class LoopBlock { } invariant(false); } - void updateSchedules(ScheduledNode *nodes, unsigned depth, CoefCounts counts, + void updateSchedules(ScheduledNode *nodes, int depth, CoefCounts counts, Simplex::Solution sol) { #ifndef NDEBUG if (counts.numPhiCoefs > 0) @@ -721,8 +721,8 @@ class LoopBlock { #endif } } - [[nodiscard]] auto deactivateSatisfiedEdges(ScheduledNode *nodes, - unsigned depth, CoefCounts counts, + [[nodiscard]] auto deactivateSatisfiedEdges(ScheduledNode *nodes, int depth, + CoefCounts counts, Simplex::Solution sol) -> Result { if (allZero(sol[_(begin, counts.numBounding + counts.numActiveEdges)])) return checkEmptySatEdges(nodes, depth); @@ -762,7 +762,7 @@ class LoopBlock { } return result; } - auto checkEmptySatEdges(ScheduledNode *nodes, unsigned depth) -> Result { + auto checkEmptySatEdges(ScheduledNode *nodes, int depth) -> Result { for (ScheduledNode *outNode : nodes->getVertices()) { for (Dependence edge : outNode->inputEdges(deps)) { if (edge.isSat(depth)) continue; @@ -820,8 +820,8 @@ class LoopBlock { deps.satLevelPair(Dependence::ID{dID}) = sat[i++]; } // NOLINTNEXTLINE(misc-no-recursion) - [[nodiscard]] auto optimizeSatDep(ScheduledNode *nodes, unsigned depth, - unsigned maxDepth, Result backupResult) + [[nodiscard]] auto optimizeSatDep(ScheduledNode *nodes, int depth, + int maxDepth, Result backupResult) -> Result { // if we're here, there are satisfied deps in both // depSatLevel and depSatNest @@ -840,7 +840,7 @@ class LoopBlock { return backupResult; } // NOLINTNEXTLINE(misc-no-recursion) - auto tryFuse(ScheduledNode *n0, ScheduledNode *n1, unsigned depth) -> Result { + auto tryFuse(ScheduledNode *n0, ScheduledNode *n1, int depth) -> Result { auto s = allocator.scope(); auto old0 = stashFit(n0); // FIXME: stash dep sat level auto old1 = stashFit(n1); // FIXME: stash dep sat level @@ -852,7 +852,7 @@ class LoopBlock { popStash(old1); return Result::failure(); } - auto satisfySplitEdges(ScheduledNode *nodes, unsigned depth) -> Result { + auto satisfySplitEdges(ScheduledNode *nodes, int depth) -> Result { auto s = allocator.scope(); dict::aset graph{&allocator}; for (ScheduledNode *node : nodes->getVertices()) graph.insert(node); @@ -867,14 +867,14 @@ class LoopBlock { } return (found) ? Result::dependent() : Result::independent(); } - auto solveSplitGraph(ScheduledNode *nodes, unsigned depth) -> Result { + auto solveSplitGraph(ScheduledNode *nodes, int depth) -> Result { Result sat = satisfySplitEdges(nodes, depth); Result opt = solveGraph(nodes, depth, false, calcCoefs(deps, nodes, depth)); if (!opt) return opt; return opt & sat; } // NOLINTNEXTLINE(misc-no-recursion) - [[nodiscard]] auto breakGraph(ScheduledNode *node, unsigned d) -> Result { + [[nodiscard]] auto breakGraph(ScheduledNode *node, int d) -> Result { // Get a top sorting of SCC's; because we couldn't solve the graph // with these dependencies fused, we'll try splitting them. ScheduledNode *components = @@ -927,9 +927,8 @@ class LoopBlock { /// Phis: scheduling rotations /// w: bounding offsets, independent of symbolic variables /// u: bounding offsets, dependent on symbolic variables - auto instantiateOmniSimplex(ScheduledNode *nodes, unsigned d, - bool satisfyDeps, CoefCounts counts) - -> std::unique_ptr { + auto instantiateOmniSimplex(ScheduledNode *nodes, int d, bool satisfyDeps, + CoefCounts counts) -> std::unique_ptr { auto [numOmegaCoefs, numPhiCoefs, numSlack, numLambda, numBounding, numConstraints, numActiveEdges] = counts; auto omniSimplex = Simplex::create( diff --git a/include/LinearProgramming/ScheduledNode.hpp b/include/LinearProgramming/ScheduledNode.hpp index eefe985d5..3e6fab677 100644 --- a/include/LinearProgramming/ScheduledNode.hpp +++ b/include/LinearProgramming/ScheduledNode.hpp @@ -258,7 +258,7 @@ class ScheduledNode { DepIDs{dep}}; } [[nodiscard]] inline auto inputEdgeIds(IR::Dependencies dep, - unsigned depth) const { + int depth) const { static_assert(std::forward_iterator< decltype(DepIDs{dep}((IR::Addr *)nullptr).begin())>); static_assert(std::forward_iterator); static_assert(std::ranges::range); @@ -301,7 +301,7 @@ class ScheduledNode { }}; } - [[nodiscard]] inline auto inputEdges(IR::Dependencies dep, unsigned depth) { + [[nodiscard]] inline auto inputEdges(IR::Dependencies dep, int depth) { return utils::NestedList{ utils::ListRange{store, NextAddr{}, [](Addr *a) -> int32_t { return a->getEdgeIn(); }}, @@ -313,7 +313,7 @@ class ScheduledNode { }); }}; } - [[nodiscard]] inline auto outputEdges(IR::Dependencies dep, unsigned depth) { + [[nodiscard]] inline auto outputEdges(IR::Dependencies dep, int depth) { return utils::NestedList{ utils::ListRange{store, NextAddr{}, @@ -372,8 +372,8 @@ class ScheduledNode { // [[nodiscard]] constexpr auto wasVisited2() const -> bool { return visited2; // } constexpr void visit2() { visited2 = true; } constexpr void unVisit2() { // visited2 = false; } - [[nodiscard]] constexpr auto getNumLoops() const -> unsigned { - return unsigned(mem[0]); + [[nodiscard]] constexpr auto getNumLoops() const -> ptrdiff_t { + return mem[0]; } // 'phiIsScheduled()` means that `phi`'s schedule has been // set for the outer `rank` loops. diff --git a/include/Optimize/CostModeling.hpp b/include/Optimize/CostModeling.hpp index 5a20cdac4..770d658a7 100644 --- a/include/Optimize/CostModeling.hpp +++ b/include/Optimize/CostModeling.hpp @@ -260,29 +260,44 @@ inline auto visitLoopDependent(IR::Dependencies deps, IR::Loop *L, IR::Node *N, #endif // iterate over users if (auto *A = llvm::dyn_cast(N)) { - // How we handle reductions (repeated accesses across time): - // for (ptrdiff_t m = 0; m < M; ++m) + // Note that `topologicalSort` calls `searchLoopIndependentUsers` which + // checks whether an `Addr` is `indexedByInnermostLoop`. + // + // Note that here `depth` is `0` for top-level, 1 for the outer most loop, + // etc. That is, loops are effectively 1-indexed here, while `satLevel` + // is effectively 0-indexed by loop. + // Example 1: for + // (ptrdiff_t m = 0; m < M; ++m) // for (ptrdiff_t n = 0; n < N; ++n) // for (ptrdiff_t k = 0; k < K; ++k) C[m,n] = C[m,n] + A[m,k]*B[k,n]; // we have cyclic dependencies between the load from/store to `C[m,n]`. - // Note that here `depth` is `0` for top-level, - // 1 for the outer most loop, etc. I.e., when we're inside the `k` loop, - // `depth = 3`. // The `C[m,n]` load -> `C[m,n]` store was not satisfied by any loop, so // the sat level is 255. // The `C[m,n]` store -> `C[m,n]` load has satLevel = 2. - // `outputAddrs` filters, keeping - // !isSat(depth) == !(satLevel() <= depth) == satLevel() > depth - // FIXME: so we should probably do `depth-1`?? - // + // Example 2: + // for (ptrdiff_t m = 0; m < M; ++m) + // for (ptrdiff_t n = 1; n < N; ++n) C[m,n] = C[m,n] + C[m,n-1]; + // we again have a cyple, from the load `C[m,n-1]` to the store `C[m,n]`, + // and from the store `C[m,n]` to the load `C[m,n-1]` on the following + // iteration. + // The former has a sat level of 255, while the latter has a sat level of + // `1`. + // + // isActive(depth) == satLevel() >= depth + // // a. load->store is not satisfied by any loop, instead handled by sorting // of instructions in the innermost loop, i.e. sat is depth=3. // Because it is never marked satisfied, `outputAddrs` will always // include this. // b. store->load is carried by the `k` loop, i.e. sat is depth=2. // when we're here in the inner most loop, depth=3 - // - for (IR::Addr *m : A->outputAddrs(deps, depth)) { + // TODO: + // 1. Is our `outputAddrs` correct to use `depth - 1`? Provide a + // counter-example where `depth` produces wrong code that is not handled + // by `indexedByInnermostLoop` + // 2. Hoist reductions that are legal to hoist. + // 3. Incorporate the legality setting here. + for (IR::Addr *m : A->outputAddrs(deps, int(depth) - 1)) { if (m->wasVisited(depth)) continue; body = visitLoopDependent(deps, L, m, depth, body); } diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 53a1432b6..76e48c14c 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -118,13 +118,18 @@ struct Dependence { [[nodiscard]] constexpr auto satLevel() const -> uint8_t { return satLevelMask(satLvl[0]); } - [[nodiscard]] constexpr auto isSat(unsigned depth) const -> bool { + /// `isSat` returns `true` on the level that satisfies it + [[nodiscard]] constexpr auto isSat(int depth) const -> bool { invariant(depth <= 127); return satLevel() <= depth; } - [[nodiscard]] constexpr auto isActive(unsigned depth) const -> bool { + /// `isActive` returns `false` on the level that satisfies it + /// however, the level that satisfies it shouldn't be reordered + /// so `depth-1` may be necessary + /// TODO: replace impl with `satLevel() >= depth` + [[nodiscard]] constexpr auto isActive(int depth) const -> bool { invariant(depth <= 127); - return satLevel() > depth; + return satLevel() >= depth; } /// if true, then it's independent conditioned on the phis... [[nodiscard]] constexpr auto isCondIndep() const -> bool { @@ -447,18 +452,6 @@ struct Dependence { return dependenceSatisfaction->satisfiable(alloc, sch, numLambda); } - struct Active { - unsigned depth; - constexpr Active(const Active &) noexcept = default; - constexpr Active(Active &&) noexcept = default; - constexpr Active() noexcept = default; - constexpr auto operator=(const Active &) noexcept -> Active & = default; - constexpr Active(unsigned d) : depth(d) {} - constexpr auto operator()(const Dependence *d) const -> bool { - return d->isActive(depth); - } - }; - friend inline auto operator<<(llvm::raw_ostream &os, const Dependence &d) -> llvm::raw_ostream & { os << "Dependence Poly "; @@ -1097,6 +1090,9 @@ class Dependencies { [[nodiscard]] constexpr auto isSat(ID i, unsigned depth) const -> uint8_t { return Dependence::satLevelMask(satLevelPair(i)[0]) <= depth; } + [[nodiscard]] constexpr auto isActive(ID i, unsigned depth) const -> uint8_t { + return Dependence::satLevelMask(satLevelPair(i)[0]) >= depth; + } [[nodiscard]] constexpr auto isForward(ID i) noexcept -> bool & { return isForwardPtr()[i.id]; @@ -1123,10 +1119,10 @@ class Dependencies { // if (x.gcdKnownIndependent(y)) return {}; DepPoly *dxy{DepPoly::dependence(alloc, x, y)}; if (!dxy) return; - invariant(x->getCurrentDepth(), dxy->getDim0()); - invariant(y->getCurrentDepth(), dxy->getDim1()); - invariant(x->getCurrentDepth() + y->getCurrentDepth(), - dxy->getNumPhiCoef()); + invariant(x->getCurrentDepth() == ptrdiff_t(dxy->getDim0())); + invariant(y->getCurrentDepth() == ptrdiff_t(dxy->getDim1())); + invariant(x->getCurrentDepth() + y->getCurrentDepth() == + ptrdiff_t(dxy->getNumPhiCoef())); // note that we set boundAbove=true, so we reverse the // dependence direction for the dependency we week, we'll // discard the program variables x then y @@ -1162,9 +1158,9 @@ class Dependencies { return outputEdgeIDs(id) | getEdgeTransform(); } - [[nodiscard]] constexpr auto activeFilter(unsigned depth) const { + [[nodiscard]] constexpr auto activeFilter(int depth) const { auto f = [=, this](int32_t id) -> bool { - return !isSat(Dependence::ID{id}, depth); + return isActive(Dependence::ID{id}, depth); }; return std::views::filter(f); } @@ -1196,10 +1192,10 @@ inline auto Addr::inputEdgeIDs(Dependencies deps) const { inline auto Addr::outputEdgeIDs(Dependencies deps) const { return deps.outputEdgeIDs(getEdgeOut()); } -inline auto Addr::inputEdgeIDs(Dependencies deps, unsigned depth) const { +inline auto Addr::inputEdgeIDs(Dependencies deps, int depth) const { return inputEdgeIDs(deps) | deps.activeFilter(depth); } -inline auto Addr::outputEdgeIDs(Dependencies deps, unsigned depth) const { +inline auto Addr::outputEdgeIDs(Dependencies deps, int depth) const { return outputEdgeIDs(deps) | deps.activeFilter(depth); } @@ -1209,20 +1205,18 @@ inline auto IR::Addr::inputAddrs(Dependencies deps) const { inline auto IR::Addr::outputAddrs(Dependencies deps) const { return outputEdgeIDs(deps) | deps.outputAddrTransform(); } - -inline auto Addr::inputEdges(Dependencies deps, unsigned depth) const { +inline auto Addr::inputEdges(Dependencies deps, int depth) const { return inputEdgeIDs(deps) | deps.activeFilter(depth) | deps.getEdgeTransform(); } -inline auto Addr::outputEdges(Dependencies deps, unsigned depth) const { +inline auto Addr::outputEdges(Dependencies deps, int depth) const { return outputEdgeIDs(deps) | deps.activeFilter(depth) | deps.getEdgeTransform(); } - -inline auto IR::Addr::inputAddrs(Dependencies deps, unsigned depth) const { +inline auto IR::Addr::inputAddrs(Dependencies deps, int depth) const { return inputEdgeIDs(deps, depth) | deps.inputAddrTransform(); } -inline auto IR::Addr::outputAddrs(Dependencies deps, unsigned depth) const { +inline auto IR::Addr::outputAddrs(Dependencies deps, int depth) const { return outputEdgeIDs(deps, depth) | deps.outputAddrTransform(); } From 5dd61d2e66faa3a06804b6ece6a35801f5fa33cf Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Tue, 5 Dec 2023 00:38:30 -0500 Subject: [PATCH 077/112] isActive(depth) fix --- include/Optimize/CostModeling.hpp | 27 ++++++++++++--------------- include/Polyhedra/Dependence.hpp | 7 ++----- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/include/Optimize/CostModeling.hpp b/include/Optimize/CostModeling.hpp index 770d658a7..15f2997f0 100644 --- a/include/Optimize/CostModeling.hpp +++ b/include/Optimize/CostModeling.hpp @@ -189,7 +189,7 @@ struct LoopIndependent { /// that we can still return those results we did find on failure. /// NOLINTNEXTLINE(misc-no-recursion) inline auto searchLoopIndependentUsers(IR::Dependencies deps, IR::Loop *L, - IR::Node *N, uint8_t depth, + IR::Node *N, int depth, LoopDepSummary summary) -> LoopIndependent { if (N->dependsOnParentLoop()) return {summary, false}; @@ -207,7 +207,7 @@ inline auto searchLoopIndependentUsers(IR::Dependencies deps, IR::Loop *L, } a->insertAfter(ret.summary.notIndexedByLoop); ret.summary.notIndexedByLoop = a; - for (IR::Addr *m : a->outputAddrs(deps, depth)) { + for (IR::Addr *m : a->outputAddrs(deps, depth - 1)) { ret *= searchLoopIndependentUsers(deps, L, m, depth, summary); if (ret.independent) continue; a->setDependsOnParentLoop(); @@ -235,7 +235,7 @@ inline auto searchLoopIndependentUsers(IR::Dependencies deps, IR::Loop *L, } // NOLINTNEXTLINE(misc-no-recursion) inline auto visitLoopDependent(IR::Dependencies deps, IR::Loop *L, IR::Node *N, - uint8_t depth, IR::Node *body) -> IR::Node * { + int depth, IR::Node *body) -> IR::Node * { invariant(N->getVisitDepth() != 254); // N may have been visited as a dependent of an inner loop, which is why // `visited` accepts a depth argument @@ -283,21 +283,19 @@ inline auto visitLoopDependent(IR::Dependencies deps, IR::Loop *L, IR::Node *N, // The former has a sat level of 255, while the latter has a sat level of // `1`. // - // isActive(depth) == satLevel() >= depth + // isActive(depth) == satLevel() > depth // // a. load->store is not satisfied by any loop, instead handled by sorting // of instructions in the innermost loop, i.e. sat is depth=3. - // Because it is never marked satisfied, `outputAddrs` will always - // include this. // b. store->load is carried by the `k` loop, i.e. sat is depth=2. - // when we're here in the inner most loop, depth=3 + // Because `2 > (3-1) == false`, we do not add it here, + // it's sorting isn't positional! // TODO: - // 1. Is our `outputAddrs` correct to use `depth - 1`? Provide a - // counter-example where `depth` produces wrong code that is not handled - // by `indexedByInnermostLoop` + // 1. When does a dependency on a loop without an index mean that we cannot + // hoist it out of the loop? // 2. Hoist reductions that are legal to hoist. // 3. Incorporate the legality setting here. - for (IR::Addr *m : A->outputAddrs(deps, int(depth) - 1)) { + for (IR::Addr *m : A->outputAddrs(deps, depth - 1)) { if (m->wasVisited(depth)) continue; body = visitLoopDependent(deps, L, m, depth, body); } @@ -319,7 +317,7 @@ inline auto visitLoopDependent(IR::Dependencies deps, IR::Loop *L, IR::Node *N, if (N->getLoop() == L) body = N->setNext(body); return body; } -inline void addBody(IR::Dependencies deps, IR::Loop *root, unsigned depth, +inline void addBody(IR::Dependencies deps, IR::Loop *root, int depth, IR::Node *nodes) { IR::Exit exit{}; // use to capture last node IR::Node *body{&exit}; @@ -330,8 +328,7 @@ inline void addBody(IR::Dependencies deps, IR::Loop *root, unsigned depth, if (last) last->setNext(nullptr); root->setLast(last); } -inline void topologicalSort(IR::Dependencies deps, IR::Loop *root, - unsigned depth) { +inline void topologicalSort(IR::Dependencies deps, IR::Loop *root, int depth) { // basic plan for the top sort: // We iterate across all users, once all of node's users have been added, // we push it to the front of the list. Thus, we get a top-sorted list. @@ -370,7 +367,7 @@ inline void topologicalSort(IR::Dependencies deps, IR::Loop *root, // and any remaining edges } // NOLINTNEXTLINE(misc-no-recursion) -inline auto buildSubGraph(IR::Dependencies deps, IR::Loop *root, unsigned depth, +inline auto buildSubGraph(IR::Dependencies deps, IR::Loop *root, int depth, uint32_t id) -> uint32_t { // We build the instruction graph, via traversing the tree, and then // top sorting as we recurse out diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 76e48c14c..4d79610fe 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -124,12 +124,9 @@ struct Dependence { return satLevel() <= depth; } /// `isActive` returns `false` on the level that satisfies it - /// however, the level that satisfies it shouldn't be reordered - /// so `depth-1` may be necessary - /// TODO: replace impl with `satLevel() >= depth` [[nodiscard]] constexpr auto isActive(int depth) const -> bool { invariant(depth <= 127); - return satLevel() >= depth; + return satLevel() > depth; } /// if true, then it's independent conditioned on the phis... [[nodiscard]] constexpr auto isCondIndep() const -> bool { @@ -1091,7 +1088,7 @@ class Dependencies { return Dependence::satLevelMask(satLevelPair(i)[0]) <= depth; } [[nodiscard]] constexpr auto isActive(ID i, unsigned depth) const -> uint8_t { - return Dependence::satLevelMask(satLevelPair(i)[0]) >= depth; + return Dependence::satLevelMask(satLevelPair(i)[0]) > depth; } [[nodiscard]] constexpr auto isForward(ID i) noexcept -> bool & { From 26fa79942983557a292aa6d0a797da6c73789528 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Tue, 5 Dec 2023 15:55:38 -0500 Subject: [PATCH 078/112] set the currentDepth and parent loop when hoisting, check eligibility of moving memory to registers to decide whether to skip over a dependency --- benchmark/include/vector.hpp | 1 - include/IR/Address.hpp | 13 ++--- include/IR/Node.hpp | 7 ++- include/IR/OrthogonalAxes.hpp | 8 ++- include/LinearProgramming/ScheduledNode.hpp | 7 +-- include/Optimize/CostFunction.hpp | 18 +++---- include/Optimize/CostModeling.hpp | 57 +++++++++++++-------- include/Optimize/Legality.hpp | 3 ++ include/Polyhedra/Dependence.hpp | 39 ++++++++++++++ 9 files changed, 111 insertions(+), 42 deletions(-) diff --git a/benchmark/include/vector.hpp b/benchmark/include/vector.hpp index ce94f2185..4337dfb86 100644 --- a/benchmark/include/vector.hpp +++ b/benchmark/include/vector.hpp @@ -1,6 +1,5 @@ #pragma once #include "Math/Array.hpp" -#include "Math/Vector.hpp" #include #include #include diff --git a/include/IR/Address.hpp b/include/IR/Address.hpp index 3c58d096a..c7aa8e94a 100644 --- a/include/IR/Address.hpp +++ b/include/IR/Address.hpp @@ -31,7 +31,8 @@ class Dependencies; namespace IR { using math::PtrVector, math::MutPtrVector, math::DensePtrMatrix, math::MutDensePtrMatrix, math::SquarePtrMatrix, math::_, math::DenseDims, - math::PtrMatrix, math::end, poly::Dependence, poly::Dependencies; + math::PtrMatrix, math::end, poly::Dependence, poly::Dependencies, + utils::ListRange; /// Represents a memory access that has been rotated according to some affine /// transform. @@ -192,7 +193,7 @@ class Addr : public Instruction { unsigned oldNatDepth = getNaturalDepth(); DensePtrMatrix M{indexMatrix()}; // aD x nLma MutPtrVector offsetOmega{getOffsetOmega()}; - unsigned depth = this->naturalDepth = uint8_t(ptrdiff_t(Pinv.numCol())); + unsigned depth = uint8_t(ptrdiff_t(Pinv.numCol())); MutDensePtrMatrix mStar{indexMatrix()}; // M is implicitly padded with zeros, newNumLoops >= oldNumLoops invariant(maxDepth >= naturalDepth); @@ -220,7 +221,7 @@ class Addr : public Instruction { for (ptrdiff_t k = 0; k < oldNatDepth; ++k) buff += M[d, k] * Pinv[k, _]; mStar[d, _] << buff; if (newNatDepth == depth) continue; - // find last + // find last, as buf goes outer<->inner auto range = std::ranges::reverse_view{buff[_(newNatDepth, depth)]}; auto m = std::ranges::find_if(range, [](int64_t i) { return i != 0; }); if (m == range.end()) continue; @@ -228,13 +229,12 @@ class Addr : public Instruction { } // use `mStar` to update offsetOmega` offsetOmega -= omega * mStar.t(); + this->naturalDepth = newNatDepth; if (newNatDepth == depth) return; invariant(newNatDepth < depth); - this->naturalDepth = newNatDepth; MutDensePtrMatrix indMat{this->indexMatrix()}; for (ptrdiff_t d = 1; d < getArrayDim(); ++d) indMat[d, _] << mStar[d, _(0, newNatDepth)]; - this->naturalDepth = newNatDepth; } // NOTE: this requires `nodeOrDepth` to be set to innmost loop depth [[nodiscard]] constexpr auto indexedByInnermostLoop() -> bool { @@ -243,7 +243,7 @@ class Addr : public Instruction { return ret; } [[nodiscard]] constexpr auto eachAddr() { - return utils::ListRange{this, [](Addr *a) { return a->getNextAddr(); }}; + return ListRange{this, [](Addr *a) -> Addr * { return a->getNextAddr(); }}; } constexpr auto getNextAddr() -> Addr * { return origNext; } [[nodiscard]] constexpr auto getNextAddr() const -> const Addr * { @@ -316,6 +316,7 @@ class Addr : public Instruction { [[nodiscard]] inline auto outputEdgeIDs(Dependencies) const; [[nodiscard]] inline auto inputEdgeIDs(Dependencies, int depth) const; [[nodiscard]] inline auto outputEdgeIDs(Dependencies, int depth) const; + [[nodiscard]] inline auto unhoistableOutputs(Dependencies, int depth) const; [[nodiscard]] static auto zeroDim(Arena<> *alloc, llvm::SCEVUnknown const *arrayPtr, diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index 2aa64dd38..ebe79b79e 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -114,7 +114,11 @@ class Node { // and we want a common base that we can query to avoid monomorphization. protected: const ValKind kind; + /// The current position, `0` means top level, 1 inside a single loop uint8_t currentDepth{0}; // current depth + /// For an `Addr`, this is the "natural depth" where it would be + /// placed in a loop without dependencies, i.e., the inner mostindex + /// `0` means top level, `1` inside a single loop, etc uint8_t naturalDepth{0}; // original, or, for Addr, `indMat.numCol()` uint8_t visitDepth{255}; uint8_t maxDepth; // memory allocated to support up to this depth @@ -207,7 +211,8 @@ class Node { if (n) n->child = this; return this; } - constexpr void setCurrentDepth(unsigned d) { + constexpr void setCurrentDepth(int d) { + invariant(d >= 0); invariant(d <= std::numeric_limits::max()); currentDepth = d; } diff --git a/include/IR/OrthogonalAxes.hpp b/include/IR/OrthogonalAxes.hpp index 37a283749..297d498f1 100644 --- a/include/IR/OrthogonalAxes.hpp +++ b/include/IR/OrthogonalAxes.hpp @@ -7,13 +7,17 @@ /// `indep` must be `0` for any `invunrolls` it doesn't depend on struct OrthogonalAxes { + /// Boolean: Are the axes independent? uint32_t indep_axes : 1; + /// Bit mask: are the axes contiguous? uint32_t contig : 31; // max number of dims of 31 - uint32_t indep; // max loop depth of 32 + /// Flag indicating whether the axis is independent of loops + /// `1` per independent loops + uint32_t indep; // max loop depth of 32 }; +static_assert(sizeof(OrthogonalAxes) == 8); constexpr auto operator==(OrthogonalAxes a, OrthogonalAxes b) -> bool { return std::bit_cast(a) == std::bit_cast(b); } -static_assert(sizeof(OrthogonalAxes) == 8); #endif // OrthogonalAxes_hpp_INCLUDED diff --git a/include/LinearProgramming/ScheduledNode.hpp b/include/LinearProgramming/ScheduledNode.hpp index 3e6fab677..80f31482d 100644 --- a/include/LinearProgramming/ScheduledNode.hpp +++ b/include/LinearProgramming/ScheduledNode.hpp @@ -8,6 +8,7 @@ #include "Utilities/ListRanges.hpp" #include #include +#include #include #include #include @@ -464,10 +465,10 @@ class ScheduledNode { return omegaOffset; } void resetPhiOffset() { phiOffset = std::numeric_limits::max(); } - [[nodiscard]] constexpr auto calcGraphMaxDepth() const -> unsigned { - unsigned maxDepth = 0; + [[nodiscard]] constexpr auto calcGraphMaxDepth() const -> int { + int maxDepth = 0; for (const ScheduledNode *n : getVertices()) - maxDepth = std::max(maxDepth, n->getNumLoops()); + maxDepth = std::max(maxDepth, int(n->getNumLoops())); return maxDepth; } friend inline auto operator<<(llvm::raw_ostream &os, diff --git a/include/Optimize/CostFunction.hpp b/include/Optimize/CostFunction.hpp index 162a0381b..f0e1fee0a 100644 --- a/include/Optimize/CostFunction.hpp +++ b/include/Optimize/CostFunction.hpp @@ -94,17 +94,17 @@ struct MemCostSummary { constexpr auto operator&(MemCostSummary a, MemCostSummary b) -> uint32_t { return a.orth.indep & b.orth.indep; } +/// Basic idea is that costs are divided by loops they do not depend on +/// constexpr auto cost(const AbstractMatrix auto &invunrolls, uint32_t indepAxes) -> utils::eltype_t { - utils::eltype_t c{}; - if (indepAxes) { - uint32_t tz = std::countr_zero(indepAxes); - c = invunrolls[0, tz++]; - for (uint32_t d = indepAxes >> tz, i = tz; d; d >>= tz, i += tz) { - tz = std::countr_zero(d); - c *= invunrolls[0, i + tz++]; - } - } else c = 1; + if (!indepAxes) return 1; + uint32_t tz = std::countr_zero(indepAxes); + utils::eltype_t c{invunrolls[0, tz++]}; + for (uint32_t d = indepAxes >> tz, i = tz; d; d >>= tz, i += tz) { + tz = std::countr_zero(d); + c *= invunrolls[0, i + tz++]; + } return c; } // costs is an array of length two. diff --git a/include/Optimize/CostModeling.hpp b/include/Optimize/CostModeling.hpp index 15f2997f0..980764930 100644 --- a/include/Optimize/CostModeling.hpp +++ b/include/Optimize/CostModeling.hpp @@ -160,6 +160,11 @@ class LoopTree { constexpr auto getLoop() -> IR::Loop * { return loop; } }; +void hoist(IR::Node *N, IR::Loop *P, int depth) { + N->setParent(P); + N->setCurrentDepth(depth); +} + struct LoopDepSummary { IR::Node *afterExit{nullptr}; IR::Addr *indexedByLoop{nullptr}; @@ -207,7 +212,7 @@ inline auto searchLoopIndependentUsers(IR::Dependencies deps, IR::Loop *L, } a->insertAfter(ret.summary.notIndexedByLoop); ret.summary.notIndexedByLoop = a; - for (IR::Addr *m : a->outputAddrs(deps, depth - 1)) { + for (IR::Addr *m : a->unhoistableOutputs(deps, depth - 1)) { ret *= searchLoopIndependentUsers(deps, L, m, depth, summary); if (ret.independent) continue; a->setDependsOnParentLoop(); @@ -223,19 +228,20 @@ inline auto searchLoopIndependentUsers(IR::Dependencies deps, IR::Loop *L, return ret; } // then we can push it to the front of the list, meaning it is hoisted out - if (a) { - if (ret.summary.notIndexedByLoop == a) - ret.summary.notIndexedByLoop = llvm::cast_or_null(a->getNext()); - } + if (a && (ret.summary.notIndexedByLoop == a)) + ret.summary.notIndexedByLoop = llvm::cast_or_null(a->getNext()); I->removeFromList(); I->insertAfter(ret.summary.afterExit); ret.summary.afterExit = I; I->visit(depth); return ret; } +/// `R`: remove from loop, if not `nullptr`, set the parent of `N` to `R` +/// `R` is applied recursivvely, forwarded to all calls. // NOLINTNEXTLINE(misc-no-recursion) inline auto visitLoopDependent(IR::Dependencies deps, IR::Loop *L, IR::Node *N, - int depth, IR::Node *body) -> IR::Node * { + int depth, IR::Node *body, IR::Loop *R = nullptr) + -> IR::Node * { invariant(N->getVisitDepth() != 254); // N may have been visited as a dependent of an inner loop, which is why // `visited` accepts a depth argument @@ -266,8 +272,8 @@ inline auto visitLoopDependent(IR::Dependencies deps, IR::Loop *L, IR::Node *N, // Note that here `depth` is `0` for top-level, 1 for the outer most loop, // etc. That is, loops are effectively 1-indexed here, while `satLevel` // is effectively 0-indexed by loop. - // Example 1: for - // (ptrdiff_t m = 0; m < M; ++m) + // Example 1: + // for (ptrdiff_t m = 0; m < M; ++m) // for (ptrdiff_t n = 0; n < N; ++n) // for (ptrdiff_t k = 0; k < K; ++k) C[m,n] = C[m,n] + A[m,k]*B[k,n]; // we have cyclic dependencies between the load from/store to `C[m,n]`. @@ -289,32 +295,41 @@ inline auto visitLoopDependent(IR::Dependencies deps, IR::Loop *L, IR::Node *N, // of instructions in the innermost loop, i.e. sat is depth=3. // b. store->load is carried by the `k` loop, i.e. sat is depth=2. // Because `2 > (3-1) == false`, we do not add it here, - // it's sorting isn't positional! + // its sorting isn't positional! + // // TODO: - // 1. When does a dependency on a loop without an index mean that we cannot - // hoist it out of the loop? - // 2. Hoist reductions that are legal to hoist. - // 3. Incorporate the legality setting here. - for (IR::Addr *m : A->outputAddrs(deps, depth - 1)) { + // - [ ] I think the current algorithm may illegally hoist certain + // dependencies carried on this loop. Specifically, we can hoist + // addresses that (a) are not indexed by this loop, but need to be + // repeated anyway because of some other address operation, while that + // combination can't be moved to registers, e.g. because their index + // matrices are not equal. + // We need to distinguish between order within the loop, for the + // purpose of this topsort, and placement with respect to the loop. + // Simply, we perhaps should simply avoid hoisting when we carry + // a dependence that doesn't meet the criteria of `unhoistableOutputs` + // - [ ] Incorporate the legality setting here? + for (IR::Addr *m : A->unhoistableOutputs(deps, depth - 1)) { if (m->wasVisited(depth)) continue; - body = visitLoopDependent(deps, L, m, depth, body); + body = visitLoopDependent(deps, L, m, depth, body, R); } } if (auto *I = llvm::dyn_cast(N)) { for (IR::Node *U : I->getUsers()) { if (U->wasVisited(depth)) continue; - body = visitLoopDependent(deps, L, U, depth, body); + body = visitLoopDependent(deps, L, U, depth, body, R); } } else if (auto *S = llvm::dyn_cast(N)) { for (IR::Node *U : S->getChild()->nodes()) { if (U->wasVisited(depth)) continue; - body = visitLoopDependent(deps, L, U, depth, body); + body = visitLoopDependent(deps, L, U, depth, body, R); } } #ifndef NDEBUG if (N->getLoop() == L) N->visit(depth); #endif if (N->getLoop() == L) body = N->setNext(body); + if (R) hoist(N, R, depth - 1); return body; } inline void addBody(IR::Dependencies deps, IR::Loop *root, int depth, @@ -360,11 +375,12 @@ inline void topologicalSort(IR::Dependencies deps, IR::Loop *root, int depth) { // `visited` So, now we search all of root's users, i.e. every addr that // depends on it root->setNext(summary.afterExit); + IR::Loop *P = root->getLoop(); + for (IR::Node *N : summary.afterExit->nodes()) hoist(N, P, depth - 1); addBody(deps, root, depth, summary.indexedByLoop); IR::Node *body{root}; for (IR::Node *N : summary.notIndexedByLoop->nodes()) - body = visitLoopDependent(deps, root, N, depth, body); - // and any remaining edges + body = visitLoopDependent(deps, root, N, depth, body, P); } // NOLINTNEXTLINE(misc-no-recursion) inline auto buildSubGraph(IR::Dependencies deps, IR::Loop *root, int depth, @@ -662,9 +678,10 @@ class IROptimizer { eraseCandidates{eraseCandidates_}, root_{root}, lalloc_{lalloc} { sortEdges(root_, 0); removeRedundantAddr(res.addr); - findReductions(res.addr); unsigned numAddr = eliminateTemporaries(res.addr); + findReductions(res.addr); loopDeps = loopDepSats(lalloc, deps, res); + /// TODO: legality check // plan now is to have a `BitArray` big enough to hold `numLoops` entries // and `numAddr` rows; final axis is contiguous vs non-contiguous // Additionally, we will have a vector of unroll strategies to consider diff --git a/include/Optimize/Legality.hpp b/include/Optimize/Legality.hpp index b0c554ba3..6f0039aff 100644 --- a/include/Optimize/Legality.hpp +++ b/include/Optimize/Legality.hpp @@ -92,6 +92,9 @@ namespace poly::CostModeling { // [ ] Fuse legality checking, at least in part, with it, as that may indicate // unrolling in example 3 above. // [ ] See discussionin CostModeling.hpp above `optimize` about unrolling. +// Okay, we'll take a somewhat different approach: +// it shouldn't be too difficult to check for extra outputs, etc. +// so we do that all here, after the `Addr` placements and simplifications struct Legality { // enum class Reduction { None = 0, Unordered = 1, Ordered = 2 }; uint16_t unordered_reduction_count{0}; diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 4d79610fe..a5bca73ab 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -966,6 +966,10 @@ class Dependencies { void *p = data + revTimeEdgeOffset * getCapacity(); return static_cast(p); } + [[nodiscard]] constexpr auto revTimeEdgePtr() const -> const int32_t * { + void *p = data + revTimeEdgeOffset * getCapacity(); + return static_cast(p); + } constexpr auto depSatBndPtr() -> std::array, 2> * { void *p = data + depSatBndOffset * getCapacity(); return static_cast, 2> *>(p); @@ -1066,6 +1070,12 @@ class Dependencies { constexpr auto revTimeEdge(ID i) -> int32_t & { return revTimeEdgePtr()[i.id]; } + constexpr auto revTimeEdge(ID i) -> int32_t & { + return revTimeEdgePtr()[i.id]; + } + constexpr auto revTimeEdge(ID i) const -> int32_t { + return revTimeEdgePtr()[i.id]; + } constexpr auto depPoly(ID i) -> DepPoly *& { return depPolyPtr()[i.id]; } [[nodiscard]] constexpr auto depSatBnd(ID i) const -> std::array, 2> { @@ -1169,6 +1179,31 @@ class Dependencies { auto f = [=, this](int32_t id) { return output(Dependence::ID{id}); }; return std::views::transform(f); } + /// this function essentially indicates that this dependency does not prevent + /// the hoisting of a memory access out of a loop, because a memory->register + /// transform is possible. + /// The requirements are that the `indexMatrix` match + [[nodiscard]] constexpr auto registerEligible(ID id) const -> bool { + /// If no repeated accesses across time, it can't be hoisted out + if (revTimeEdge(id) < 0) return false; + DensePtrMatrix inMat{input(id)->indexMatrix()}, + outMat{output(id)->indexMatrix()}; + ptrdiff_t numLoopsIn = ptrdiff_t(inMat.numCol()), + numLoopsOut = ptrdiff_t(outMat.numCol()), + numLoops = std::min(numLoopsIn, numLoopsOut); + if ((numLoopsIn != numLoopsOut) && + math::anyNEZero(numLoopsIn > numLoopsOut + ? inMat[_, _(numLoopsOut, numLoopsIn)] + : outMat[_, _(numLoopsIn, numLoopsOut)])) + return false; + return inMat[_, _(0, numLoops)] == outMat[_, _(0, numLoops)]; + } + [[nodiscard]] constexpr auto registerEligibleFilter() const { + auto f = [=, this](int32_t id) -> bool { + return registerEligible(Dependence::ID{id}); + }; + return std::views::filter(f); + } }; static_assert(std::is_trivially_copyable_v); @@ -1216,6 +1251,10 @@ inline auto IR::Addr::inputAddrs(Dependencies deps, int depth) const { inline auto IR::Addr::outputAddrs(Dependencies deps, int depth) const { return outputEdgeIDs(deps, depth) | deps.outputAddrTransform(); } +inline auto IR::Addr::unhoistableOutputs(Dependencies deps, int depth) const { + return outputEdgeIDs(deps, depth) | deps.registerEligibleFilter() | + deps.outputAddrTransform(); +} /// Addr::operator->(Dependencies deps) /// drop `this` from the graph, and remove it from `deps` From 18929181aa47d114b2bcfa27409b22b56cbec0b5 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Tue, 5 Dec 2023 19:29:40 -0500 Subject: [PATCH 079/112] minor progress, mostly thinking about the Legality interface --- include/Optimize/Legality.hpp | 50 +++++++++++++++++++++++--------- include/Polyhedra/Dependence.hpp | 5 +--- 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/include/Optimize/Legality.hpp b/include/Optimize/Legality.hpp index 6f0039aff..8da2f75cb 100644 --- a/include/Optimize/Legality.hpp +++ b/include/Optimize/Legality.hpp @@ -95,24 +95,30 @@ namespace poly::CostModeling { // Okay, we'll take a somewhat different approach: // it shouldn't be too difficult to check for extra outputs, etc. // so we do that all here, after the `Addr` placements and simplifications +// struct Legality { // enum class Reduction { None = 0, Unordered = 1, Ordered = 2 }; uint16_t unordered_reduction_count{0}; uint16_t mindistance{std::numeric_limits::max()}; uint16_t maxdistance{0}; - uint16_t maxiters{0}; + bool canPeel{true}; + bool canUnroll{true}; + // uint16_t maxiters{0}; [[nodiscard]] constexpr auto minDistance() const -> uint16_t { return mindistance; } [[nodiscard]] constexpr auto maxDistance() const -> uint16_t { return mindistance; } - [[nodiscard]] constexpr auto maxIters() const -> uint16_t { return maxiters; } + // [[nodiscard]] constexpr auto maxIters() const -> uint16_t { return + // maxiters; } constexpr auto operator&=(Legality other) -> Legality & { unordered_reduction_count += other.unordered_reduction_count; mindistance = std::min(mindistance, other.mindistance); maxdistance = std::max(maxdistance, other.maxdistance); - maxiters = std::max(maxiters, other.maxiters); + canPeel = canPeel & other.canPeel; + canUnroll = canUnroll & other.canUnroll; + // maxiters = std::max(maxiters, other.maxiters); return *this; } [[nodiscard]] constexpr auto operator&(Legality other) const -> Legality { @@ -121,21 +127,39 @@ struct Legality { } constexpr Legality() = default; constexpr Legality(const Legality &) = default; - constexpr Legality(IR::Dependencies deps, Dependence d) { + static auto deeperAccess(poly::Dependencies deps, IR::Loop *L, IR::Addr *in) + -> bool { + return std::ranges::any_of(in->outputEdgeIDs(deps), [=](int32_t id) { + IR::Addr *a = deps.output(Dependence::ID{id}); + return (a->getLoop() != L) && L->contains(a); + }); + } + void update(poly::Dependencies deps, IR::Loop *L, Dependence d) { IR::Addr *in = d.out, *out = d.in; - if (d.revTimeEdge()) { - if (in->reassociableReductionPair() != out) { - mindistance = 0; - maxdistance = maxiters = std::numeric_limits::max(); - } else ++unordered_reduction_count; + if (d.revTimeEdge() && (in->reassociableReductionPair() != out)) { + ++unordered_reduction_count; + return; + } + /// Now we check if we're allowed any reorderings + /// First of all, consider that unrolling is allowed if no memory accesses + /// dependent on the `in` or `out` are in a deeper loop (e.g. example 3), + /// even if vectorization is not. + if (canUnroll && d.revTimeEdge() && deeperAccess(deps, L, in)) { + mindistance = 0; + maxdistance = std::numeric_limits::max(); + canPeel = false; + canUnroll = false; return; } - // now we must analyze the dependence... - // + if (mindistance || maxdistance != std::numeric_limits::max()) { + // for now, just check peelability + } + if (!canPeel){ + // then we have a dependence + } }; Legality(LoopDepSatisfaction deps, IR::Loop *L) { - for (poly::Dependence d : deps.depencencies(L)) - (*this) &= Legality(deps.deps, d); + for (poly::Dependence d : deps.depencencies(L)) update(deps.deps, L, d); } }; diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index a5bca73ab..d5bcafe34 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -1070,10 +1070,7 @@ class Dependencies { constexpr auto revTimeEdge(ID i) -> int32_t & { return revTimeEdgePtr()[i.id]; } - constexpr auto revTimeEdge(ID i) -> int32_t & { - return revTimeEdgePtr()[i.id]; - } - constexpr auto revTimeEdge(ID i) const -> int32_t { + [[nodiscard]] constexpr auto revTimeEdge(ID i) const -> int32_t { return revTimeEdgePtr()[i.id]; } constexpr auto depPoly(ID i) -> DepPoly *& { return depPolyPtr()[i.id]; } From 550eb05b2d0adb4c561ec21697bc87ccf6d199e0 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Tue, 5 Dec 2023 22:11:08 -0500 Subject: [PATCH 080/112] some more minor progress --- include/Optimize/CostModeling.hpp | 4 ++-- include/Optimize/Legality.hpp | 5 ++--- include/Polyhedra/Dependence.hpp | 13 +++++++++++-- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/include/Optimize/CostModeling.hpp b/include/Optimize/CostModeling.hpp index 980764930..476458c4c 100644 --- a/include/Optimize/CostModeling.hpp +++ b/include/Optimize/CostModeling.hpp @@ -74,7 +74,7 @@ constexpr inline void Addr::maybeReassociableReduction(Dependencies deps) { IR::Addr *dst = deps.output(id); if (dst->isStore() || (getLoop() != dst->getLoop())) return; // if we failed to hoist the `Addr` out of time-dims, then we cannot optimize. - if (getCurrentDepth() >= deps.satLevel(id)) return; + if (getCurrentDepth() > deps.satLevel(id)) return; if (reassociableReduction == dst) return; // multiple time dims, already found auto *c = llvm::dyn_cast(getStoredVal()); if (!c) return; @@ -160,7 +160,7 @@ class LoopTree { constexpr auto getLoop() -> IR::Loop * { return loop; } }; -void hoist(IR::Node *N, IR::Loop *P, int depth) { +inline void hoist(IR::Node *N, IR::Loop *P, int depth) { N->setParent(P); N->setCurrentDepth(depth); } diff --git a/include/Optimize/Legality.hpp b/include/Optimize/Legality.hpp index 8da2f75cb..73402220c 100644 --- a/include/Optimize/Legality.hpp +++ b/include/Optimize/Legality.hpp @@ -5,7 +5,6 @@ #include "Optimize/CostModeling.hpp" #include "Polyhedra/Dependence.hpp" #include -#include #include namespace poly::CostModeling { @@ -95,7 +94,7 @@ namespace poly::CostModeling { // Okay, we'll take a somewhat different approach: // it shouldn't be too difficult to check for extra outputs, etc. // so we do that all here, after the `Addr` placements and simplifications -// +// struct Legality { // enum class Reduction { None = 0, Unordered = 1, Ordered = 2 }; uint16_t unordered_reduction_count{0}; @@ -154,7 +153,7 @@ struct Legality { if (mindistance || maxdistance != std::numeric_limits::max()) { // for now, just check peelability } - if (!canPeel){ + if (!canPeel) { // then we have a dependence } }; diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index d5bcafe34..15ca3b427 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -26,6 +26,12 @@ struct Dependence { int32_t id; [[nodiscard]] constexpr explicit operator bool() const { return id >= 0; } }; + enum class Type : uint8_t { + Strict = 0, + Reassociable = 1, + FreeOfDeeperDeps = 2, + Peelable = 4 + }; // private: // @@ -46,6 +52,7 @@ struct Dependence { ID revTimeEdge_{-1}; std::array satLvl; bool forward; + uint8_t meta{0}; constexpr auto getSimplexPair() -> std::array, 2> { return {dependenceSatisfaction, dependenceBounding}; @@ -115,6 +122,9 @@ struct Dependence { static constexpr auto satLevelMask(uint8_t slvl) -> uint8_t { return slvl & uint8_t(127); // NOTE: deduces to `int` } + // note that sat levels start at `0`, `0` meaning the outer most loop + // satisfies it. Thus, `satLevel() == 0` means the `depth == 1` loop satisfied + // it. [[nodiscard]] constexpr auto satLevel() const -> uint8_t { return satLevelMask(satLvl[0]); } @@ -565,8 +575,7 @@ class Dependencies { /// stores `d` at index `i` /// Dependence `d` is pushed to the fronts of the edgeOut and edgeIn chains. constexpr void set(ID i, Dependence d) { - auto out = d.output(); - auto in = d.input(); + IR::Addr *out = d.output(), *in = d.input(); output(i) = out; input(i) = in; nextOut(i) = out->getEdgeOut(); From e1b11ec36eaba0a8bfc48ba39e5d25ef699ed393 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Wed, 6 Dec 2023 23:02:19 -0500 Subject: [PATCH 081/112] minor update, starting to transition to SOA --- include/Polyhedra/Dependence.hpp | 36 ++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 15ca3b427..d6f7c2588 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -1,5 +1,7 @@ #pragma once #include "IR/Address.hpp" +#include +#include #include "IR/Node.hpp" #include "Math/Array.hpp" #include "Math/Simplex.hpp" @@ -26,11 +28,11 @@ struct Dependence { int32_t id; [[nodiscard]] constexpr explicit operator bool() const { return id >= 0; } }; - enum class Type : uint8_t { - Strict = 0, - Reassociable = 1, - FreeOfDeeperDeps = 2, - Peelable = 4 + enum MetaFlags : uint8_t { + Forward = 1, + Reassociable = 2, + FreeOfDeeperDeps = 4, + Peelable = 8 }; // private: @@ -51,9 +53,14 @@ struct Dependence { // std::array satLvl{255, 255, 255, 255, 255, 255, 255}; ID revTimeEdge_{-1}; std::array satLvl; - bool forward; uint8_t meta{0}; + // template [[nodiscard]] auto get() const -> const auto & { + // if constexpr (I == 0) return depPoly; + // else if constexpr (I==1) return dependenceSatisfaction; + // else if constexpr (I==1) return dependenceBounding; + // } + constexpr auto getSimplexPair() -> std::array, 2> { return {dependenceSatisfaction, dependenceBounding}; } @@ -161,7 +168,7 @@ struct Dependence { return in->getArrayPointer(); } /// indicates whether forward is non-empty - [[nodiscard]] constexpr auto isForward() const -> bool { return forward; } + [[nodiscard]] constexpr auto isForward() const -> bool { return meta&1; } [[nodiscard]] constexpr auto nodeIn() const -> const lp::ScheduledNode * { return in->getNode(); } @@ -257,12 +264,12 @@ struct Dependence { getNumOmegaCoefficients() == ptrdiff_t(dependenceSatisfaction->getConstraints().numCol())); } - [[nodiscard]] constexpr auto getDepPoly() -> Valid { - return depPoly; - } - [[nodiscard]] constexpr auto getDepPoly() const -> Valid { + [[nodiscard]] constexpr auto getDepPoly()const -> Valid { return depPoly; } + // [[nodiscard]] constexpr auto getDepPoly() const -> Valid { + // return depPoly; + // } [[nodiscard]] constexpr auto getNumConstraints() const -> unsigned { return dependenceBounding->getNumCons() + dependenceSatisfaction->getNumCons(); @@ -549,6 +556,9 @@ static_assert(sizeof(Dependence) <= 64); // i_0 = i_1 // j_0 = j_1 - k_1 class Dependencies { + + math::ManagedSOA, + DepPoly*,int32_t,int32_t,int32_t,int32_t,int32_t,std::array,uint8_t>> datadeps; char *data{nullptr}; int32_t numData{0}; static constexpr int32_t initialCapacity = 16; @@ -656,7 +666,7 @@ class Dependencies { .dependenceBounding = pair[1], .in = x, .out = y, - .forward = isFwd}); + .meta = isFwd}); } void timelessCheck(Arena<> *alloc, Valid dxy, Valid x, Valid y, @@ -726,7 +736,7 @@ class Dependencies { .dependenceBounding = pair[1], .in = in, .out = out, - .forward = isFwd}; + .meta = isFwd}; invariant(out->getCurrentDepth() + in->getCurrentDepth(), dep0.getNumPhiCoefficients()); ID d0ID{addEdge(alloc, dep0)}, prevID = d0ID; From 9f75d4c7975e712cbea38299c4fd1300e6b8915d Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Thu, 7 Dec 2023 22:58:36 -0500 Subject: [PATCH 082/112] update Dependencies to use heap allocated SOA instead of hand-written SOA allocated via bumpalloc --- include/IR/Address.hpp | 32 ++- include/IR/Node.hpp | 2 +- include/Polyhedra/Dependence.hpp | 451 +++++++++++-------------------- 3 files changed, 181 insertions(+), 304 deletions(-) diff --git a/include/IR/Address.hpp b/include/IR/Address.hpp index c7aa8e94a..fe9401a92 100644 --- a/include/IR/Address.hpp +++ b/include/IR/Address.hpp @@ -264,7 +264,7 @@ class Addr : public Instruction { // as it doesn't store detecting invalidity. // It checks for invalidity, in which case it doesn't set the reassociable // reduction. - constexpr inline void maybeReassociableReduction(Dependencies); + constexpr inline void maybeReassociableReduction(const Dependencies &); constexpr auto reassociableReductionPair() -> Addr * { return reassociableReduction; } @@ -304,19 +304,21 @@ class Addr : public Instruction { return node; } constexpr void setNode(lp::ScheduledNode *n) { node = n; } - [[nodiscard]] inline auto inputAddrs(Dependencies) const; - [[nodiscard]] inline auto outputAddrs(Dependencies) const; - [[nodiscard]] inline auto inputAddrs(Dependencies, int depth) const; - [[nodiscard]] inline auto outputAddrs(Dependencies, int depth) const; - [[nodiscard]] inline auto inputEdges(Dependencies) const; - [[nodiscard]] inline auto outputEdges(Dependencies) const; - [[nodiscard]] inline auto inputEdges(Dependencies, int depth) const; - [[nodiscard]] inline auto outputEdges(Dependencies, int depth) const; - [[nodiscard]] inline auto inputEdgeIDs(Dependencies) const; - [[nodiscard]] inline auto outputEdgeIDs(Dependencies) const; - [[nodiscard]] inline auto inputEdgeIDs(Dependencies, int depth) const; - [[nodiscard]] inline auto outputEdgeIDs(Dependencies, int depth) const; - [[nodiscard]] inline auto unhoistableOutputs(Dependencies, int depth) const; + [[nodiscard]] inline auto inputAddrs(const Dependencies &) const; + [[nodiscard]] inline auto outputAddrs(const Dependencies &) const; + [[nodiscard]] inline auto inputAddrs(const Dependencies &, int depth) const; + [[nodiscard]] inline auto outputAddrs(const Dependencies &, int depth) const; + [[nodiscard]] inline auto inputEdges(const Dependencies &) const; + [[nodiscard]] inline auto outputEdges(const Dependencies &) const; + [[nodiscard]] inline auto inputEdges(const Dependencies &, int depth) const; + [[nodiscard]] inline auto outputEdges(const Dependencies &, int depth) const; + [[nodiscard]] inline auto inputEdgeIDs(const Dependencies &) const; + [[nodiscard]] inline auto outputEdgeIDs(const Dependencies &) const; + [[nodiscard]] inline auto inputEdgeIDs(const Dependencies &, int depth) const; + [[nodiscard]] inline auto outputEdgeIDs(const Dependencies &, + int depth) const; + [[nodiscard]] inline auto unhoistableOutputs(const Dependencies &, + int depth) const; [[nodiscard]] static auto zeroDim(Arena<> *alloc, llvm::SCEVUnknown const *arrayPtr, @@ -639,7 +641,7 @@ class Addr : public Instruction { } /// drop `this` and remove it from `Dependencies` - inline void drop(Dependencies); + inline void drop(Dependencies &); void printDotName(llvm::raw_ostream &os) const { if (isLoad()) os << "... = "; diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index ebe79b79e..b035ea695 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -390,7 +390,7 @@ class Loop : public Node { L = L->getOuterLoop(); return L; } - inline auto getLegality(poly::Dependencies, math::PtrVector) + inline auto getLegality(const poly::Dependencies &, math::PtrVector) -> LegalTransforms; }; [[nodiscard]] inline constexpr auto Node::getLoop() const noexcept -> Loop * { diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index d6f7c2588..9d14a6680 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -1,7 +1,5 @@ #pragma once #include "IR/Address.hpp" -#include -#include #include "IR/Node.hpp" #include "Math/Array.hpp" #include "Math/Simplex.hpp" @@ -10,7 +8,9 @@ #include "Polyhedra/Schedule.hpp" #include "Support/Iterators.hpp" #include +#include #include +#include #include #include #include @@ -23,6 +23,7 @@ namespace poly { /// It contains simplices representing constraints that affine schedules /// are allowed to take. struct Dependence { + // public: struct ID { int32_t id; @@ -64,6 +65,7 @@ struct Dependence { constexpr auto getSimplexPair() -> std::array, 2> { return {dependenceSatisfaction, dependenceBounding}; } + constexpr auto getMeta() const -> uint8_t { return meta; } // public: friend class Dependencies; @@ -168,7 +170,7 @@ struct Dependence { return in->getArrayPointer(); } /// indicates whether forward is non-empty - [[nodiscard]] constexpr auto isForward() const -> bool { return meta&1; } + [[nodiscard]] constexpr auto isForward() const -> bool { return meta & 1; } [[nodiscard]] constexpr auto nodeIn() const -> const lp::ScheduledNode * { return in->getNode(); } @@ -232,7 +234,8 @@ struct Dependence { return out->getNaturalDepth(); } [[nodiscard]] constexpr auto isInactive(size_t depth) const -> bool { - return (depth >= std::min(out->getCurrentDepth(), in->getCurrentDepth())); + return (depth >= + size_t(std::min(out->getCurrentDepth(), in->getCurrentDepth()))); } [[nodiscard]] constexpr auto getNumLambda() const -> unsigned { return depPoly->getNumLambda() << 1; @@ -264,7 +267,7 @@ struct Dependence { getNumOmegaCoefficients() == ptrdiff_t(dependenceSatisfaction->getConstraints().numCol())); } - [[nodiscard]] constexpr auto getDepPoly()const -> Valid { + [[nodiscard]] constexpr auto getDepPoly() const -> Valid { return depPoly; } // [[nodiscard]] constexpr auto getDepPoly() const -> Valid { @@ -556,103 +559,72 @@ static_assert(sizeof(Dependence) <= 64); // i_0 = i_1 // j_0 = j_1 - k_1 class Dependencies { + using Tuple = containers::Tuple, 2>, + DepPoly *, int32_t, int32_t, int32_t, int32_t, + int32_t, std::array, uint8_t>; + + math::ManagedSOA datadeps; - math::ManagedSOA, - DepPoly*,int32_t,int32_t,int32_t,int32_t,int32_t,std::array,uint8_t>> datadeps; - char *data{nullptr}; - int32_t numData{0}; - static constexpr int32_t initialCapacity = 16; - // int32_t tombstone{-1}; + static constexpr size_t OutI = 0; + static constexpr size_t InI = 1; + static constexpr size_t SimplexPairI = 2; + static constexpr size_t DepPolyI = 3; + static constexpr size_t NextEdgeOutI = 4; + static constexpr size_t PrevEdgeOutI = 5; + static constexpr size_t NextEdgeInI = 6; + static constexpr size_t PrevEdgeInI = 7; + static constexpr size_t RevTimeEdgeI = 8; + static constexpr size_t SatLevelI = 9; + static constexpr size_t GetMetaI = 10; public: using ID = Dependence::ID; - constexpr Dependencies() noexcept = default; - constexpr Dependencies(Arena<> *alloc) - : data(alloc->allocate(memNeeded(initialCapacity))) {} - constexpr Dependencies(const Dependencies &) noexcept = default; // or delete? - constexpr Dependencies(Dependencies &&) noexcept = default; // or delete? - constexpr auto operator=(Dependencies &&other) noexcept - -> Dependencies & = default; - constexpr auto operator=(const Dependencies &other) noexcept - -> Dependencies & = default; + Dependencies(ptrdiff_t len) : datadeps(len) {} + Dependencies(const Dependencies &) noexcept = delete; + constexpr Dependencies(Dependencies &&) noexcept = default; + constexpr auto operator=(Dependencies &&other) noexcept -> Dependencies & { + datadeps = std::move(other.datadeps); + return *this; + }; [[nodiscard]] constexpr auto size() const noexcept -> int32_t { - return numData; + return datadeps.size(); + } + + constexpr auto tup(Dependence d, ptrdiff_t i) -> Tuple { + IR::Addr *out = d.output(), *in = d.input(); + if (out->getEdgeOut() >= 0) prevOut(ID{out->getEdgeOut()}) = i; + if (in->getEdgeIn() >= 0) prevIn(ID{in->getEdgeIn()}) = i; + in->setEdgeOut(i); + out->setEdgeIn(i); + return Tuple{out, + in, + d.getSimplexPair(), + d.getDepPoly(), + out->getEdgeOut(), + -1, + in->getEdgeIn(), + -1, + d.revTimeEdge().id, + d.satLvl, + d.getMeta()}; } private: /// set(ID i, Dependence d) /// stores `d` at index `i` /// Dependence `d` is pushed to the fronts of the edgeOut and edgeIn chains. - constexpr void set(ID i, Dependence d) { - IR::Addr *out = d.output(), *in = d.input(); - output(i) = out; - input(i) = in; - nextOut(i) = out->getEdgeOut(); - if (out->getEdgeOut() >= 0) prevOut(ID{out->getEdgeOut()}) = i.id; - prevOut(i) = -1; - nextIn(i) = in->getEdgeIn(); - if (in->getEdgeIn() >= 0) prevIn(ID{in->getEdgeIn()}) = i.id; - prevIn(i) = -1; - depSatBnd(i) = d.getSimplexPair(); - revTimeEdge(i) = d.revTimeEdge().id; - depPoly(i) = d.getDepPoly(); - satLevelPair(i) = d.satLvl; - isForward(i) = d.isForward(); - in->setEdgeOut(i.id); - out->setEdgeIn(i.id); - } - /// NOTE: this reallocate implementation is dependent on `getCapacity()` - /// being defined as `std::bit_ceil(numData)`, and only getting called - /// when `numData == getCapacity()` and we're about to increment `numData` - /// after the call - /// TODO: would perhaps make more sense to use a normal heap allocator here... - void reallocate(Arena<> *alloc) { - size_t oldCapaciy = numData, newCapacity = 2 * oldCapaciy; - auto *newData = alloc->allocate(memNeeded(newCapacity)); - std::memcpy(newData + outAddrOffset * newCapacity, - data + outAddrOffset * oldCapaciy, - numData * sizeof(IR::Addr *)); - std::memcpy(newData + inAddrOffset * newCapacity, - data + inAddrOffset * oldCapaciy, numData * sizeof(IR::Addr *)); - std::memcpy(newData + depSatBndOffset * newCapacity, - data + depSatBndOffset * oldCapaciy, - numData * sizeof(std::array, 2>)); - std::memcpy(newData + depPolyOffset * newCapacity, - data + depPolyOffset * oldCapaciy, numData * sizeof(DepPoly *)); - std::memcpy(newData + nextEdgeOutOffset * newCapacity, - data + nextEdgeOutOffset * oldCapaciy, - numData * sizeof(int32_t)); - std::memcpy(newData + prevEdgeOutOffset * newCapacity, - data + prevEdgeOutOffset * oldCapaciy, - numData * sizeof(int32_t)); - std::memcpy(newData + nextEdgeInOffset * newCapacity, - data + nextEdgeInOffset * oldCapaciy, - numData * sizeof(int32_t)); - std::memcpy(newData + prevEdgeInOffset * newCapacity, - data + prevEdgeInOffset * oldCapaciy, - numData * sizeof(int32_t)); - std::memcpy(newData + revTimeEdgeOffset * newCapacity, - data + revTimeEdgeOffset * oldCapaciy, - numData * sizeof(int32_t)); - std::memcpy(newData + satLevelsOffset * newCapacity, - data + satLevelsOffset * oldCapaciy, - numData * sizeof(std::array)); - std::memcpy(newData + isForwardOffset * newCapacity, - data + isForwardOffset * oldCapaciy, numData * sizeof(bool)); - data = newData; - } - auto addEdge(Arena<> *alloc, Dependence d) -> ID { - if (numData == getCapacity()) reallocate(alloc); - ID id{numData++}; - set(id, d); - return id; - } - static constexpr auto memNeeded(size_t N) -> size_t { - return N * memNeededPer; + constexpr void set(ptrdiff_t i, Dependence d) { datadeps[i] = tup(d, i); } + constexpr void set(ID i, Dependence d) { set(i.id, d); } + auto addEdge(Dependence d) -> ID { + ptrdiff_t id{datadeps.size()}; + invariant(id >= 0); + datadeps.push_back(tup(d, id)); + return {int32_t(id)}; } - void addOrdered(Arena<> *alloc, Valid dxy, Valid x, + void addOrdered(Valid dxy, Valid x, Valid y, std::array, 2> pair, bool isFwd) { ptrdiff_t numLambda = dxy->getNumLambda(); @@ -661,18 +633,18 @@ class Dependencies { std::swap(x, y); } pair[0]->truncateVars(1 + numLambda + dxy->getNumScheduleCoef()); - addEdge(alloc, Dependence{.depPoly = dxy, - .dependenceSatisfaction = pair[0], - .dependenceBounding = pair[1], - .in = x, - .out = y, - .meta = isFwd}); + addEdge(Dependence{.depPoly = dxy, + .dependenceSatisfaction = pair[0], + .dependenceBounding = pair[1], + .in = x, + .out = y, + .meta = isFwd}); } void timelessCheck(Arena<> *alloc, Valid dxy, Valid x, Valid y, std::array, 2> pair) { invariant(dxy->getTimeDim(), unsigned(0)); - return addOrdered(alloc, dxy, x, y, pair, + return addOrdered(dxy, x, y, pair, checkDirection(*alloc, pair, x, y, dxy->getNumLambda(), Col<>{dxy->getNumVar() + 1})); } @@ -737,9 +709,9 @@ class Dependencies { .in = in, .out = out, .meta = isFwd}; - invariant(out->getCurrentDepth() + in->getCurrentDepth(), - dep0.getNumPhiCoefficients()); - ID d0ID{addEdge(alloc, dep0)}, prevID = d0ID; + invariant(ptrdiff_t(out->getCurrentDepth()) + in->getCurrentDepth(), + ptrdiff_t(dep0.getNumPhiCoefficients())); + ID d0ID{addEdge(dep0)}, prevID = d0ID; // pair is invalid const ptrdiff_t timeDim = dxy->getTimeDim(), numVar = 1 + dxy->getNumVar() - timeDim; @@ -749,8 +721,8 @@ class Dependencies { // dep0.depPoly->truncateVars(numVar); // dep0.depPoly->setTimeDim(0); - invariant(out->getCurrentDepth() + in->getCurrentDepth(), - dep0.getNumPhiCoefficients()); + invariant(ptrdiff_t(out->getCurrentDepth()) + in->getCurrentDepth(), + ptrdiff_t(dep0.getNumPhiCoefficients())); // now we need to check the time direction for all times // anything approaching 16 time dimensions would be insane for (ptrdiff_t t = 0;;) { @@ -792,10 +764,10 @@ class Dependencies { .in = out, .out = in, .revTimeEdge_ = prevID, - .forward = !isFwd}; - invariant(out->getCurrentDepth() + in->getCurrentDepth(), - dep1.getNumPhiCoefficients()); - prevID = addEdge(alloc, dep1); + .meta = !isFwd}; + invariant(ptrdiff_t(out->getCurrentDepth()) + in->getCurrentDepth(), + ptrdiff_t(dep1.getNumPhiCoefficients())); + prevID = addEdge(dep1); if (!repeat) break; } revTimeEdge(d0ID) = prevID.id; @@ -859,7 +831,8 @@ class Dependencies { const auto &[fxy, fyx] = p; unsigned numLoopsX = x->getCurrentDepth(), nTD = ptrdiff_t(nonTimeDim); #ifndef NDEBUG - const unsigned numLoopsCommon = std::min(numLoopsX, y->getCurrentDepth()); + ptrdiff_t numLoopsCommon = + std::min(ptrdiff_t(numLoopsX), ptrdiff_t(y->getCurrentDepth())); #endif PtrVector xFusOmega = x->getFusionOmega(); PtrVector yFusOmega = y->getFusionOmega(); @@ -896,134 +869,11 @@ class Dependencies { .in = in, .out = out, .satLvl = satLevelPair(i), - .forward = isForward(i) + .meta = getMeta(i) }; } - [[nodiscard]] constexpr auto getCapacity() const noexcept -> int32_t { - return std::max(initialCapacity, int32_t(std::bit_ceil(uint32_t(numData)))); - } - - // field order: - // IR::Addr* AddrOut - // IR::Addr* AddrIn - // std::array, 2> {depSat, depBnd} - // DepPoly* depPoly - // int32_t nextOut - // int32_t prevOut - // int32_t nextIn - // int32_t prevIn - // int32_t revTimeEdge - // std::array satLevel - // bool isForward - static constexpr size_t outAddrOffset = 0; - static constexpr size_t inAddrOffset = outAddrOffset + sizeof(IR::Addr *); - static constexpr size_t depSatBndOffset = inAddrOffset + sizeof(IR::Addr *); - static constexpr size_t depPolyOffset = - inAddrOffset + sizeof(std::array, 2>); - static constexpr size_t nextEdgeOutOffset = depPolyOffset + sizeof(DepPoly *); - static constexpr size_t prevEdgeOutOffset = depPolyOffset + sizeof(int32_t); - static constexpr size_t nextEdgeInOffset = - prevEdgeOutOffset + sizeof(int32_t); - static constexpr size_t prevEdgeInOffset = nextEdgeInOffset + sizeof(int32_t); - static constexpr size_t revTimeEdgeOffset = depSatBndOffset + sizeof(int32_t); - static constexpr size_t satLevelsOffset = prevEdgeInOffset + sizeof(int32_t); - static constexpr size_t isForwardOffset = - satLevelsOffset + sizeof(std::array); - static constexpr size_t memNeededPer = isForwardOffset + sizeof(bool); - - constexpr auto outAddrPtr() -> IR::Addr ** { - void *p = data + outAddrOffset * getCapacity(); - return static_cast(p); - } - [[nodiscard]] constexpr auto outAddrPtr() const -> IR::Addr *const * { - const void *p = data + outAddrOffset * getCapacity(); - return static_cast(p); - } - constexpr auto inAddrPtr() -> IR::Addr ** { - void *p = data + inAddrOffset * getCapacity(); - return static_cast(p); - } - [[nodiscard]] constexpr auto inAddrPtr() const -> IR::Addr *const * { - const void *p = data + inAddrOffset * getCapacity(); - return static_cast(p); - } - constexpr auto outEdgePtr() -> int32_t * { - void *p = data + nextEdgeOutOffset * getCapacity(); - return static_cast(p); - } - [[nodiscard]] constexpr auto outEdgePtr() const -> const int32_t * { - const void *p = data + nextEdgeOutOffset * getCapacity(); - return static_cast(p); - } - constexpr auto prevOutEdgePtr() -> int32_t * { - void *p = data + prevEdgeOutOffset * getCapacity(); - return static_cast(p); - } - [[nodiscard]] constexpr auto prevOutEdgePtr() const -> const int32_t * { - const void *p = data + prevEdgeOutOffset * getCapacity(); - return static_cast(p); - } - constexpr auto inEdgePtr() -> int32_t * { - void *p = data + nextEdgeInOffset * getCapacity(); - return static_cast(p); - } - [[nodiscard]] constexpr auto inEdgePtr() const -> const int32_t * { - const void *p = data + nextEdgeInOffset * getCapacity(); - return static_cast(p); - } - constexpr auto prevInEdgePtr() -> int32_t * { - void *p = data + prevEdgeInOffset * getCapacity(); - return static_cast(p); - } - [[nodiscard]] constexpr auto prevEdgePtr() const -> const int32_t * { - const void *p = data + prevEdgeInOffset * getCapacity(); - return static_cast(p); - } - constexpr auto revTimeEdgePtr() -> int32_t * { - void *p = data + revTimeEdgeOffset * getCapacity(); - return static_cast(p); - } - [[nodiscard]] constexpr auto revTimeEdgePtr() const -> const int32_t * { - void *p = data + revTimeEdgeOffset * getCapacity(); - return static_cast(p); - } - constexpr auto depSatBndPtr() -> std::array, 2> * { - void *p = data + depSatBndOffset * getCapacity(); - return static_cast, 2> *>(p); - } - [[nodiscard]] constexpr auto depSatBndPtr() const - -> const std::array, 2> * { - const void *p = data + depSatBndOffset * getCapacity(); - return static_cast, 2> *>(p); - } - constexpr auto depPolyPtr() -> DepPoly ** { - void *p = data + depPolyOffset * getCapacity(); - return static_cast(p); - } - [[nodiscard]] constexpr auto depPolyPtr() const -> DepPoly *const * { - const void *p = data + depPolyOffset * getCapacity(); - return static_cast(p); - } - constexpr auto satLevelsPtr() -> std::array * { - void *p = data + satLevelsOffset * getCapacity(); - return static_cast *>(p); - } - [[nodiscard]] constexpr auto satLevelsPtr() const - -> const std::array * { - const void *p = data + satLevelsOffset * getCapacity(); - return static_cast *>(p); - } - constexpr auto isForwardPtr() -> bool * { - void *p = data + isForwardOffset * getCapacity(); - return static_cast(p); - } - [[nodiscard]] constexpr auto isForwardPtr() const -> const bool * { - const void *p = data + isForwardOffset * getCapacity(); - return static_cast(p); - } - public: constexpr void removeEdge(ID id) { removeOutEdge(id.id); @@ -1045,67 +895,83 @@ class Dependencies { [[nodiscard]] constexpr auto get(ID i) const -> Dependence { return get(i, input(i), output(i)); } - constexpr auto outAddrs() -> MutPtrVector { - return {outAddrPtr(), numData}; - } - constexpr auto inAddrs() -> MutPtrVector { - return {inAddrPtr(), numData}; - } + // constexpr auto outAddrs() -> MutPtrVector { + // return {outAddrPtr(), numData}; + // } + // constexpr auto inAddrs() -> MutPtrVector { + // return {inAddrPtr(), numData}; + // } constexpr auto outEdges() -> MutPtrVector { - return {outEdgePtr(), numData}; + return datadeps.template get(); } constexpr auto inEdges() -> MutPtrVector { - return {inEdgePtr(), numData}; - } - [[nodiscard]] constexpr auto outEdges() const -> PtrVector { - return {outEdgePtr(), unsigned(numData)}; + return datadeps.template get(); } - [[nodiscard]] constexpr auto inEdges() const -> PtrVector { - return {inEdgePtr(), unsigned(numData)}; + constexpr auto outEdges() const -> PtrVector { + return datadeps.template get(); } - constexpr auto satLevels() -> MutPtrVector> { - return {satLevelsPtr(), numData}; + constexpr auto inEdges() const -> PtrVector { + return datadeps.template get(); } + // [[nodiscard]] constexpr auto outEdges() const -> PtrVector { + // return {outEdgePtr(), unsigned(numData)}; + // } + // [[nodiscard]] constexpr auto inEdges() const -> PtrVector { + // return {inEdgePtr(), unsigned(numData)}; + // } + // constexpr auto satLevels() -> MutPtrVector> { + // return {satLevelsPtr(), numData}; + // } [[nodiscard]] constexpr auto output(ID i) -> IR::Addr *& { - return outAddrPtr()[i.id]; + return datadeps.template get(i.id); } [[nodiscard]] constexpr auto output(ID i) const -> IR::Addr * { - return outAddrPtr()[i.id]; + return datadeps.template get(i.id); } [[nodiscard]] constexpr auto input(ID i) -> IR::Addr *& { - return inAddrPtr()[i.id]; + return datadeps.template get(i.id); } [[nodiscard]] constexpr auto input(ID i) const -> IR::Addr * { - return inAddrPtr()[i.id]; + return datadeps.template get(i.id); + } + constexpr auto nextOut(ID i) -> int32_t & { + return datadeps.template get(i.id); + } + constexpr auto prevOut(ID i) -> int32_t & { + return datadeps.template get(i.id); + } + constexpr auto nextIn(ID i) -> int32_t & { + return datadeps.template get(i.id); + } + constexpr auto prevIn(ID i) -> int32_t & { + return datadeps.template get(i.id); } - constexpr auto nextOut(ID i) -> int32_t & { return outEdgePtr()[i.id]; } - constexpr auto prevOut(ID i) -> int32_t & { return prevOutEdgePtr()[i.id]; } - constexpr auto nextIn(ID i) -> int32_t & { return inEdgePtr()[i.id]; } - constexpr auto prevIn(ID i) -> int32_t & { return prevInEdgePtr()[i.id]; } constexpr auto depSatBnd(ID i) -> std::array, 2> & { - return depSatBndPtr()[i.id]; + return datadeps.template get(i.id); } constexpr auto revTimeEdge(ID i) -> int32_t & { - return revTimeEdgePtr()[i.id]; + return datadeps.template get(i.id); } [[nodiscard]] constexpr auto revTimeEdge(ID i) const -> int32_t { - return revTimeEdgePtr()[i.id]; + return datadeps.template get(i.id); + } + constexpr auto depPoly(ID i) -> DepPoly *& { + return datadeps.template get(i.id); } - constexpr auto depPoly(ID i) -> DepPoly *& { return depPolyPtr()[i.id]; } [[nodiscard]] constexpr auto depSatBnd(ID i) const -> std::array, 2> { - return depSatBndPtr()[i.id]; + return datadeps.template get(i.id); } [[nodiscard]] constexpr auto depPoly(ID i) const -> DepPoly * { - return depPolyPtr()[i.id]; + return datadeps.template get(i.id); } constexpr auto satLevelPair(ID i) -> std::array & { - return satLevelsPtr()[i.id]; + return datadeps.template get(i.id); } [[nodiscard]] constexpr auto satLevelPair(ID i) const -> std::array { - return satLevelsPtr()[i.id]; + return datadeps.template get(i.id); } [[nodiscard]] constexpr auto satLevel(ID i) const -> uint8_t { return Dependence::satLevelMask(satLevelPair(i)[0]); @@ -1117,11 +983,14 @@ class Dependencies { return Dependence::satLevelMask(satLevelPair(i)[0]) > depth; } - [[nodiscard]] constexpr auto isForward(ID i) noexcept -> bool & { - return isForwardPtr()[i.id]; + [[nodiscard]] constexpr auto getMeta(ID i) noexcept -> uint8_t & { + return datadeps.template get(i.id); + } + [[nodiscard]] constexpr auto getMeta(ID i) const noexcept -> uint8_t { + return datadeps.template get(i.id); } [[nodiscard]] constexpr auto isForward(ID i) const noexcept -> bool { - return isForwardPtr()[i.id]; + return getMeta(i); } class Ref { @@ -1153,15 +1022,15 @@ class Dependencies { if (dxy->getTimeDim()) timeCheck(alloc, dxy, x, y, pair); else timelessCheck(alloc, dxy, x, y, pair); } - inline void copyDependencies(Arena<> *alloc, IR::Addr *src, IR::Addr *dst); + inline void copyDependencies(IR::Addr *src, IR::Addr *dst); // reload store `x` auto reload(Arena<> *alloc, Valid store) -> Valid { Valid dxy{DepPoly::self(alloc, store)}; std::array, 2> pair(dxy->farkasPair(alloc)); Valid load = store->reload(alloc); - copyDependencies(alloc, store, load); + copyDependencies(store, load); if (dxy->getTimeDim()) timeCheck(alloc, dxy, store, load, pair, true); - else addOrdered(alloc, dxy, store, load, pair, true); + else addOrdered(dxy, store, load, pair, true); return load; } [[nodiscard]] constexpr auto inputEdgeIDs(int32_t id) const { @@ -1195,6 +1064,14 @@ class Dependencies { auto f = [=, this](int32_t id) { return output(Dependence::ID{id}); }; return std::views::transform(f); } + [[nodiscard]] constexpr auto inputAddrTransform() const { + auto f = [=, this](int32_t id) { return input(Dependence::ID{id}); }; + return std::views::transform(f); + } + [[nodiscard]] constexpr auto outputAddrTransform() const { + auto f = [=, this](int32_t id) { return output(Dependence::ID{id}); }; + return std::views::transform(f); + } /// this function essentially indicates that this dependency does not prevent /// the hoisting of a memory access out of a loop, because a memory->register /// transform is possible. @@ -1222,59 +1099,58 @@ class Dependencies { } }; -static_assert(std::is_trivially_copyable_v); -static_assert(std::is_trivially_destructible_v); } // namespace poly namespace IR { using poly::Dependencies; -inline auto Addr::inputEdges(Dependencies deps) const { +inline auto Addr::inputEdges(const Dependencies &deps) const { return deps.inputEdges(getEdgeIn()); } -inline auto Addr::outputEdges(Dependencies deps) const { +inline auto Addr::outputEdges(const Dependencies &deps) const { return deps.outputEdges(getEdgeOut()); } -inline auto Addr::inputEdgeIDs(Dependencies deps) const { +inline auto Addr::inputEdgeIDs(const Dependencies &deps) const { return deps.inputEdgeIDs(getEdgeIn()); } -inline auto Addr::outputEdgeIDs(Dependencies deps) const { +inline auto Addr::outputEdgeIDs(const Dependencies &deps) const { return deps.outputEdgeIDs(getEdgeOut()); } -inline auto Addr::inputEdgeIDs(Dependencies deps, int depth) const { +inline auto Addr::inputEdgeIDs(const Dependencies &deps, int depth) const { return inputEdgeIDs(deps) | deps.activeFilter(depth); } -inline auto Addr::outputEdgeIDs(Dependencies deps, int depth) const { +inline auto Addr::outputEdgeIDs(const Dependencies &deps, int depth) const { return outputEdgeIDs(deps) | deps.activeFilter(depth); } -inline auto IR::Addr::inputAddrs(Dependencies deps) const { +inline auto IR::Addr::inputAddrs(const Dependencies &deps) const { return inputEdgeIDs(deps) | deps.inputAddrTransform(); } -inline auto IR::Addr::outputAddrs(Dependencies deps) const { +inline auto IR::Addr::outputAddrs(const Dependencies &deps) const { return outputEdgeIDs(deps) | deps.outputAddrTransform(); } -inline auto Addr::inputEdges(Dependencies deps, int depth) const { +inline auto Addr::inputEdges(const Dependencies &deps, int depth) const { return inputEdgeIDs(deps) | deps.activeFilter(depth) | deps.getEdgeTransform(); } -inline auto Addr::outputEdges(Dependencies deps, int depth) const { +inline auto Addr::outputEdges(const Dependencies &deps, int depth) const { return outputEdgeIDs(deps) | deps.activeFilter(depth) | deps.getEdgeTransform(); } -inline auto IR::Addr::inputAddrs(Dependencies deps, int depth) const { +inline auto IR::Addr::inputAddrs(const Dependencies &deps, int depth) const { return inputEdgeIDs(deps, depth) | deps.inputAddrTransform(); } -inline auto IR::Addr::outputAddrs(Dependencies deps, int depth) const { +inline auto IR::Addr::outputAddrs(const Dependencies &deps, int depth) const { return outputEdgeIDs(deps, depth) | deps.outputAddrTransform(); } -inline auto IR::Addr::unhoistableOutputs(Dependencies deps, int depth) const { +inline auto IR::Addr::unhoistableOutputs(const Dependencies &deps, + int depth) const { return outputEdgeIDs(deps, depth) | deps.registerEligibleFilter() | deps.outputAddrTransform(); } -/// Addr::operator->(Dependencies deps) +/// Addr::operator->(const Dependencies& deps) /// drop `this` from the graph, and remove it from `deps` -inline void IR::Addr::drop(Dependencies deps) { +inline void IR::Addr::drop(Dependencies &deps) { // NOTE: this doesn't get removed from the `origAddr` list/the addrChain if (IR::Loop *L = getLoop(); L->getChild() == this) L->setChild(getNext()); removeFromList(); @@ -1283,7 +1159,7 @@ inline void IR::Addr::drop(Dependencies deps) { } using math::StridedVector; -inline auto Loop::getLegality(poly::Dependencies deps, +inline auto Loop::getLegality(const poly::Dependencies &deps, math::PtrVector loopDeps) -> LegalTransforms { const auto legal = getLegal(); @@ -1309,19 +1185,18 @@ inline auto Loop::getLegality(poly::Dependencies deps, } // namespace IR namespace poly { -inline void Dependencies::copyDependencies(Arena<> *alloc, IR::Addr *src, - IR::Addr *dst) { +inline void Dependencies::copyDependencies(IR::Addr *src, IR::Addr *dst) { for (int32_t id : src->inputEdgeIDs(*this)) { IR::Addr *input = this->input(Dependence::ID{id}); if (input->isLoad()) continue; Dependence d = get(Dependence::ID{id}, input, dst); - addEdge(alloc, d); + addEdge(d); } for (int32_t id : src->outputEdgeIDs(*this)) { IR::Addr *output = this->output(Dependence::ID{id}); if (output->isLoad()) continue; Dependence d = get(Dependence::ID{id}, dst, output); - addEdge(alloc, d); + addEdge(d); } } From c5502257c7feacd463a45027e3a4bbe3dfa85af0 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Thu, 7 Dec 2023 23:25:11 -0500 Subject: [PATCH 083/112] some cleanup --- include/Polyhedra/Dependence.hpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 9d14a6680..0fec09075 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -588,11 +588,11 @@ class Dependencies { return *this; }; - [[nodiscard]] constexpr auto size() const noexcept -> int32_t { + [[nodiscard]] constexpr auto size() const noexcept -> ptrdiff_t { return datadeps.size(); } - constexpr auto tup(Dependence d, ptrdiff_t i) -> Tuple { + constexpr auto tup(Dependence d, int32_t i) -> Tuple { IR::Addr *out = d.output(), *in = d.input(); if (out->getEdgeOut() >= 0) prevOut(ID{out->getEdgeOut()}) = i; if (in->getEdgeIn() >= 0) prevIn(ID{in->getEdgeIn()}) = i; @@ -615,10 +615,10 @@ class Dependencies { /// set(ID i, Dependence d) /// stores `d` at index `i` /// Dependence `d` is pushed to the fronts of the edgeOut and edgeIn chains. - constexpr void set(ptrdiff_t i, Dependence d) { datadeps[i] = tup(d, i); } + constexpr void set(int32_t i, Dependence d) { datadeps[i] = tup(d, i); } constexpr void set(ID i, Dependence d) { set(i.id, d); } auto addEdge(Dependence d) -> ID { - ptrdiff_t id{datadeps.size()}; + int32_t id{int32_t(datadeps.size())}; invariant(id >= 0); datadeps.push_back(tup(d, id)); return {int32_t(id)}; @@ -907,10 +907,10 @@ class Dependencies { constexpr auto inEdges() -> MutPtrVector { return datadeps.template get(); } - constexpr auto outEdges() const -> PtrVector { + [[nodiscard]] constexpr auto outEdges() const -> PtrVector { return datadeps.template get(); } - constexpr auto inEdges() const -> PtrVector { + [[nodiscard]] constexpr auto inEdges() const -> PtrVector { return datadeps.template get(); } // [[nodiscard]] constexpr auto outEdges() const -> PtrVector { From f440be1ec86925358a6308bba75a2689e7ce54ff Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Sun, 10 Dec 2023 20:18:38 -0500 Subject: [PATCH 084/112] further updates for Dependencies owning its memory --- include/LinearProgramming/LoopBlock.hpp | 39 ++++--- include/LinearProgramming/ScheduledNode.hpp | 118 ++++++++++---------- include/Optimize/CostModeling.hpp | 33 +++--- include/Optimize/Legality.hpp | 11 +- 4 files changed, 108 insertions(+), 93 deletions(-) diff --git a/include/LinearProgramming/LoopBlock.hpp b/include/LinearProgramming/LoopBlock.hpp index 6fc2a3664..6910b4322 100644 --- a/include/LinearProgramming/LoopBlock.hpp +++ b/include/LinearProgramming/LoopBlock.hpp @@ -137,8 +137,8 @@ class LoopBlock { // dict::map userToMem{}; // dict::set visited{}; // llvm::LoopInfo *LI; - IR::Dependencies deps; - alloc::OwningArena<> allocator{}; + IR::Dependencies &deps; + alloc::Arena<> &allocator; // we may turn off edges because we've exceeded its loop depth // or because the dependence has already been satisfied at an // earlier level. @@ -153,6 +153,9 @@ class LoopBlock { }; public: + constexpr LoopBlock(IR::Dependencies &deps_, alloc::Arena<> &allocator_) + : deps(deps_), allocator(allocator_) {} + struct OptimizationResult { IR::AddrChain addr; ScheduledNode *nodes; @@ -165,7 +168,6 @@ class LoopBlock { } }; - constexpr LoopBlock() = default; [[nodiscard]] auto optimize(IR::Cache &cache, IR::TreeResult tr) -> OptimizationResult { // first, we peel loops for which affine repr failed @@ -193,7 +195,11 @@ class LoopBlock { [[nodiscard]] constexpr auto getAllocator() -> Arena<> * { return &allocator; } - [[nodiscard]] constexpr auto getDependencies() const -> IR::Dependencies { + [[nodiscard]] constexpr auto getDependencies() -> IR::Dependencies & { + return deps; + } + [[nodiscard]] constexpr auto getDependencies() const + -> const IR::Dependencies & { return deps; } @@ -273,7 +279,7 @@ class LoopBlock { if (load.getParent() != nullptr) { Arena<> *alloc = cache.getAllocator(); IR::Addr *reload = ((Addr *)load)->reload(alloc); - deps.copyDependencies(alloc, load, reload); + deps.copyDependencies(load, reload); invariant(reload->isLoad()); load = reload; addr.addAddr(reload); @@ -506,9 +512,9 @@ class LoopBlock { return math::SVector{edge.getNumLambda(), edge.getDynSymDim(), edge.getNumConstraints(), 1}; } - static constexpr auto countAuxParamsAndConstraints(IR::Dependencies deps, - ScheduledNode *nodes, - int depth) + static constexpr auto + countAuxParamsAndConstraints(const IR::Dependencies &deps, + ScheduledNode *nodes, int depth) -> math::SVector { math::SVector params{}; assert(allZero(params)); @@ -522,8 +528,9 @@ class LoopBlock { using BackupSat = math::ResizeableView, ptrdiff_t>; using Backup = containers::Pair; - static constexpr auto - setScheduleMemoryOffsets(Dependencies deps, ScheduledNode *nodes, unsigned d) + static constexpr auto setScheduleMemoryOffsets(const Dependencies &deps, + ScheduledNode *nodes, + unsigned d) -> std::array { // C, lambdas, omegas, Phis unsigned numOmegaCoefs = 0, numPhiCoefs = 0, numSlack = 0; @@ -540,8 +547,8 @@ class LoopBlock { } return {numOmegaCoefs, numPhiCoefs, numSlack}; } - static constexpr auto calcCoefs(Dependencies deps, ScheduledNode *nodes, - int d) -> CoefCounts { + static constexpr auto calcCoefs(const Dependencies &deps, + ScheduledNode *nodes, int d) -> CoefCounts { auto [numOmegaCoefs, numPhiCoefs, numSlack] = setScheduleMemoryOffsets(deps, nodes, d); auto [numLambda, numBounding, numConstraints, numActiveEdges] = @@ -878,7 +885,7 @@ class LoopBlock { // Get a top sorting of SCC's; because we couldn't solve the graph // with these dependencies fused, we'll try splitting them. ScheduledNode *components = - graph::stronglyConnectedComponents(ScheduleGraph(d), node); + graph::stronglyConnectedComponents(ScheduleGraph(deps, d), node); if (components->getNextComponent() == nullptr) return {}; // components are sorted in topological order. // We split all of them, solve independently, @@ -1156,9 +1163,9 @@ class LoopBlock { }; inline auto operator<<(llvm::raw_ostream &os, - containers::Pair nodesdeps) + containers::Pair nodesdeps) -> llvm::raw_ostream & { - auto [nodes, deps] = nodesdeps; + const auto &[nodes, deps] = nodesdeps; os << "\nLoopBlock graph:\n"; size_t i = 0; for (ScheduledNode *v : nodes->getVertices()) { @@ -1170,7 +1177,7 @@ operator<<(llvm::raw_ostream &os, os << "\nLoopBlock Edges:"; for (ScheduledNode *inNode : nodes->getVertices()) { poly::AffineSchedule sin = inNode->getSchedule(); - for (Dependence edge : nodes->outputEdges(deps)) { + for (Dependence edge : nodes->outputEdges(*deps)) { os << "\n\n\tEdge = " << edge; ScheduledNode *outNode = edge.output()->getNode(); os << "Schedule In: s.getPhi() =" << sin.getPhi() diff --git a/include/LinearProgramming/ScheduledNode.hpp b/include/LinearProgramming/ScheduledNode.hpp index 80f31482d..c851f0d24 100644 --- a/include/LinearProgramming/ScheduledNode.hpp +++ b/include/LinearProgramming/ScheduledNode.hpp @@ -193,12 +193,12 @@ class ScheduledNode { } }; template struct Deps { - poly::Dependencies dep; + const poly::Dependencies *dep; constexpr auto operator()(int32_t id) const { if constexpr (Out) - return dep.outputEdgeIDs(id) | std::views::transform(OutNode{dep}); - else return dep.inputEdgeIDs(id) | std::views::transform(InNode{dep}); + return dep->outputEdgeIDs(id) | std::views::transform(OutNode{dep}); + else return dep->inputEdgeIDs(id) | std::views::transform(InNode{dep}); } constexpr auto operator()(IR::Addr *a) const { if constexpr (Out) return (*this)(a->getEdgeOut()); @@ -206,11 +206,11 @@ class ScheduledNode { } }; template struct DepIDs { - poly::Dependencies dep; + const poly::Dependencies *dep; constexpr auto operator()(int32_t id) const { - if constexpr (Out) return dep.outputEdgeIDs(id); - else return dep.inputEdgeIDs(id); + if constexpr (Out) return dep->outputEdgeIDs(id); + else return dep->inputEdgeIDs(id); } constexpr auto operator()(IR::Addr *a) const { if constexpr (Out) return (*this)(a->getEdgeOut()); @@ -218,15 +218,15 @@ class ScheduledNode { } }; template struct DepFilter { - poly::Dependencies dep; + const poly::Dependencies *dep; unsigned depth; constexpr auto operator()(int32_t id) const { if constexpr (Out) - return dep.outputEdgeIDs(id) | dep.activeFilter(depth) | + return dep->outputEdgeIDs(id) | dep->activeFilter(depth) | std::views::transform(OutNode{dep}); else - return dep.inputEdgeIDs(id) | dep.activeFilter(depth) | + return dep->inputEdgeIDs(id) | dep->activeFilter(depth) | std::views::transform(InNode{dep}); } constexpr auto operator()(IR::Addr *a) const { @@ -237,31 +237,31 @@ class ScheduledNode { // all nodes that are memory inputs to this one; i.e. all parents // NOTE: we may reach each node multiple times - [[nodiscard]] inline auto inNeighbors(IR::Dependencies dep) { + [[nodiscard]] inline auto inNeighbors(const IR::Dependencies &dep) { return utils::NestedList{utils::ListRange{store, NextAddr{}}, - Deps{dep}}; + Deps{&dep}}; } // all nodes that are memory inputs to this one; i.e. all parents // NOTE: we may reach each node multiple times // all nodes that are memory outputs of this one; i.e. all children // NOTE: we may reach each node multiple times - [[nodiscard]] inline auto outNeighbors(IR::Dependencies dep) { + [[nodiscard]] inline auto outNeighbors(const IR::Dependencies &dep) { return utils::NestedList{utils::ListRange{store, NextAddr{}}, - Deps{dep}}; + Deps{&dep}}; } - [[nodiscard]] inline auto inputEdgeIds(IR::Dependencies dep) const { + [[nodiscard]] inline auto inputEdgeIds(const IR::Dependencies &dep) const { return utils::NestedList{utils::ListRange{store, NextAddr{}}, - DepIDs{dep}}; + DepIDs{&dep}}; } - [[nodiscard]] inline auto outputEdgeIds(IR::Dependencies dep) const { + [[nodiscard]] inline auto outputEdgeIds(const IR::Dependencies &dep) const { return utils::NestedList{utils::ListRange{store, NextAddr{}}, - DepIDs{dep}}; + DepIDs{&dep}}; } - [[nodiscard]] inline auto inputEdgeIds(IR::Dependencies dep, + [[nodiscard]] inline auto inputEdgeIds(const IR::Dependencies &dep, int depth) const { static_assert(std::forward_iterator< - decltype(DepIDs{dep}((IR::Addr *)nullptr).begin())>); + decltype(DepIDs{&dep}((IR::Addr *)nullptr).begin())>); static_assert(std::forward_iterator); static_assert(std::forward_iterator); @@ -276,83 +276,82 @@ class ScheduledNode { return outputEdgeIds(dep) | dep.activeFilter(depth); } - [[nodiscard]] inline auto inputEdges(IR::Dependencies dep) { + [[nodiscard]] inline auto inputEdges(const IR::Dependencies &dep) { return utils::NestedList{ utils::ListRange{store, NextAddr{}, [](Addr *a) -> int32_t { return a->getEdgeIn(); }}, - [=](int32_t id) { + [&](int32_t id) { return dep.inputEdgeIDs(id) | - std::views::transform([=](int32_t i) -> Dependence { - IR::Dependencies d2 = dep; - return d2.get(Dependence::ID{i}); + std::views::transform([&](int32_t i) -> Dependence { + return dep.get(Dependence::ID{i}); }); }}; } - [[nodiscard]] inline auto outputEdges(IR::Dependencies dep) { + [[nodiscard]] inline auto outputEdges(const IR::Dependencies &dep) { return utils::NestedList{ utils::ListRange{store, NextAddr{}, [](Addr *a) -> int32_t { return a->getEdgeOut(); }}, - [=](int32_t id) { + [&](int32_t id) { return dep.outputEdgeIDs(id) | - std::views::transform([=](int32_t i) -> Dependence { - IR::Dependencies d2 = dep; - return d2.get(Dependence::ID{i}); + std::views::transform([&](int32_t i) -> Dependence { + return dep.get(Dependence::ID{i}); }); }}; } - [[nodiscard]] inline auto inputEdges(IR::Dependencies dep, int depth) { + [[nodiscard]] inline auto inputEdges(const IR::Dependencies &dep, int depth) { return utils::NestedList{ utils::ListRange{store, NextAddr{}, [](Addr *a) -> int32_t { return a->getEdgeIn(); }}, - [=](int32_t id) { + [&](int32_t id) { return dep.inputEdgeIDs(id) | dep.activeFilter(depth) | - std::views::transform([=](int32_t i) -> Dependence { - IR::Dependencies d2 = dep; - return d2.get(Dependence::ID{i}); + std::views::transform([&](int32_t i) -> Dependence { + return dep.get(Dependence::ID{i}); }); }}; } - [[nodiscard]] inline auto outputEdges(IR::Dependencies dep, int depth) { + [[nodiscard]] inline auto outputEdges(const IR::Dependencies &dep, + int depth) { return utils::NestedList{ utils::ListRange{store, NextAddr{}, [](Addr *a) -> int32_t { return a->getEdgeOut(); }}, - [=](int32_t id) { + [&](int32_t id) { return dep.outputEdgeIDs(id) | dep.activeFilter(depth) | - std::views::transform([=](int32_t i) -> Dependence { - IR::Dependencies d2 = dep; - return d2.get(Dependence::ID{i}); + std::views::transform([&](int32_t i) -> Dependence { + return dep.get(Dependence::ID{i}); }); }}; } struct InNode { - poly::Dependencies dep; - constexpr auto operator()(int32_t id) -> ScheduledNode * { - return dep.input(Dependence::ID{id})->getNode(); + const poly::Dependencies *dep; + constexpr auto operator()(int32_t id) const -> ScheduledNode * { + return dep->input(Dependence::ID{id})->getNode(); } }; struct OutNode { - poly::Dependencies dep; - constexpr auto operator()(int32_t id) -> ScheduledNode * { - return dep.output(Dependence::ID{id})->getNode(); + const poly::Dependencies *dep; + constexpr auto operator()(int32_t id) const -> ScheduledNode * { + return dep->output(Dependence::ID{id})->getNode(); } }; - [[nodiscard]] inline auto outNeighbors(IR::Dependencies dep, unsigned depth) { + [[nodiscard]] inline auto outNeighbors(const IR::Dependencies &dep, + unsigned depth) { return utils::NestedList{ utils::ListRange{store, NextAddr{}, GetEdge{}}, - DepFilter{dep, depth}}; + DepFilter{&dep, depth}}; } - [[nodiscard]] inline auto inNeighbors(IR::Dependencies dep, unsigned depth) { + [[nodiscard]] inline auto inNeighbors(const IR::Dependencies &dep, + unsigned depth) { return utils::NestedList{ utils::ListRange{store, NextAddr{}, GetEdge{}}, - DepFilter{dep, depth}}; + DepFilter{&dep, depth}}; } - [[nodiscard]] inline auto hasActiveEdges(IR::Dependencies dep, + [[nodiscard]] inline auto hasActiveEdges(const IR::Dependencies &dep, unsigned depth) const -> bool { - const auto f = [=](int32_t d) { + const auto f = [&](int32_t d) { return !dep.isSat(Dependence::ID{d}, depth); }; return std::ranges::any_of(inputEdgeIds(dep), f) || @@ -483,12 +482,13 @@ static_assert(std::is_trivially_destructible_v); static_assert(sizeof(ScheduledNode) <= 64); // fits in cache line class ScheduleGraph { - IR::Dependencies deps; + const IR::Dependencies &deps; unsigned depth_; public: using VertexType = ScheduledNode; - constexpr ScheduleGraph(unsigned depth) : depth_(depth) {} + constexpr ScheduleGraph(const IR::Dependencies &deps_, unsigned depth) + : deps(deps_), depth_(depth) {} [[nodiscard]] static constexpr auto getVertices(ScheduledNode *nodes) -> utils::ListRange { @@ -510,10 +510,14 @@ class ScheduleGraph { namespace graph { // static_assert(AbstractPtrGraph); -static_assert(std::forward_iterator< - decltype(lp::ScheduleGraph{0}.outNeighbors(nullptr).begin())>); -static_assert(std::forward_iterator< - decltype(lp::ScheduleGraph{0}.inNeighbors(nullptr).begin())>); +static_assert(std::forward_iterator(), 0} + .outNeighbors(nullptr) + .begin())>); +static_assert(std::forward_iterator(), 0} + .inNeighbors(nullptr) + .begin())>); static_assert(AbstractPtrGraph); } // namespace graph } // namespace poly diff --git a/include/Optimize/CostModeling.hpp b/include/Optimize/CostModeling.hpp index 476458c4c..11a8daf14 100644 --- a/include/Optimize/CostModeling.hpp +++ b/include/Optimize/CostModeling.hpp @@ -61,7 +61,8 @@ namespace poly::IR { /// `x[i] = acc` are top sorted. The load `acc = x[i]` should be the very /// first output topologically -- afterall, it occus before the store!! /// TODO: does `Addr` hoisting handle this?? -constexpr inline void Addr::maybeReassociableReduction(Dependencies deps) { +constexpr inline void +Addr::maybeReassociableReduction(const Dependencies &deps) { if (isLoad()) return; // we should have a store whose first output edge is the load for // the following iteration. This iter is the reverse-time @@ -193,8 +194,8 @@ struct LoopIndependent { /// loop independent. We use the `bool` rather than a `nullptr` or optional so /// that we can still return those results we did find on failure. /// NOLINTNEXTLINE(misc-no-recursion) -inline auto searchLoopIndependentUsers(IR::Dependencies deps, IR::Loop *L, - IR::Node *N, int depth, +inline auto searchLoopIndependentUsers(const IR::Dependencies &deps, + IR::Loop *L, IR::Node *N, int depth, LoopDepSummary summary) -> LoopIndependent { if (N->dependsOnParentLoop()) return {summary, false}; @@ -239,9 +240,9 @@ inline auto searchLoopIndependentUsers(IR::Dependencies deps, IR::Loop *L, /// `R`: remove from loop, if not `nullptr`, set the parent of `N` to `R` /// `R` is applied recursivvely, forwarded to all calls. // NOLINTNEXTLINE(misc-no-recursion) -inline auto visitLoopDependent(IR::Dependencies deps, IR::Loop *L, IR::Node *N, - int depth, IR::Node *body, IR::Loop *R = nullptr) - -> IR::Node * { +inline auto visitLoopDependent(const IR::Dependencies &deps, IR::Loop *L, + IR::Node *N, int depth, IR::Node *body, + IR::Loop *R = nullptr) -> IR::Node * { invariant(N->getVisitDepth() != 254); // N may have been visited as a dependent of an inner loop, which is why // `visited` accepts a depth argument @@ -332,7 +333,7 @@ inline auto visitLoopDependent(IR::Dependencies deps, IR::Loop *L, IR::Node *N, if (R) hoist(N, R, depth - 1); return body; } -inline void addBody(IR::Dependencies deps, IR::Loop *root, int depth, +inline void addBody(const IR::Dependencies &deps, IR::Loop *root, int depth, IR::Node *nodes) { IR::Exit exit{}; // use to capture last node IR::Node *body{&exit}; @@ -343,7 +344,8 @@ inline void addBody(IR::Dependencies deps, IR::Loop *root, int depth, if (last) last->setNext(nullptr); root->setLast(last); } -inline void topologicalSort(IR::Dependencies deps, IR::Loop *root, int depth) { +inline void topologicalSort(const IR::Dependencies &deps, IR::Loop *root, + int depth) { // basic plan for the top sort: // We iterate across all users, once all of node's users have been added, // we push it to the front of the list. Thus, we get a top-sorted list. @@ -383,8 +385,8 @@ inline void topologicalSort(IR::Dependencies deps, IR::Loop *root, int depth) { body = visitLoopDependent(deps, root, N, depth, body, P); } // NOLINTNEXTLINE(misc-no-recursion) -inline auto buildSubGraph(IR::Dependencies deps, IR::Loop *root, int depth, - uint32_t id) -> uint32_t { +inline auto buildSubGraph(const IR::Dependencies &deps, IR::Loop *root, + int depth, uint32_t id) -> uint32_t { // We build the instruction graph, via traversing the tree, and then // top sorting as we recurse out for (IR::Loop *child : root->subLoops()) @@ -396,7 +398,8 @@ inline auto buildSubGraph(IR::Dependencies deps, IR::Loop *root, int depth, topologicalSort(deps, root, depth); return id; } -inline auto buildGraph(IR::Dependencies deps, IR::Loop *root) -> uint32_t { +inline auto buildGraph(const IR::Dependencies &deps, IR::Loop *root) + -> uint32_t { // We build the instruction graph, via traversing the tree, and then // top sorting as we recurse out uint32_t id = 0; @@ -445,7 +448,7 @@ inline auto hasFutureReads(Arena<> *alloc, dict::set &LBBs, } struct LoopDepSatisfaction { - IR::Dependencies deps; + IR::Dependencies &deps; MutPtrVector loopDeps; constexpr auto dependencyIDs(IR::Loop *L) { @@ -457,7 +460,7 @@ struct LoopDepSatisfaction { }; class IROptimizer { - IR::Dependencies deps; + IR::Dependencies &deps; IR::Cache &instructions; dict::set &LBBs; dict::set &eraseCandidates; @@ -474,7 +477,7 @@ class IROptimizer { /// to depencencies handled at that level. /// We can use these dependencies for searching reductions for /// trying to prove legality. - static auto loopDepSats(Arena<> *alloc, IR::Dependencies deps, + static auto loopDepSats(Arena<> *alloc, IR::Dependencies &deps, lp::LoopBlock::OptimizationResult res) -> MutPtrVector { MutPtrVector loopDeps{math::vector(alloc, deps.size())}; @@ -669,7 +672,7 @@ class IROptimizer { }; public: - IROptimizer(IR::Dependencies deps, IR::Cache &instr, + IROptimizer(IR::Dependencies &deps, IR::Cache &instr, dict::set &loopBBs, dict::set &eraseCandidates_, IR::Loop *root, Arena<> *lalloc, lp::LoopBlock::OptimizationResult res, diff --git a/include/Optimize/Legality.hpp b/include/Optimize/Legality.hpp index 73402220c..bcf73fef2 100644 --- a/include/Optimize/Legality.hpp +++ b/include/Optimize/Legality.hpp @@ -126,14 +126,14 @@ struct Legality { } constexpr Legality() = default; constexpr Legality(const Legality &) = default; - static auto deeperAccess(poly::Dependencies deps, IR::Loop *L, IR::Addr *in) - -> bool { - return std::ranges::any_of(in->outputEdgeIDs(deps), [=](int32_t id) { + static auto deeperAccess(const poly::Dependencies &deps, IR::Loop *L, + IR::Addr *in) -> bool { + return std::ranges::any_of(in->outputEdgeIDs(deps), [&](int32_t id) { IR::Addr *a = deps.output(Dependence::ID{id}); return (a->getLoop() != L) && L->contains(a); }); } - void update(poly::Dependencies deps, IR::Loop *L, Dependence d) { + void update(poly::Dependencies &deps, IR::Loop *L, Dependence d) { IR::Addr *in = d.out, *out = d.in; if (d.revTimeEdge() && (in->reassociableReductionPair() != out)) { ++unordered_reduction_count; @@ -157,7 +157,8 @@ struct Legality { // then we have a dependence } }; - Legality(LoopDepSatisfaction deps, IR::Loop *L) { + + Legality(LoopDepSatisfaction &deps, IR::Loop *L) { for (poly::Dependence d : deps.depencencies(L)) update(deps.deps, L, d); } }; From 1204592c2f0ce0996d1109083087661b217839ce Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Wed, 20 Dec 2023 06:23:35 -0500 Subject: [PATCH 085/112] negligible --- include/IR/Node.hpp | 2 ++ include/Polyhedra/Dependence.hpp | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index b035ea695..c62ed3076 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -287,6 +287,8 @@ static_assert(sizeof(Node) == 4 * sizeof(Node *) + 8); /// last is the last instruction in the body /// exit is the associated exit block class Loop : public Node { + // TOOD: this is to be replaced with + // the `Legality` struct enum LegalTransforms { Unknown = 0, DependenceFree = 1, diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 0fec09075..f1452587f 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -65,7 +65,7 @@ struct Dependence { constexpr auto getSimplexPair() -> std::array, 2> { return {dependenceSatisfaction, dependenceBounding}; } - constexpr auto getMeta() const -> uint8_t { return meta; } + [[nodiscard]] constexpr auto getMeta() const -> uint8_t { return meta; } // public: friend class Dependencies; @@ -170,6 +170,8 @@ struct Dependence { return in->getArrayPointer(); } /// indicates whether forward is non-empty + /// Direction in simplex [x,y]: Forward ? x -> y : y -> x + /// i.e., is the simplex `[in, out]` (forward) or `[out, in]` (!forward) [[nodiscard]] constexpr auto isForward() const -> bool { return meta & 1; } [[nodiscard]] constexpr auto nodeIn() const -> const lp::ScheduledNode * { return in->getNode(); From 90aabbf465068a828226e36c4d0f2f4bcd007732 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Mon, 15 Jan 2024 23:50:41 -0500 Subject: [PATCH 086/112] write some comments --- include/IR/Address.hpp | 2 ++ include/Optimize/CostModeling.hpp | 25 ++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/include/IR/Address.hpp b/include/IR/Address.hpp index fe9401a92..23155e434 100644 --- a/include/IR/Address.hpp +++ b/include/IR/Address.hpp @@ -185,6 +185,8 @@ class Addr : public Instruction { numLoops), basePointer(arrayPtr), instr(user){}; + /// This gets called to rotate so that we can make direct comparisons down the + /// road without needing rotations. constexpr void rotate(Valid explicitLoop, SquarePtrMatrix Pinv, int64_t denom, PtrVector omega, int64_t *offsets) { diff --git a/include/Optimize/CostModeling.hpp b/include/Optimize/CostModeling.hpp index 11a8daf14..dcc6cb97b 100644 --- a/include/Optimize/CostModeling.hpp +++ b/include/Optimize/CostModeling.hpp @@ -1,4 +1,3 @@ - #pragma once #include "Dicts/BumpMapSet.hpp" @@ -784,6 +783,30 @@ class IROptimizer { // In this example, note that the region `j_1 > i^0_s+3` is empty // so we have one parallel region, and then one serial region. // +// Lets consider simpler checks. We have +// [ 1 0 ] : x[i] -= +// [ 0 1 ] : x[j] +// [ 1 ] : x[i] /= +// we have a dependency when `i == j`. `i` carries the dependency, but we can +// peel off the independent iters from `j`, and unroll `i` for these. +// +// How to identify: +// [ 1 -1 ] +// vs, if we had two `x[i]` or two `x[j]` +// [ 0, 0 ] +// An idea: look for non-zero so we can peel? +// Or should we look specifically for `x[i] == x[j]` type pattern? +// E.g., if we had +// [ i, j, k, l ] +// [ 2, -1, 2, -1 ] +// we'd need a splitting algorithm. +// E.g., split on the 2nd loop, so we get `j == 2*i + 2*k - l` +// With this, we'd split iterations into groups +// j < 2*i + 2*k - l +// j == 2*i + 2*k - l +// j > 2*i + 2*k - l +// Subsetting the `k` and `l` iteration spaces may be a little annoying, +// so we may initially want to restrict ourselves to peeling the innermost loop. /// /// Optimize the schedule inline void optimize(IR::Dependencies deps, IR::Cache &instr, From 4bea580842877b9b4af0e0c58d3d9469679c5a00 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Sat, 20 Jan 2024 01:02:41 -0500 Subject: [PATCH 087/112] assert->invariant, size->shape --- include/Optimize/Legality.hpp | 12 ++++++++---- include/Polyhedra/Comparators.hpp | 29 ++++++++++++++--------------- include/Polyhedra/Loops.hpp | 2 +- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/include/Optimize/Legality.hpp b/include/Optimize/Legality.hpp index bcf73fef2..93ed9f930 100644 --- a/include/Optimize/Legality.hpp +++ b/include/Optimize/Legality.hpp @@ -126,14 +126,18 @@ struct Legality { } constexpr Legality() = default; constexpr Legality(const Legality &) = default; + // deeperAccess(const poly::Dependencies &deps, IR::Loop *L, IR::Addr *in) + // are any of the outputs of `in` in a subloop of `L` static auto deeperAccess(const poly::Dependencies &deps, IR::Loop *L, IR::Addr *in) -> bool { - return std::ranges::any_of(in->outputEdgeIDs(deps), [&](int32_t id) { - IR::Addr *a = deps.output(Dependence::ID{id}); - return (a->getLoop() != L) && L->contains(a); - }); + return std::ranges::any_of(in->outputEdgeIDs(deps), + [&](int32_t id) -> bool { + IR::Addr *a = deps.output(Dependence::ID{id}); + return (a->getLoop() != L) && L->contains(a); + }); } void update(poly::Dependencies &deps, IR::Loop *L, Dependence d) { + // note: the dependence hasn't been rotated IR::Addr *in = d.out, *out = d.in; if (d.revTimeEdge() && (in->reassociableReductionPair() != out)) { ++unordered_reduction_count; diff --git a/include/Polyhedra/Comparators.hpp b/include/Polyhedra/Comparators.hpp index 5b37b878b..306d64033 100644 --- a/include/Polyhedra/Comparators.hpp +++ b/include/Polyhedra/Comparators.hpp @@ -13,7 +13,6 @@ #include #include #include -#include #include #include @@ -126,9 +125,9 @@ template struct BaseComparator { PtrVector y) const -> bool { const ptrdiff_t N = getNumConstTerms(); - assert(delta.size() >= N); - assert(x.size() >= N); - assert(y.size() >= N); + invariant(delta.size() >= N); + invariant(x.size() >= N); + invariant(y.size() >= N); for (ptrdiff_t n = 0; n < N; ++n) delta[n] = x[n] - y[n]; return static_cast(this)->greaterEqual(delta); } @@ -145,8 +144,8 @@ template struct BaseComparator { [[nodiscard]] constexpr auto greater(PtrVector x, PtrVector y) const -> bool { const ptrdiff_t N = getNumConstTerms(); - assert(N <= x.size()); - assert(N <= y.size()); + invariant(N <= x.size()); + invariant(N <= y.size()); Vector delta(N); for (ptrdiff_t n = 0; n < N; ++n) delta[n] = x[n] - y[n]; --delta[0]; @@ -170,7 +169,7 @@ template struct BaseComparator { [[nodiscard]] constexpr auto lessEqual(MutPtrVector x) const -> bool { const ptrdiff_t N = getNumConstTerms(); - assert(N <= x.size()); + invariant(N <= x.size()); for (ptrdiff_t n = 0; n < N; ++n) x[n] *= -1; bool ret = static_cast(this)->greaterEqual(x); for (ptrdiff_t n = 0; n < N; ++n) x[n] *= -1; @@ -178,7 +177,7 @@ template struct BaseComparator { } [[nodiscard]] constexpr auto lessEqual(PtrVector x) const -> bool { const ptrdiff_t N = getNumConstTerms(); - assert(N <= x.size()); + invariant(N <= x.size()); Vector y{x[_(0, N)]}; return lessEqual(y); } @@ -193,13 +192,13 @@ template struct BaseComparator { [[nodiscard]] constexpr auto lessEqual(PtrVector x, int64_t y) const -> bool { const ptrdiff_t N = getNumConstTerms(); - assert(N <= x.size()); + invariant(N <= x.size()); Vector z{x[_(0, N)]}; return lessEqual(z, y); } [[nodiscard]] constexpr auto less(MutPtrVector x) const -> bool { const ptrdiff_t N = getNumConstTerms(); - assert(N <= x.size()); + invariant(N <= x.size()); int64_t x0 = x[0]; x[0] = -x0 - 1; for (ptrdiff_t i = 1; i < N; ++i) x[i] *= -1; @@ -210,7 +209,7 @@ template struct BaseComparator { } [[nodiscard]] constexpr auto less(PtrVector x) const -> bool { const ptrdiff_t N = getNumConstTerms(); - assert(N <= x.size()); + invariant(N <= x.size()); Vector y{x[_(0, N)]}; return less(y); } @@ -223,7 +222,7 @@ template struct BaseComparator { [[nodiscard]] constexpr auto greater(PtrVector x) const -> bool { // TODO: avoid this needless memcopy and (possible) allocation? const ptrdiff_t N = getNumConstTerms(); - assert(N <= x.size()); + invariant(N <= x.size()); Vector xm{x[_(0, N)]}; return greater(math::view(xm)); } @@ -237,8 +236,8 @@ template struct BaseComparator { PtrVector y) const -> bool { const ptrdiff_t N = getNumConstTerms(); - assert(x.size() >= N); - assert(y.size() >= N); + invariant(x.size() >= N); + invariant(y.size() >= N); if (x[_(0, N)] == y[_(0, N)]) return true; Vector delta{x[_(0, N)] - y[_(0, N)]}; return equal(delta); @@ -836,7 +835,7 @@ constexpr void moveEqualities(DenseMatrix &, EmptyMatrix, constexpr void moveEqualities(DenseMatrix &A, math::IntMatrix<> &E, const Comparator auto &C) { const ptrdiff_t numVar = ptrdiff_t(E.numCol()); - assert(A.numCol() == numVar); + invariant(A.numCol() == numVar); if (A.numRow() <= 1) return; for (ptrdiff_t o = ptrdiff_t(A.numRow()) - 1; o > 0;) { for (ptrdiff_t i = o--; i < A.numRow(); ++i) { diff --git a/include/Polyhedra/Loops.hpp b/include/Polyhedra/Loops.hpp index 86e85da2b..7c681d9a6 100644 --- a/include/Polyhedra/Loops.hpp +++ b/include/Polyhedra/Loops.hpp @@ -468,7 +468,7 @@ class Loop : public BasePolyhedra { invariant(ptrdiff_t(R.numCol()), getNumLoops()); invariant(ptrdiff_t(R.numRow()), getNumLoops()); auto A{getA()}; - const auto [M, N] = A.size(); + const auto [M, N] = shape(A); auto syms{getSyms()}; Valid aln{Loop::allocate(alloc, L, ptrdiff_t(M) + numExtraVar, numLoops, syms, nonNeg)}; From 3c93baae8857a5ee70e7ada007a1a6c0a2721b56 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Sat, 20 Jan 2024 13:42:07 -0500 Subject: [PATCH 088/112] minor progress, starting to write calcReorderability --- include/Polyhedra/Dependence.hpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index f1452587f..f74a2baaa 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -1099,6 +1099,10 @@ class Dependencies { }; return std::views::filter(f); } + /// NOTE: this method uses `in` and `out` to check for reorderability, as + /// these get rotated after the simplex solve, while the stored `DepPoly` and + /// simplices do not. + inline void calcReorderability(IR::Loop *, int32_t); }; } // namespace poly @@ -1202,6 +1206,33 @@ inline void Dependencies::copyDependencies(IR::Addr *src, IR::Addr *dst) { } } +inline void Dependencies::calcReorderability(IR::Loop *L, int32_t id) { + IR::Addr *in = input(Dependence::ID{id}), *out = output(Dependence::ID{id}); + // clang-format off + // If we have a dependency nested inside `L`, we won't be able to reorder if either + // a) that dependency's output is `in` + // b) that dependency's input is `out` + // as we'd then have to maintain the order of this loop level's evaluations with respect + // to the subloop. + // Otherwise, we check + // 1. If this dependency may be peeled. For this, it must + // a) be indexed by both `L` and a subloop of `L`. + // b) have an equality relation, so that it occurs for a single iteration fo the subloop. + // Then, we can split the subloop across this value, scalarizing around it. + // 2. Is this dependency reassociable? E.g., if it's connected by reassociable adds + // (such as integer adds, or floating point with the reassociable FMF), then mark it as such. + // clang-format on + bool inDepends = + std::ranges::any_of(in->inputEdgeIDs(*this), [&](int32_t i) -> bool { + IR::Addr *a = input(Dependence::ID{i}); + return (a->getLoop() != L) && L->contains(a); + }); + bool outDepended = + std::ranges::any_of(out->outputEdgeIDs(*this), [&](int32_t i) -> bool { + IR::Addr *a = output(Dependence::ID{i}); + return (a->getLoop() != L) && L->contains(a); + }); +} } // namespace poly } // namespace poly From bcc7eeeee6738676b0b1a86e302361d139850489 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Sat, 20 Jan 2024 14:01:27 -0500 Subject: [PATCH 089/112] merged --- include/Optimize/CostModeling.hpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/Optimize/CostModeling.hpp b/include/Optimize/CostModeling.hpp index dcc6cb97b..99bddee9f 100644 --- a/include/Optimize/CostModeling.hpp +++ b/include/Optimize/CostModeling.hpp @@ -717,17 +717,23 @@ class IROptimizer { // x[i+2] -= x[j]*U[j,i+2]; // x[i+3] -= x[j]*U[j,i+3]; // } +// // j+1 iteration for i=i iter goes here (but doesn't happen) // x[i+1] /= U[i+1,i+1]; // store 1 // { // perform unrolled j = i + 1 iter // int j = i+1; // these all depend on store 1 // x[i+2] -= x[j]*U[j,i+2]; // x[i+3] -= x[j]*U[j,i+3]; // } +// // j+2 iteration for i=i iter goes here (but doesn't happen) +// // j+2 iteration for i=i+1 iter goes here (but doesn't happen) // x[i+2] /= U[i+2,i+2]; // store 2 // { // perform unrolled j = i + 2 iter // int j = i+2; // this depends on store 2 // x[i+3] -= x[j]*U[j,i+3]; // } +// // j+3 iteration for i=i iter goes here (but doesn't happen) +// // j+3 iteration for i=i+1 iter goes here (but doesn't happen) +// // j+3 iteration for i=i+2 iter goes here (but doesn't happen) // x[i+3] /= U[i+3,i+3]; // } // The key to legality here is that we peel off the dependence polyhedra From aaa330e703bb1f9b9c8a833d0a48612c7d209bcb Mon Sep 17 00:00:00 2001 From: Yingbo Ma Date: Sat, 20 Jan 2024 21:05:08 -0500 Subject: [PATCH 090/112] Initialize InlineTrie and add compile_commands to gitignore --- .gitignore | 3 ++- include/Dicts/Trie.hpp | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 5461dd8e0..f5a066a46 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,5 @@ latex/ html/ coverage.* coverage-final.json -Testing \ No newline at end of file +Testing +compile_commands.json diff --git a/include/Dicts/Trie.hpp b/include/Dicts/Trie.hpp index 62ff99b1d..8c3f2e1f8 100644 --- a/include/Dicts/Trie.hpp +++ b/include/Dicts/Trie.hpp @@ -133,9 +133,9 @@ static_assert(sizeof(TrieMap) == // extra space. E.g., `sizeof(utils::Optional) == sizeof(T*)`, as `nullptr` // indicates empty. template struct InlineTrie { - InlineTrie *children[4]; - utils::Optional keys[4]; - V values[4]; + InlineTrie *children[4]{}; + utils::Optional keys[4]{}; + V values[4]{}; // Returns an optional pointer to the value. constexpr auto find(const K &k) -> utils::Optional { From d650bcb2f1d3a10030c3c5bea15549802aa2a471 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Sun, 21 Jan 2024 22:03:11 -0500 Subject: [PATCH 091/112] minor progress --- include/IR/Address.hpp | 6 +++-- include/Polyhedra/Dependence.hpp | 44 ++++++++++++++++++++++---------- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/include/IR/Address.hpp b/include/IR/Address.hpp index 23155e434..b353e5279 100644 --- a/include/IR/Address.hpp +++ b/include/IR/Address.hpp @@ -314,8 +314,10 @@ class Addr : public Instruction { [[nodiscard]] inline auto outputEdges(const Dependencies &) const; [[nodiscard]] inline auto inputEdges(const Dependencies &, int depth) const; [[nodiscard]] inline auto outputEdges(const Dependencies &, int depth) const; - [[nodiscard]] inline auto inputEdgeIDs(const Dependencies &) const; - [[nodiscard]] inline auto outputEdgeIDs(const Dependencies &) const; + [[nodiscard]] inline auto inputEdgeIDs(const Dependencies &) const + -> utils::VForwardRange; + [[nodiscard]] inline auto outputEdgeIDs(const Dependencies &) const + -> utils::VForwardRange; [[nodiscard]] inline auto inputEdgeIDs(const Dependencies &, int depth) const; [[nodiscard]] inline auto outputEdgeIDs(const Dependencies &, int depth) const; diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index f74a2baaa..27cbdf1b8 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -875,6 +875,21 @@ class Dependencies { }; } + inline auto anyInteriorDependents(IR::Loop *L, IR::Addr *out) -> bool { + return std::ranges::any_of(out->outputEdgeIDs(*this), + [&](int32_t i) -> bool { + IR::Addr *a = output(Dependence::ID{i}); + return (a->getLoop() != L) && L->contains(a); + }); + } + + inline auto anyInteriorDependencies(IR::Loop *L, IR::Addr *in) -> bool { + + return std::ranges::any_of(in->inputEdgeIDs(*this), [&](int32_t i) -> bool { + IR::Addr *a = input(Dependence::ID{i}); + return (a->getLoop() != L) && L->contains(a); + }); + } public: constexpr void removeEdge(ID id) { @@ -1102,7 +1117,7 @@ class Dependencies { /// NOTE: this method uses `in` and `out` to check for reorderability, as /// these get rotated after the simplex solve, while the stored `DepPoly` and /// simplices do not. - inline void calcReorderability(IR::Loop *, int32_t); + inline auto calcReorderability(IR::Loop *, int32_t) -> bool; }; } // namespace poly @@ -1115,10 +1130,12 @@ inline auto Addr::inputEdges(const Dependencies &deps) const { inline auto Addr::outputEdges(const Dependencies &deps) const { return deps.outputEdges(getEdgeOut()); } -inline auto Addr::inputEdgeIDs(const Dependencies &deps) const { +inline auto Addr::inputEdgeIDs(const Dependencies &deps) const + -> utils::VForwardRange { return deps.inputEdgeIDs(getEdgeIn()); } -inline auto Addr::outputEdgeIDs(const Dependencies &deps) const { +inline auto Addr::outputEdgeIDs(const Dependencies &deps) const + -> utils::VForwardRange { return deps.outputEdgeIDs(getEdgeOut()); } inline auto Addr::inputEdgeIDs(const Dependencies &deps, int depth) const { @@ -1206,7 +1223,7 @@ inline void Dependencies::copyDependencies(IR::Addr *src, IR::Addr *dst) { } } -inline void Dependencies::calcReorderability(IR::Loop *L, int32_t id) { +inline auto Dependencies::calcReorderability(IR::Loop *L, int32_t id) -> bool { IR::Addr *in = input(Dependence::ID{id}), *out = output(Dependence::ID{id}); // clang-format off // If we have a dependency nested inside `L`, we won't be able to reorder if either @@ -1222,16 +1239,15 @@ inline void Dependencies::calcReorderability(IR::Loop *L, int32_t id) { // 2. Is this dependency reassociable? E.g., if it's connected by reassociable adds // (such as integer adds, or floating point with the reassociable FMF), then mark it as such. // clang-format on - bool inDepends = - std::ranges::any_of(in->inputEdgeIDs(*this), [&](int32_t i) -> bool { - IR::Addr *a = input(Dependence::ID{i}); - return (a->getLoop() != L) && L->contains(a); - }); - bool outDepended = - std::ranges::any_of(out->outputEdgeIDs(*this), [&](int32_t i) -> bool { - IR::Addr *a = output(Dependence::ID{i}); - return (a->getLoop() != L) && L->contains(a); - }); + if (anyInteriorDependencies(L, in) || anyInteriorDependents(L, out)) + return false; + // no inner dependence + PtrMatrix inInd = in->indexMatrix(), outInd = out->indexMatrix(); + invariant(inInd.numRow(),outInd.numRow()); + ptrdiff_t d = L->getCurrentDepth(); + invariant(inInd.numRow()>= d); + // if (ind + return true; } } // namespace poly From 46a87661d7eacfc6e2dc407a9718a49299b240ef Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Sun, 21 Jan 2024 22:04:51 -0500 Subject: [PATCH 092/112] format and remove dead file --- .../include/constraint_pruning_benchmark.hpp | 9 +- benchmark/include/matrix_exp.hpp | 13 +- include/Dicts/BumpMapSet.hpp | 2 +- include/Dicts/BumpVector.hpp | 2 +- include/Graphs/Graphs.hpp | 2 +- .../Optimize/OptimizationPossibilities.hpp | 651 ------------------ include/Polyhedra/Dependence.hpp | 4 +- include/TurboLoop.hpp | 3 +- test/bumpmap_test.cpp | 5 +- test/dict_test.cpp | 1 - 10 files changed, 21 insertions(+), 671 deletions(-) delete mode 100644 include/Optimize/OptimizationPossibilities.hpp diff --git a/benchmark/include/constraint_pruning_benchmark.hpp b/benchmark/include/constraint_pruning_benchmark.hpp index 2205885df..e2a2a0493 100644 --- a/benchmark/include/constraint_pruning_benchmark.hpp +++ b/benchmark/include/constraint_pruning_benchmark.hpp @@ -7,8 +7,9 @@ #include #include -using poly::math::Vector,poly::math::IntMatrix, poly::math::Row, poly::math::Col, - poly::math::DenseDims, poly::math::_, poly::utils::operator""_mat; +using poly::math::Vector, poly::math::IntMatrix, poly::math::Row, + poly::math::Col, poly::math::DenseDims, poly::math::_, + poly::utils::operator""_mat; static void BM_NullSpace(benchmark::State &state) { IntMatrix<> B(poly::math::DenseDims{Row<>{6}, Col<>{3}}); @@ -85,10 +86,10 @@ static void BM_Bareiss2000(benchmark::State &state) { A[i, i - 1] = -1; } for (size_t j = 0; j < N; j += 8) { - A[j,_] << 0; + A[j, _] << 0; for (size_t i = 0; i < N; i += 7) { int64_t s = (i & 1) ? 1 : -1; - A[j,_] += s * A[i,_]; + A[j, _] += s * A[i, _]; } } // std::cout << A << std::endl; diff --git a/benchmark/include/matrix_exp.hpp b/benchmark/include/matrix_exp.hpp index 379b62322..84ada1e17 100644 --- a/benchmark/include/matrix_exp.hpp +++ b/benchmark/include/matrix_exp.hpp @@ -2,9 +2,9 @@ #include #include +#include #include #include -#include #include #include #include @@ -14,7 +14,9 @@ #include #include -using poly::math::Dual, poly::math::Vector, poly::containers::TinyVector, poly::math::SquareMatrix, poly::math::AbstractMatrix, poly::math::SquareDims, poly::math::I, poly::utils::eltype_t, poly::utils::invariant; +using poly::math::Dual, poly::math::Vector, poly::containers::TinyVector, + poly::math::SquareMatrix, poly::math::AbstractMatrix, poly::math::SquareDims, + poly::math::I, poly::utils::eltype_t, poly::utils::invariant; // auto x = Dual, 2>{1.0}; // auto y = x * 3.4; @@ -22,11 +24,10 @@ using poly::math::Dual, poly::math::Vector, poly::containers::TinyVector, poly:: static_assert(std::convertible_to>); static_assert(std::convertible_to, 2>>); -template struct URand { -}; +template struct URand {}; -template struct URand> { - auto operator()(std::mt19937_64 &rng) -> Dual { +template struct URand> { + auto operator()(std::mt19937_64 &rng) -> Dual { Dual x{URand{}(rng)}; for (size_t i = 0; i < N; ++i) x.gradient()[i] = URand{}(rng); return x; diff --git a/include/Dicts/BumpMapSet.hpp b/include/Dicts/BumpMapSet.hpp index 681173eb8..e88247d5e 100644 --- a/include/Dicts/BumpMapSet.hpp +++ b/include/Dicts/BumpMapSet.hpp @@ -1,7 +1,7 @@ #pragma once +#include #include #include -#include #include namespace poly::dict { diff --git a/include/Dicts/BumpVector.hpp b/include/Dicts/BumpVector.hpp index 9f869163e..c34807f26 100644 --- a/include/Dicts/BumpVector.hpp +++ b/include/Dicts/BumpVector.hpp @@ -1,7 +1,7 @@ #pragma once +#include #include #include -#include #include // In include/Dicts, as it primarily serves to support amap/aset diff --git a/include/Graphs/Graphs.hpp b/include/Graphs/Graphs.hpp index 28c3031da..afdb1a33f 100644 --- a/include/Graphs/Graphs.hpp +++ b/include/Graphs/Graphs.hpp @@ -1,6 +1,6 @@ #pragma once -#include #include +#include namespace poly::graph { // Currently, only implements top sort, and Tarjan's strongly connected diff --git a/include/Optimize/OptimizationPossibilities.hpp b/include/Optimize/OptimizationPossibilities.hpp deleted file mode 100644 index 06b3f5253..000000000 --- a/include/Optimize/OptimizationPossibilities.hpp +++ /dev/null @@ -1,651 +0,0 @@ -#pragma once -#include "Dicts/BumpMapSet.hpp" -#include "IR/Address.hpp" -#include "IR/Hash.hpp" -#include "Math/GreatestCommonDivisor.hpp" -#include "Support/Iterators.hpp" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -/* -namespace poly::CostModeling { -using math::DensePtrMatrix, math::MutDensePtrMatrix; - -// Classifies the type of loop dependency -// Possibilities: -// Not nested: this address is not nested inside the loop -// Dynamic: unknown stride -// Static: 0... -// Special values: -// 0: nested inside, but not dependent -// 1: contiguous -// -1: contiguous, but reversed -// From here, small values like `2` might mean we can efficiently shuffle. -// Ideally, we'd be paired with another address offset by 1. -// But even just `A[2*i]`, it may take less micro-ops to shuffle than to -// use a gather. -// -struct LoopDependency { - using I = int; - I type_; - static constexpr I notNested = std::numeric_limits::min(); - static constexpr I dynamic = notNested + 1; - // NOLINTNEXTLINE(readability-identifier-naming) - static constexpr auto NotNested() -> LoopDependency { return {notNested}; } - // NOLINTNEXTLINE(readability-identifier-naming) - static constexpr auto Dynamic() -> LoopDependency { return {dynamic}; } - // NOLINTNEXTLINE(readability-identifier-naming) - static constexpr auto Static(I stride) -> LoopDependency { - // incredibly unlikely, but we don't want to mistake "notNested" - // for a static stride with that value. It isn't something we can optimize - // anyway, so we'll just return dynamic. - return {stride == notNested ? dynamic : stride}; - } - [[nodiscard]] constexpr auto stride() const -> std::optional { - switch (type_) { - case notNested: - case dynamic: return std::nullopt; - default: return type_; - } - } - [[nodiscard]] constexpr auto isDynamic() const -> bool { - return type_ == dynamic; - } - [[nodiscard]] constexpr auto isNotNested() const -> bool { - return type_ == notNested; - } -}; -// So, our data structure can be a `MutDensePtrMatrix` -// with a column per loop, and a row per address. -// We create these per independent sub-tree. -// (Can we use some sparse block structure for better efficiency?) -// -// The addr's order corresponds to the loop tree structure's traversal order. -class LoopDependencies { - MutDensePtrMatrix deps; - unsigned numAddr_; - unsigned offset_{0}; - // We also do want an addrMap to associate uses of the same Addr - -public: - LoopDependencies(alloc::Arena<> *a, unsigned numAddr, unsigned numLoops) - : deps{math::matrix(a, math::Row{numAddr}, - math::Col{numLoops}, - LoopDependency::NotNested())}, - numAddr_{numAddr} {} -}; - -/// Optimizes one option. -class OptionOptimizer {}; - -/// Traverses, generating options and optimizing them -class LoopTreeOptimizer { - /// addrMap yields start of a chain of addrs sharing the same array and index - /// (modulo any offsets). Indices are into the `LoopDependencies` class, - /// following the same order. - dict::amap addrMap; - MutPtrVector addrChain; - /// This class provides the functionality for traversing the loop IR, and - /// picking the optimal schedule. We do a depth-first traversal, analyzing and - /// picking an optimal schedule as we return. This, given loops such as - /// A(9) --> B(3) --> C(2) --> D(0) - /// \-> E(5) --> F(4) \-> G(1) - /// \-> H(8) --> I(7) --> J(6) - /// We would descend A->B->C->D - /// Then we would add the Addr inside `D` (which is loop 0) - /// and determine the optimal schedule. - /// Then we return, ascending, to C, which immediately descends to `G`. - /// We add the Addr inside `G` (which is loop 1), and determine the optimal - /// vectorization and unrolling. - /// Upon returning to `C`, with no sub-loops left, we similarly add its Addr, - /// and determine the optimal schedule for the set of loops D, G, and C. - /// Does C need to retraverse the `Addr` in order to add them with the - /// appropriate loop index (2)? - /// - /// The optimization process involves adding optimization possibilities, - /// for each of these, we perform a more expensive analysis. - /// That analysis -- what kind of information do we need to accumulate? - /// Lets start with that... -public: - void descend() {} -}; - -// loop subsets are contiguous -// -// comparing addrs; NaN == independent of? -// for (j : J){ -// b = B[j]; -// for (i : I) f(A[i], b); -// } -// -// Lets start with the actual cost: -// Ca and Cb are cost of loading from A and B, respectively. -// Ui and Uj are the unrolling factors for i and j, respectively. -// Vi and Vj are the vectorization factors; only one is allowed to be !=0 -// C = Ca * J * I/(Uj*Vj*Vi) + Cb * J/Vj -// -// Vi: C = Ca * J * I/(Uj*Vi) + Cb * J -// Vj: C = Ca * J * I/(Uj*Vj) + Cb * J/Vj -// -// Cost of `A` is Ca * Uj^0 * Ui^1 * I*J / (Uj * Ui) -// = Ca * I * J / Uj -// Cost of `B` is Cb * Uj^1 * Ui^0 * I^0*J / (Uj * Ui^0) -// = Cb * J -// Perhaps easier to work with logarithms? -// -// -// j i -// A: 0 1 -// B: 1 NaN -// -// -// -// i j k -// NaN NaN NaN -class Costs { - DensePtrMatrix costs; - - [[nodiscard]] constexpr auto numAddr() const -> ptrdiff_t { - return ptrdiff_t{costs.numRow()}; - } - [[nodiscard]] constexpr auto numLoops() const -> ptrdiff_t { - return ptrdiff_t{costs.numCol()}; - } -}; - -// perhaps should just store costs? -class LoopIndexDependency { - // for (j : J){ - // b = B[j]; - // for (i : I) f(A[i], b); - // } - // In this example, if `j` and `i` have the same stride category, - // we'd want to add the option to unroll and vectorize `j` - // If `i` has a small static stride and `j` does not, we'd want - // to add the option to vectorize `i` (while still unrolling `j`) - // - // Another thing to consider with optimization options is that we may - // want to be able to combine separate ones; do we need some - // indicator of what we would like to discourage? - // - // Nested: benefit from unrolling - // Non-static stride: penalize vectorization - // - // - // Mappings: - // A[i] in j, B[j] in i => i,j; - // A[i] in j, B[j] in !i => j; - // A[i] in !j, B[j] in i => i; - // A[i] in !j, B[j] in !i => {}; - - // A[i,j], B[j] in i => i; - // A[i,j], B[j] in !i => {}; - // A[i] in j, B[j,i] => j; - // A[i] in !j, B[j,i] => {}; - // A[i,j], B[j,i] => {}; - - // An access only benefits from a loop it is nested inside but doesn't depend - // on being unrolled. - // How can we do the mapping? - // Nested and dynamic or small static -> benefit from unrolling - // - // For now, we'll use 4 bits per... - uint64_t *data; - unsigned words; - // 4 bits/loop - // 64 bits/word - static constexpr unsigned numBits = 4; // wasteful - static constexpr unsigned numLoopsPerUInt = 64 / numBits; - [[nodiscard]] static constexpr auto numWords(unsigned numLoops) -> unsigned { - return (numLoops + numLoopsPerUInt - 1) / numLoopsPerUInt; - } - static constexpr auto numberToShift(uint64_t x) -> unsigned { - return std::countr_zero(x) & ~(numBits - 1); - } - -public: - constexpr LoopIndexDependency(uint64_t *data, unsigned numLoops) - : data{data}, words{numWords(numLoops)} {} - enum class DependencyType { - Independent = 0, // 000 // - Nested = 1, // 001 // cheap to vectorize - Dynamic = 2, // 010 // expensive to vectorize - SmallStatic = 4 // 100 // cheap to vectorize - }; -}; - -using math::MutPtrVector, math::DensePtrMatrix; -struct ArrayIndex { - const llvm::SCEVUnknown *array; - DensePtrMatrix index; - - ArrayIndex(IR::Addr *a) - : array{a->getArrayPointer()}, index{a->indexMatrix()} {} - constexpr auto operator==(const ArrayIndex &) const -> bool = default; -}; - -} // namespace poly::CostModeling -template <> -struct ankerl::unordered_dense::hash { - using is_avalanching = void; - [[nodiscard]] auto - operator()(poly::CostModeling::ArrayIndex const &x) const noexcept - -> uint64_t { - using poly::Hash::combineHash, poly::Hash::getHash; - uint64_t seed = getHash(x.array); - seed = combineHash(seed, getHash(ptrdiff_t{x.index.numRow()})); - seed = combineHash(seed, getHash(ptrdiff_t{x.index.numCol()})); - // Maybe use a faster hash? - for (int64_t y : x.index) seed = combineHash(seed, getHash(y)); - return seed; - } -}; -/// It would be best to actually use the tree structure -/// Let's consider a depth first search approach. -/// A(9) --> B(3) --> C(2) --> D(0) -/// \-> E(5) --> F(4) \-> G(1) -/// \-> H(8) --> I(7) --> J(6) -/// At a given level, we do need to decide whether to unroll and vectorize, -/// using context of both upper and lower levels. Thus, it is a non-local -/// decision that doesn't map well to a single traversal. -/// -/// Many optimal optimization possibilities however are orthogonal with one -/// another, so it would be wasteful to consider the full cartesian product. -/// -/// At each loopnest level, we could consider not unrolling or vectorizing that -/// or any outer level, and then optimize all subtrees independently. When -/// considering these subtrees together, we must always consider them with at -/// least one of this level or an outer level unrolled and/or vectorized. -/// -/// One consideration pattern: -/// [!D], [D], [!G, G], [C, !D, !G], [C, D, !G], [C, !D, G], [C, D, G], -/// [B, C, !D, !G], [B, C, D, !G], [B, C, !D, G], [B, C, D, G]. -/// [B, !C, !D, !G], [B, !C, D, !G], [B, !C, !D, G], [B, !C, D, G] -/// etc -/// So it doesn't cut down much. -/// Note (of course) that we're not considering all of these possibilities; -/// these are the fast ones we're willing to consider at a particular time. -/// -/// We can have contiguous indices giving the range that an optimization -/// possibilities applies to. E.g., if we're at `3` when we reach a loop, we -/// have [3, curr] (i.e., a close-close range). -/// -/// We only need to track the best alg of each subtree, and compare that of the -/// current root. The current root then returns the current best alg: either -/// it's opt, or the composition of the subtrees. The recursion continues until -/// we get the best alg for the whole tree. -namespace poly::CostModeling { -using math::end, math::last; -constexpr auto cld64(unsigned x) -> unsigned { return (x + 63) / 64; } - -class AddrSummary { - IR::Addr *addr; - uint64_t minStaticStride; - uint64_t *data; - unsigned words; - -public: - constexpr AddrSummary(IR::Addr *addr, uint64_t minStaticStride, - uint64_t *data, unsigned numLoops) - : addr(addr), minStaticStride(minStaticStride), data(data), - words(cld64(numLoops)) {} - [[nodiscard]] constexpr auto getAddr() const -> IR::Addr * { return addr; } - [[nodiscard]] constexpr auto getMinStaticStride() const -> uint64_t { - return minStaticStride; - } - static constexpr auto minStaticStrideLoops(uint64_t *data, unsigned words) - -> containers::BitSet> { - math::MutPtrVector v{data, words}; - return containers::BitSet>{v}; - } - static constexpr auto remainingLoops(uint64_t *data, unsigned words) - -> containers::BitSet> { - math::MutPtrVector v{data + words, words}; - return containers::BitSet>{v}; - } - constexpr auto minStaticStrideLoops() - -> containers::BitSet> { - return minStaticStrideLoops(data, words); - } - constexpr auto remainingLoops() - -> containers::BitSet> { - return remainingLoops(data, words); - } - constexpr auto getAddr() -> IR::Addr * { return addr; } - constexpr void copyTo(char *dst) { - void *paddr = dst; - void *stride = dst + sizeof(IR::Addr *); - void *bits = dst + sizeof(IR::Addr *) + sizeof(uint64_t); - *static_cast(paddr) = addr; - *static_cast(stride) = minStaticStride; - std::copy_n(data, 2 * words, static_cast(bits)); - } - constexpr auto setAddr(IR::Addr *a) -> AddrSummary & { - addr = a; - return *this; - } -}; - -class OptimizationOptions; -/// 3-d array, numAddr x (2 x cld(numLoops,64) + 1) -/// The `1` is a static multiplier (e.g. 2) on strides -/// We store the minimum-static rank dependency of each addr, -/// the static rank, and the remaining dependencies. -/// -/// We also want to collect addrs corresponding to arrays, to find -/// unroll possibilities. -class LoopDependencies { - dict::amap addrMap; - /// the chain is for mappings of indices w/in LoopDependencies - unsigned numLoops; - int32_t maxAddr; - int32_t numAddr{0}; - int32_t offset{0}; - // data is an array of `AddrSummary`, and then a chain of length `numAddr` - // giving the position among `AddrSummary` of the next in the chain -#if !defined(__clang__) && defined(__GNUC__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wpedantic" -#else -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wc99-extensions" -#endif - char data[]; // NOLINT(modernize-avoid-c-arrays) -#if !defined(__clang__) && defined(__GNUC__) -#pragma GCC diagnostic pop -#else -#pragma clang diagnostic pop -#endif - - static constexpr auto bytesPerAddr(unsigned numLoops) -> size_t { - return (2 * cld64(numLoops) + 1) * sizeof(uint64_t) + sizeof(IR::Addr *); - } - struct AddrReference { - IR::Addr **addr; - uint64_t *stride; - uint64_t *bits; - }; - constexpr auto addrRef(ptrdiff_t i) -> AddrReference { - utils::invariant(i < numAddr); - char *base = data + i * bytesPerAddr(numLoops); - void *addr = base; - void *stride = base + sizeof(IR::Addr *); - void *bits = base + sizeof(IR::Addr *) + sizeof(uint64_t); - return {static_cast(addr), static_cast(stride), - static_cast(bits)}; - } - -public: - LoopDependencies(Arena<> *alloc, unsigned numLoops, unsigned numAddr) - : addrMap(alloc), numLoops(numLoops), numAddr(int32_t(numAddr)) {} - - LoopDependencies(const LoopDependencies &) = default; - static auto create(alloc::Arena<> *alloc, unsigned numLoops, unsigned numAddr) - -> LoopDependencies * { - - size_t size = size_t(numAddr) * (bytesPerAddr(numLoops) + sizeof(int32_t)) + - sizeof(LoopDependencies); - void *data = alloc->allocate(size); - char *p = static_cast(data); - std::fill(p + sizeof(LoopDependencies), p + size, 0); - auto *ldp = static_cast(data); - return std::construct_at(ldp, alloc, numLoops, numAddr); - } - constexpr auto subTree() -> int32_t { return std::exchange(offset, numAddr); } - constexpr void resetTree(int32_t newOffset) { offset = newOffset; } - constexpr auto operator[](ptrdiff_t i) -> AddrSummary { - AddrReference ref = addrRef(i); - return {*(ref.addr), *(ref.stride), ref.bits, numLoops}; - } - [[nodiscard]] constexpr auto size() const -> ptrdiff_t { return numAddr; } - class Iterator { - LoopDependencies *deps; - ptrdiff_t i; - - public: - constexpr Iterator(LoopDependencies *deps, ptrdiff_t i) - : deps(deps), i(i) {} - constexpr auto operator*() -> AddrSummary { return (*deps)[i]; } - - constexpr auto operator++() -> Iterator & { - ++i; - return *this; - } - constexpr auto operator!=(Iterator other) const -> bool { - return i != other.i; - } - constexpr auto operator++(int) -> Iterator { - Iterator tmp = *this; - ++*this; - return tmp; - } - constexpr auto operator-(Iterator other) const -> ptrdiff_t { - return i - other.i; - } - constexpr auto operator--() -> Iterator & { - --i; - return *this; - } - constexpr auto operator--(int) -> Iterator { - Iterator tmp = *this; - --*this; - return tmp; - } - }; - constexpr auto begin() -> Iterator { return {this, offset}; } - constexpr auto end() -> Iterator { return {this, size()}; } - constexpr auto findShared(IR::Addr *a) -> containers::Pair * { - return addrMap.find(ArrayIndex{a}); - } - // constexpr auto getShared(IR::Addr *a) -> int32_t & { - // return addrMap[ArrayIndex{a}]; - // } - [[nodiscard]] constexpr auto sharedChain() -> int32_t * { - void *p = data + maxAddr * bytesPerAddr(numLoops); - return static_cast(p); - } - /// calls `f` with `this` and an iterator over a set of - /// array pointers that share `indexMatrix` - void evalCollections(const auto &f) { - int32_t *p = sharedChain(); - for (auto [s, i] : addrMap) { - if ((i < offset) || (p[i] < offset)) continue; - f(this, utils::VForwardRange{p, i}); - } - } - // constexpr auto hasMultiple(IR::Addr *a) -> bool { - // auto *f = findShared(a); - // if (!f) return false; - - // } - constexpr auto sharedIndex(IR::Addr *a) -> utils::VForwardRange { - auto *f = findShared(a); - if (f == addrMap.end()) return utils::VForwardRange{nullptr, -1}; - - return utils::VForwardRange{sharedChain(), f->second}; - } - constexpr auto commonIndices(IR::Addr *a) { - return sharedIndex(a) | - std::views::filter([=](int32_t i) -> bool { return i >= offset; }) | - std::views::transform( - [this](int32_t i) -> AddrSummary { return (*this)[i]; }); - } - constexpr void push(AddrSummary s) { - invariant(numAddr < maxAddr); - s.copyTo(data + (numAddr++) * bytesPerAddr(numLoops)); - } - - // adding an Addr should adds unroll options - inline constexpr void - addAddr(alloc::Arena<> *, - math::ResizeableView &, IR::Addr *); - inline constexpr void - addOptOption(alloc::Arena<> *, - math::ResizeableView &, - AddrSummary); -}; - -/// What we want is a map from {array,indexMatrix()} pairs to -/// all Addrs with that `indexMatrix()`; -/// the `all Addrs with that `indexMatrix()`` can be achieved via -/// an integer index into a vector representing chains. -/// -/// We can carry an offset for use in filtering `Addr`s when -/// restricting ourselves to a particular subtree. -/// -class ArrayCollection { - -public: - // iterate over... -}; - -class UnrollOptions { - uint32_t options; // bitmask -public: - constexpr UnrollOptions(uint32_t options) : options(options) {} - static constexpr auto atMost(uint32_t x) -> UnrollOptions { - return {(uint32_t{1} << x) - 1}; - } - [[nodiscard]] constexpr auto allowed(uint32_t x) const -> bool { - return (options & (uint32_t{1} << x)); - } - [[nodiscard]] constexpr auto isDense() const -> bool { - return options == std::numeric_limits::max(); - } - [[nodiscard]] constexpr auto getOptions() const -> uint32_t { - return options; - } - [[nodiscard]] constexpr auto operator&(UnrollOptions other) const - -> UnrollOptions { - return {options & other.options}; - } - constexpr auto operator&=(UnrollOptions other) -> UnrollOptions & { - options &= other.options; - return *this; - } -}; - -// the accumulated set of unroll and vectorization options -// that we can search later. -class OptimizationOptions { - std::array unrollOptions; - std::array loopIDs; - // bounds on the applicable region - uint16_t lower; - uint16_t upper; - uint16_t vecid; - -public: - [[nodiscard]] constexpr auto vectorize() const -> bool { - return vecid != std::numeric_limits::max(); - } - [[nodiscard]] constexpr auto getVecID() const -> uint16_t { return vecid; } - [[nodiscard]] constexpr auto getRange() const - -> math::Range { - return {lower, upper}; - } -}; - -// Here, we scan the addr so far, -// I think we should have sub-tree ref sets. -inline constexpr void LoopDependencies::addAddr( - alloc::Arena<> *alloc, - math::ResizeableView &optops, IR::Addr *a) { - int32_t id = numAddr; - // something to think about here is how to handle the mix of `Addr` reference - // as pointers, vs `Addr` references as indices into a vector. - auto *f = findShared(a); - size_t bpa = bytesPerAddr(numLoops); - if (f) { - AddrSummary s = (*this)[f->second].setAddr(a); - push(s); - // FIXME: not okay!!! We may have different loops - std::copy_n(data + bpa * f->second, bpa, data + bpa * id); - if (f && f->second >= offset) return; - addOptOption(alloc, optops, s); - return; - } - ++numAddr; - AddrReference ref = addrRef(id); - *ref.addr = a; - // calc minStaticStride - DensePtrMatrix indMat = a->indexMatrix(); // dim x loop - // we want mapping from `indMat` index to loop index - uint64_t minStaticStride = std::numeric_limits::max(); - auto minStaticStrideLoops = - AddrSummary::minStaticStrideLoops(ref.bits, cld64(numLoops)); - auto remainingLoops = AddrSummary::remainingLoops(ref.bits, cld64(numLoops)); - IR::Loop *L = a->getLoop(); - for (ptrdiff_t l = ptrdiff_t{indMat.numCol()}; l--; L = L->getLoop()) { - uint32_t lid = L->getID(); - for (ptrdiff_t j = 0; j < ptrdiff_t{indMat.numRow()} - 1; ++j) - if (indMat(j, l)) remainingLoops.insert(lid); - if (int64_t x = indMat(last, l)) { - uint64_t absx = math::constexpr_abs(x); - if (minStaticStride > absx) { - minStaticStride = absx; - remainingLoops |= minStaticStrideLoops; - minStaticStrideLoops.clear(); - minStaticStrideLoops.insert(lid); - } else if (minStaticStride == absx) { - minStaticStrideLoops.insert(lid); - } else { - remainingLoops.insert(lid); - } - } - } - *ref.stride = minStaticStride; - addOptOption(alloc, optops, {a, minStaticStride, ref.bits, numLoops}); -} - -inline constexpr void LoopDependencies::addOptOption( - alloc::Arena<> *alloc, - math::ResizeableView &optops, AddrSummary s) { - // scan older `AddrSummary`s, compare with `s` - for (ptrdiff_t i = 0; i < numAddr - 1; ++i) { - AddrSummary o = (*this)[i]; - // to identify tiling opportunities...we need to know which loops `s` and - // `o` are actually both nested inside. - // - } -} - -class ContigSummary { - uint32_t nonContiguous; // bitmask - uint32_t contiguous; // bitmask, A[i+j,k+l]; multiple may be set -public: - constexpr ContigSummary(uint32_t nonContiguous, uint32_t contiguous) - : nonContiguous(nonContiguous), contiguous(contiguous) {} - [[nodiscard]] constexpr auto getNonContiguous() const -> uint32_t { - return nonContiguous; - } - [[nodiscard]] constexpr auto getContiguous() const -> uint32_t { - return contiguous; - } - [[nodiscard]] constexpr auto operator&(ContigSummary other) const - -> ContigSummary { - uint32_t nonContig = nonContiguous | other.nonContiguous; - return {nonContig, (contiguous & other.contiguous) & ~nonContig}; - } -}; - -/// When we unroll, we have an ordering of the unrolled dimensions. -class RegisterTile { - std::array unroll; // - uint8_t vector; // - uint32_t unrollMask; // bitmask -public: - RegisterTile(std::array unroll, uint8_t vector) - : unroll(unroll), vector(vector) { - unrollMask = (1 << unroll[0]) | (1 << unroll[1]) | (1 << unroll[2]); - } -}; -} // namespace poly::CostModeling -*/ diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 27cbdf1b8..d721baf82 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -1243,9 +1243,9 @@ inline auto Dependencies::calcReorderability(IR::Loop *L, int32_t id) -> bool { return false; // no inner dependence PtrMatrix inInd = in->indexMatrix(), outInd = out->indexMatrix(); - invariant(inInd.numRow(),outInd.numRow()); + invariant(inInd.numRow(), outInd.numRow()); ptrdiff_t d = L->getCurrentDepth(); - invariant(inInd.numRow()>= d); + invariant(inInd.numRow() >= d); // if (ind return true; } diff --git a/include/TurboLoop.hpp b/include/TurboLoop.hpp index 8aee09f12..af15d79f2 100644 --- a/include/TurboLoop.hpp +++ b/include/TurboLoop.hpp @@ -183,8 +183,7 @@ class TurboLoop { // we'd have to make sure none of the allocated instructions // can be referenced again (e.g., through the free list) // auto p = lalloc.checkpoint(); - Valid AL = - poly::Loop::construct(lalloc, L, nwr.visit(BT), *SE); + Valid AL = poly::Loop::construct(lalloc, L, nwr.visit(BT), *SE); IR::TreeResult tr = parseExitBlocks(L); tr.rejectDepth = std::max(tr.rejectDepth, omega.size() - AL->getNumLoops()); omega.push_back(0); // we start with 0 at the end, walking backwards diff --git a/test/bumpmap_test.cpp b/test/bumpmap_test.cpp index 1dc00d584..44b0be6af 100644 --- a/test/bumpmap_test.cpp +++ b/test/bumpmap_test.cpp @@ -16,8 +16,9 @@ TEST(BumpDownMapTest, BasicAssertions) { using M = poly::dict::amap; static_assert( - std::same_as>>); + std::same_as< + M::value_container_type, + poly::math::BumpPtrVector>>); static_assert( std::same_as< M::allocator_type, diff --git a/test/dict_test.cpp b/test/dict_test.cpp index d796e03c6..f08324c8d 100644 --- a/test/dict_test.cpp +++ b/test/dict_test.cpp @@ -120,4 +120,3 @@ TEST(TrieTest, BasicAssertions) { EXPECT_EQ(*it.find(k), v); } } - From 33730eb444d745737308a188abd24775ce131241 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Mon, 22 Jan 2024 02:45:05 -0500 Subject: [PATCH 093/112] minor progress implementing dependece reorderability check --- include/Polyhedra/Dependence.hpp | 106 +++++++++++++++++++++++++++---- 1 file changed, 94 insertions(+), 12 deletions(-) diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index d721baf82..838c2dd84 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -31,9 +31,9 @@ struct Dependence { }; enum MetaFlags : uint8_t { Forward = 1, - Reassociable = 2, - FreeOfDeeperDeps = 4, - Peelable = 8 + FreeOfDeeperDeps = 2, + Reassociable = 4, + NotReassociable = 8 }; // private: @@ -55,6 +55,7 @@ struct Dependence { ID revTimeEdge_{-1}; std::array satLvl; uint8_t meta{0}; + uint8_t peel{255}; // sentinal value for cannot peel // template [[nodiscard]] auto get() const -> const auto & { // if constexpr (I == 0) return depPoly; @@ -66,6 +67,7 @@ struct Dependence { return {dependenceSatisfaction, dependenceBounding}; } [[nodiscard]] constexpr auto getMeta() const -> uint8_t { return meta; } + [[nodiscard]] constexpr auto getPeel() const -> uint8_t { return peel; } // public: friend class Dependencies; @@ -84,6 +86,7 @@ struct Dependence { [[nodiscard]] constexpr auto revTimeEdge() const -> ID { return revTimeEdge_; } + [[nodiscard]] constexpr auto peelable() const -> bool { return peel != 255; } // constexpr auto setNextInput(Dependence *n) -> Dependence * { // return nextInput = n; // } @@ -561,10 +564,11 @@ static_assert(sizeof(Dependence) <= 64); // i_0 = i_1 // j_0 = j_1 - k_1 class Dependencies { - using Tuple = containers::Tuple, 2>, - DepPoly *, int32_t, int32_t, int32_t, int32_t, - int32_t, std::array, uint8_t>; + using Tuple = + containers::Tuple, 2>, DepPoly *, int32_t, + int32_t, int32_t, int32_t, int32_t, + std::array, uint8_t, uint8_t>; math::ManagedSOA datadeps; @@ -579,6 +583,7 @@ class Dependencies { static constexpr size_t RevTimeEdgeI = 8; static constexpr size_t SatLevelI = 9; static constexpr size_t GetMetaI = 10; + static constexpr size_t GetPeelI = 11; public: using ID = Dependence::ID; @@ -610,7 +615,8 @@ class Dependencies { -1, d.revTimeEdge().id, d.satLvl, - d.getMeta()}; + d.getMeta(), + d.getPeel()}; } private: @@ -890,6 +896,40 @@ class Dependencies { return (a->getLoop() != L) && L->contains(a); }); } + static auto innermostNonZero(PtrMatrix A, ptrdiff_t skip) + -> ptrdiff_t { + for (ptrdiff_t i = ptrdiff_t(A.numCol()); --i;) { + if (i == skip) continue; + if (!math::allZero(A[_, i])) return i; + } + return -1; + } + /* + * Check `findThroughReassociable` and its uses; we should be able to use that + here. + enum OperationChainReassociability { NoPath, ReassociablePath, + NonReassociablePath + }; + static auto checkPathReassociability { + + } + */ + // For this to be reassociable, we must have a chain of reassociable + // operations from `in->out`. Additionally, it is strogly recommended to check + // if `revTimeEdge(id) >= 0` prior to calling this, as it is only meaningful + // when true. + // Must also check that `in->isLoad() != out->isLoad()`. + // We may have either that `in -> out` (forward time), or `out -> in` (reverse + // time) but we still need to check both cases to mark as reassociable. + // TODO: add a not reassociable, check if already defined + // after determining, store result in entire cycle + static auto canReassociate(IR::Addr *in, IR::Addr *out) -> bool { + invariant(in->isLoad() != out->isLoad()); + if (in->indexMatrix() != out->indexMatrix()) return false; + IR::Addr *load = in->isLoad() ? in : out, *store = in->isLoad() ? out : in; + // do we have a reassociable chain of operations from `load` to `store`? + return false; + } public: constexpr void removeEdge(ID id) { @@ -1006,8 +1046,14 @@ class Dependencies { [[nodiscard]] constexpr auto getMeta(ID i) const noexcept -> uint8_t { return datadeps.template get(i.id); } + [[nodiscard]] constexpr auto getPeel(ID i) noexcept -> uint8_t & { + return datadeps.template get(i.id); + } + [[nodiscard]] constexpr auto getPeel(ID i) const noexcept -> uint8_t { + return datadeps.template get(i.id); + } [[nodiscard]] constexpr auto isForward(ID i) const noexcept -> bool { - return getMeta(i); + return getMeta(i) & 1; } class Ref { @@ -1224,7 +1270,8 @@ inline void Dependencies::copyDependencies(IR::Addr *src, IR::Addr *dst) { } inline auto Dependencies::calcReorderability(IR::Loop *L, int32_t id) -> bool { - IR::Addr *in = input(Dependence::ID{id}), *out = output(Dependence::ID{id}); + auto id_ = Dependence::ID{id}; + IR::Addr *in = input(id_), *out = output(id_); // clang-format off // If we have a dependency nested inside `L`, we won't be able to reorder if either // a) that dependency's output is `in` @@ -1246,8 +1293,43 @@ inline auto Dependencies::calcReorderability(IR::Loop *L, int32_t id) -> bool { invariant(inInd.numRow(), outInd.numRow()); ptrdiff_t d = L->getCurrentDepth(); invariant(inInd.numRow() >= d); - // if (ind - return true; + bool peelable = false, reassociable = false; + if (math::allZero(inInd[_, d])) { + if (!math::allZero(outInd[_, d])) { + // now, we want to find a loop that `in` depends on but `out` does not + // so that we can split over this loop. + // For now, to simplify codegen, we only accept the innermost non-zero + if (ptrdiff_t i = innermostNonZero(inInd, d); i >= 0) { + getPeel(id_) = i; + peelable = true; + } + } + } else if (math::allZero(outInd[_, d])) { + if (!math::allZero(inInd[_, d])) { + if (ptrdiff_t i = innermostNonZero(outInd, d); i >= 0) { + getPeel(id_) = i; + peelable = true; + } + } + } + int32_t rte = revTimeEdge(id_); + if ((rte >= 0) && (in->isLoad() != out->isLoad()) && + (!(getMeta(id_) & Dependence::NotReassociable)) && + canReassociate(in, out)) { + reassociable = true; + getMeta(id_) = getMeta(id_) | Dependence::Reassociable; + } else { + getMeta(id_) = getMeta(id_) | Dependence::NotReassociable; + // set all in cycle to `NotReassociable`, so we don't recalc + if (rte >= 0) { + for (int32_t stop = id; rte != stop;) { + auto rtid = Dependence::ID{rte}; + getMeta(rtid) = getMeta(rtid) | Dependence::NotReassociable; + rte = revTimeEdge(rtid); + } + } + } + return peelable || reassociable; } } // namespace poly From 559a99f31c8498cfc6454a4e1cd1057130e2a44e Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Wed, 24 Jan 2024 17:25:20 -0500 Subject: [PATCH 094/112] expand on maybeReassociableReduction correctly handling dependencies on intermediates --- include/IR/Instruction.hpp | 1 + include/Optimize/CostModeling.hpp | 28 +++++++++++++++++++++++++--- include/Polyhedra/Dependence.hpp | 23 +++++++++++++++++++++++ 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/include/IR/Instruction.hpp b/include/IR/Instruction.hpp index 50669bf97..633cabe39 100644 --- a/include/IR/Instruction.hpp +++ b/include/IR/Instruction.hpp @@ -849,6 +849,7 @@ constexpr auto find(Addr *src, Compute *dst) -> bool { return false; }); } +// from dst, search through operands for `src` // NOLINTNEXTLINE misc-no-recursion constexpr auto findThroughReassociable(Addr *src, Compute *dst) -> unsigned { uint32_t reassociable = dst->reassociableArgs(); diff --git a/include/Optimize/CostModeling.hpp b/include/Optimize/CostModeling.hpp index 99bddee9f..272d51038 100644 --- a/include/Optimize/CostModeling.hpp +++ b/include/Optimize/CostModeling.hpp @@ -60,6 +60,29 @@ namespace poly::IR { /// `x[i] = acc` are top sorted. The load `acc = x[i]` should be the very /// first output topologically -- afterall, it occus before the store!! /// TODO: does `Addr` hoisting handle this?? +/// Consider also the example: +/// int64_t x[1]{}; +/// for (ptrdiff_t n = 0; n < N; ++n){ +/// x[0] = x[0] + y[n]; +/// z[n] = x[0]; +/// } +/// this is harder to understand than, but behaves the same as +/// z[0] = y[n]; +/// for (ptrdiff_t n = 1; n < N; ++n){ +/// z[n] = z[n-1] + y[n]; +/// } +/// int64_t x[1]{z[N-1]}; +/// which does not have any reductions. +/// This should be handled because, if we had a loop like +/// int64_t x[1]{}; +/// for (ptrdiff_t n = 0; n < N; ++n) x[0] = x[0] + y[n]; +/// it should be optimized into +/// int64_t x[1]{}; +/// auto xv = x[0]; +/// for (ptrdiff_t n = 0; n < N; ++n) xv = xv + y[n]; +/// x[0] = xv; +/// However, the assignment `z[n]` should block the hoisting of the load/store +/// and we can check that failure to hoist for verifying legality. constexpr inline void Addr::maybeReassociableReduction(const Dependencies &deps) { if (isLoad()) return; @@ -70,7 +93,7 @@ Addr::maybeReassociableReduction(const Dependencies &deps) { auto B = edges.begin(); if (B == edges.end()) return; poly::Dependence::ID id{*B}; - if (!deps.revTimeEdge(id)) return; + if (deps.revTimeEdge(id) < 0) return; IR::Addr *dst = deps.output(id); if (dst->isStore() || (getLoop() != dst->getLoop())) return; // if we failed to hoist the `Addr` out of time-dims, then we cannot optimize. @@ -78,8 +101,7 @@ Addr::maybeReassociableReduction(const Dependencies &deps) { if (reassociableReduction == dst) return; // multiple time dims, already found auto *c = llvm::dyn_cast(getStoredVal()); if (!c) return; - unsigned f = findThroughReassociable(dst, c); - if (f != 1) return; + if (findThroughReassociable(dst, c) != 1) return; reassociableReduction = dst; dst->reassociableReduction = this; } diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 838c2dd84..5dcfae464 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -1269,6 +1269,28 @@ inline void Dependencies::copyDependencies(IR::Addr *src, IR::Addr *dst) { } } +// returns `true` if this dependence can be reordered, `false` otherwise +// note that the associated loop itself may need scalarization, but subloop +// evaluations could be reorderable +// How would we capture dependencies/uses like +// int64_t x = 0; +// for (ptrdiff_t m = 0; m < M; ++m){ +// x += a[m]; +// b[m] = x; +// } +// we have `x +=` as a reassociable self-dependence, but the fact it is stored +// into `b[m]` means that we can't really reassociate, as each nominal +// intermediate value of `x` must be realized! +// We must check that there are no other reads. Note that this is represented as +// int64_t x[1]{}; +// for (ptrdiff_t m = 0; m < M; ++m){ +// x[0] = x[0] + a[m]; +// b[m] = x[0]; +// } +// So we have write->read dependence for the store `x[0] =` to the read in +// `b[m] = x[0]`. The key observation here is that `x[0]` has a time component; +// the violation occurs because we store in another location, providing a +// non-reassociable component. inline auto Dependencies::calcReorderability(IR::Loop *L, int32_t id) -> bool { auto id_ = Dependence::ID{id}; IR::Addr *in = input(id_), *out = output(id_); @@ -1286,6 +1308,7 @@ inline auto Dependencies::calcReorderability(IR::Loop *L, int32_t id) -> bool { // 2. Is this dependency reassociable? E.g., if it's connected by reassociable adds // (such as integer adds, or floating point with the reassociable FMF), then mark it as such. // clang-format on + // if (anyInteriorDependencies(L, in) || anyInteriorDependents(L, out)) return false; // no inner dependence From e7abd540ac58f57a3e279eee316f524f4a39c99e Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Wed, 24 Jan 2024 17:54:30 -0500 Subject: [PATCH 095/112] add a TODO --- include/IR/Instruction.hpp | 1 + include/Optimize/CostModeling.hpp | 4 ++-- include/Polyhedra/Dependence.hpp | 2 ++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/include/IR/Instruction.hpp b/include/IR/Instruction.hpp index 633cabe39..e3e96a18d 100644 --- a/include/IR/Instruction.hpp +++ b/include/IR/Instruction.hpp @@ -852,6 +852,7 @@ constexpr auto find(Addr *src, Compute *dst) -> bool { // from dst, search through operands for `src` // NOLINTNEXTLINE misc-no-recursion constexpr auto findThroughReassociable(Addr *src, Compute *dst) -> unsigned { + invariant(src->isLoad()); uint32_t reassociable = dst->reassociableArgs(); // foundflag&1 == found reassociable // foundflag&2 == found non-reassociable diff --git a/include/Optimize/CostModeling.hpp b/include/Optimize/CostModeling.hpp index 272d51038..e2776ad69 100644 --- a/include/Optimize/CostModeling.hpp +++ b/include/Optimize/CostModeling.hpp @@ -85,10 +85,10 @@ namespace poly::IR { /// and we can check that failure to hoist for verifying legality. constexpr inline void Addr::maybeReassociableReduction(const Dependencies &deps) { + // we only run for `this->isStore() && dst->isLoad()` if (isLoad()) return; // we should have a store whose first output edge is the load for - // the following iteration. This iter is the reverse-time - // edge. + // the following iteration. This iter is the reverse-time edge. auto edges{outputEdgeIDs(deps, getCurrentDepth())}; auto B = edges.begin(); if (B == edges.end()) return; diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 5dcfae464..e91774d9f 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -1335,6 +1335,8 @@ inline auto Dependencies::calcReorderability(IR::Loop *L, int32_t id) -> bool { } } } + // TODO: check `reassociableReduction` field instead of using the following + // check int32_t rte = revTimeEdge(id_); if ((rte >= 0) && (in->isLoad() != out->isLoad()) && (!(getMeta(id_) & Dependence::NotReassociable)) && From ad754ddcaf977bf61962894bf0bbea6c85ebe62d Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Thu, 25 Jan 2024 22:26:28 -0500 Subject: [PATCH 096/112] use cached reassociableReductionPair for flagging reassociability of reductions --- include/Polyhedra/Dependence.hpp | 80 ++++++++------------------------ 1 file changed, 19 insertions(+), 61 deletions(-) diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index e91774d9f..344a46123 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -29,6 +29,7 @@ struct Dependence { int32_t id; [[nodiscard]] constexpr explicit operator bool() const { return id >= 0; } }; + // TODO: revert to `bool` flag for `Forward`? enum MetaFlags : uint8_t { Forward = 1, FreeOfDeeperDeps = 2, @@ -881,21 +882,21 @@ class Dependencies { }; } - inline auto anyInteriorDependents(IR::Loop *L, IR::Addr *out) -> bool { - return std::ranges::any_of(out->outputEdgeIDs(*this), - [&](int32_t i) -> bool { - IR::Addr *a = output(Dependence::ID{i}); - return (a->getLoop() != L) && L->contains(a); - }); - } + // inline auto anyInteriorDependents(IR::Loop *L, IR::Addr *out) -> bool { + // return std::ranges::any_of(out->outputEdgeIDs(*this), + // [&](int32_t i) -> bool { + // IR::Addr *a = output(Dependence::ID{i}); + // return (a->getLoop() != L) && L->contains(a); + // }); + // } - inline auto anyInteriorDependencies(IR::Loop *L, IR::Addr *in) -> bool { + // inline auto anyInteriorDependencies(IR::Loop *L, IR::Addr *in) -> bool { - return std::ranges::any_of(in->inputEdgeIDs(*this), [&](int32_t i) -> bool { - IR::Addr *a = input(Dependence::ID{i}); - return (a->getLoop() != L) && L->contains(a); - }); - } + // return std::ranges::any_of(in->inputEdgeIDs(*this), [&](int32_t i) -> bool { + // IR::Addr *a = input(Dependence::ID{i}); + // return (a->getLoop() != L) && L->contains(a); + // }); + // } static auto innermostNonZero(PtrMatrix A, ptrdiff_t skip) -> ptrdiff_t { for (ptrdiff_t i = ptrdiff_t(A.numCol()); --i;) { @@ -904,32 +905,6 @@ class Dependencies { } return -1; } - /* - * Check `findThroughReassociable` and its uses; we should be able to use that - here. - enum OperationChainReassociability { NoPath, ReassociablePath, - NonReassociablePath - }; - static auto checkPathReassociability { - - } - */ - // For this to be reassociable, we must have a chain of reassociable - // operations from `in->out`. Additionally, it is strogly recommended to check - // if `revTimeEdge(id) >= 0` prior to calling this, as it is only meaningful - // when true. - // Must also check that `in->isLoad() != out->isLoad()`. - // We may have either that `in -> out` (forward time), or `out -> in` (reverse - // time) but we still need to check both cases to mark as reassociable. - // TODO: add a not reassociable, check if already defined - // after determining, store result in entire cycle - static auto canReassociate(IR::Addr *in, IR::Addr *out) -> bool { - invariant(in->isLoad() != out->isLoad()); - if (in->indexMatrix() != out->indexMatrix()) return false; - IR::Addr *load = in->isLoad() ? in : out, *store = in->isLoad() ? out : in; - // do we have a reassociable chain of operations from `load` to `store`? - return false; - } public: constexpr void removeEdge(ID id) { @@ -1309,14 +1284,14 @@ inline auto Dependencies::calcReorderability(IR::Loop *L, int32_t id) -> bool { // (such as integer adds, or floating point with the reassociable FMF), then mark it as such. // clang-format on // - if (anyInteriorDependencies(L, in) || anyInteriorDependents(L, out)) - return false; + // if (anyInteriorDependencies(L, in) || anyInteriorDependents(L, out)) + // return false; // no inner dependence PtrMatrix inInd = in->indexMatrix(), outInd = out->indexMatrix(); invariant(inInd.numRow(), outInd.numRow()); ptrdiff_t d = L->getCurrentDepth(); invariant(inInd.numRow() >= d); - bool peelable = false, reassociable = false; + bool peelable = false; if (math::allZero(inInd[_, d])) { if (!math::allZero(outInd[_, d])) { // now, we want to find a loop that `in` depends on but `out` does not @@ -1335,25 +1310,8 @@ inline auto Dependencies::calcReorderability(IR::Loop *L, int32_t id) -> bool { } } } - // TODO: check `reassociableReduction` field instead of using the following - // check - int32_t rte = revTimeEdge(id_); - if ((rte >= 0) && (in->isLoad() != out->isLoad()) && - (!(getMeta(id_) & Dependence::NotReassociable)) && - canReassociate(in, out)) { - reassociable = true; - getMeta(id_) = getMeta(id_) | Dependence::Reassociable; - } else { - getMeta(id_) = getMeta(id_) | Dependence::NotReassociable; - // set all in cycle to `NotReassociable`, so we don't recalc - if (rte >= 0) { - for (int32_t stop = id; rte != stop;) { - auto rtid = Dependence::ID{rte}; - getMeta(rtid) = getMeta(rtid) | Dependence::NotReassociable; - rte = revTimeEdge(rtid); - } - } - } + bool reassociable = in->reassociableReductionPair() == out; + invariant(reassociable == (out->reassociableReductionPair() == in)); return peelable || reassociable; } } // namespace poly From 4b29db703df8905978567826d6a1df61400c4353 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Fri, 26 Jan 2024 02:00:00 -0500 Subject: [PATCH 097/112] cleanup peel-depth determination function, relyinng on reassociableReductionPair identification for reassociable reductions --- include/Optimize/Legality.hpp | 22 ++++++++++---- include/Polyhedra/Dependence.hpp | 49 ++++++++++++++------------------ 2 files changed, 37 insertions(+), 34 deletions(-) diff --git a/include/Optimize/Legality.hpp b/include/Optimize/Legality.hpp index 93ed9f930..c2b66bfc5 100644 --- a/include/Optimize/Legality.hpp +++ b/include/Optimize/Legality.hpp @@ -56,6 +56,7 @@ namespace poly::CostModeling { // } // Here, we can unroll and jam. // example 3: +// // for (ptrdiff_t i = 1; i < x.size()-3; i+=4){ // decltype(y[0,0]+y[0,0]) s0 = 0; // decltype(y[0,0]+y[0,0]) s1 = 0; @@ -72,6 +73,8 @@ namespace poly::CostModeling { // x[i+2] += s2 * x[i+1]; // x[i+3] += s3 * x[i+2]; // } +// +// // So we can generalize to say, we can always unroll the innermost where the // addr are read. // @@ -95,9 +98,12 @@ namespace poly::CostModeling { // it shouldn't be too difficult to check for extra outputs, etc. // so we do that all here, after the `Addr` placements and simplifications // +// For examples 2-3 above, we should have a concept of must-scalarize this +// loop's execution, but that we can vectorize/reorder it within subloops. struct Legality { // enum class Reduction { None = 0, Unordered = 1, Ordered = 2 }; - uint16_t unordered_reduction_count{0}; + uint8_t ordered_reduction_count{0}; + uint8_t unordered_reduction_count{0}; uint16_t mindistance{std::numeric_limits::max()}; uint16_t maxdistance{0}; bool canPeel{true}; @@ -112,6 +118,7 @@ struct Legality { // [[nodiscard]] constexpr auto maxIters() const -> uint16_t { return // maxiters; } constexpr auto operator&=(Legality other) -> Legality & { + ordered_reduction_count += other.ordered_reduction_count; unordered_reduction_count += other.unordered_reduction_count; mindistance = std::min(mindistance, other.mindistance); maxdistance = std::max(maxdistance, other.maxdistance); @@ -136,12 +143,14 @@ struct Legality { return (a->getLoop() != L) && L->contains(a); }); } - void update(poly::Dependencies &deps, IR::Loop *L, Dependence d) { + auto update(poly::Dependencies &deps, IR::Loop *L, Dependence d) -> bool { // note: the dependence hasn't been rotated IR::Addr *in = d.out, *out = d.in; - if (d.revTimeEdge() && (in->reassociableReductionPair() != out)) { - ++unordered_reduction_count; - return; + if (d.revTimeEdge()) { + bool reassociable = in->reassociableReductionPair() != out; + if (reassociable) ++unordered_reduction_count; + if (!reassociable) ++ordered_reduction_count; + return reassociable; } /// Now we check if we're allowed any reorderings /// First of all, consider that unrolling is allowed if no memory accesses @@ -152,7 +161,7 @@ struct Legality { maxdistance = std::numeric_limits::max(); canPeel = false; canUnroll = false; - return; + return false; } if (mindistance || maxdistance != std::numeric_limits::max()) { // for now, just check peelability @@ -160,6 +169,7 @@ struct Legality { if (!canPeel) { // then we have a dependence } + return canPeel; }; Legality(LoopDepSatisfaction &deps, IR::Loop *L) { diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 344a46123..7a6043c87 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -886,13 +886,15 @@ class Dependencies { // return std::ranges::any_of(out->outputEdgeIDs(*this), // [&](int32_t i) -> bool { // IR::Addr *a = output(Dependence::ID{i}); - // return (a->getLoop() != L) && L->contains(a); + // return (a->getLoop() != L) && + // L->contains(a); // }); // } // inline auto anyInteriorDependencies(IR::Loop *L, IR::Addr *in) -> bool { - // return std::ranges::any_of(in->inputEdgeIDs(*this), [&](int32_t i) -> bool { + // return std::ranges::any_of(in->inputEdgeIDs(*this), [&](int32_t i) -> + // bool { // IR::Addr *a = input(Dependence::ID{i}); // return (a->getLoop() != L) && L->contains(a); // }); @@ -1138,7 +1140,7 @@ class Dependencies { /// NOTE: this method uses `in` and `out` to check for reorderability, as /// these get rotated after the simplex solve, while the stored `DepPoly` and /// simplices do not. - inline auto calcReorderability(IR::Loop *, int32_t) -> bool; + inline auto determinePeelDepth(IR::Loop *, int32_t) -> bool; }; } // namespace poly @@ -1244,10 +1246,10 @@ inline void Dependencies::copyDependencies(IR::Addr *src, IR::Addr *dst) { } } -// returns `true` if this dependence can be reordered, `false` otherwise -// note that the associated loop itself may need scalarization, but subloop -// evaluations could be reorderable -// How would we capture dependencies/uses like +// returns `true` if this dependence can be reordered due to peelinng, `false` +// otherwise note that the associated loop itself may need scalarization, but +// subloop evaluations could be reorderable How would we capture +// dependencies/uses like // int64_t x = 0; // for (ptrdiff_t m = 0; m < M; ++m){ // x += a[m]; @@ -1266,7 +1268,7 @@ inline void Dependencies::copyDependencies(IR::Addr *src, IR::Addr *dst) { // `b[m] = x[0]`. The key observation here is that `x[0]` has a time component; // the violation occurs because we store in another location, providing a // non-reassociable component. -inline auto Dependencies::calcReorderability(IR::Loop *L, int32_t id) -> bool { +inline auto Dependencies::determinePeelDepth(IR::Loop *L, int32_t id) -> bool { auto id_ = Dependence::ID{id}; IR::Addr *in = input(id_), *out = output(id_); // clang-format off @@ -1291,28 +1293,19 @@ inline auto Dependencies::calcReorderability(IR::Loop *L, int32_t id) -> bool { invariant(inInd.numRow(), outInd.numRow()); ptrdiff_t d = L->getCurrentDepth(); invariant(inInd.numRow() >= d); - bool peelable = false; - if (math::allZero(inInd[_, d])) { - if (!math::allZero(outInd[_, d])) { - // now, we want to find a loop that `in` depends on but `out` does not - // so that we can split over this loop. - // For now, to simplify codegen, we only accept the innermost non-zero - if (ptrdiff_t i = innermostNonZero(inInd, d); i >= 0) { - getPeel(id_) = i; - peelable = true; - } - } - } else if (math::allZero(outInd[_, d])) { - if (!math::allZero(inInd[_, d])) { - if (ptrdiff_t i = innermostNonZero(outInd, d); i >= 0) { - getPeel(id_) = i; - peelable = true; - } + bool peelable = false, noInIndAtDepth = math::allZero(inInd[_, d]), + noOutIndAtDepth = math::allZero(outInd[_, d]); + if (noInIndAtDepth != noOutIndAtDepth) { + // now, we want to find a loop that `in` depends on but `out` does not + // so that we can split over this loop. + // For now, to simplify codegen, we only accept the innermost non-zero + if (ptrdiff_t i = innermostNonZero(noInIndAtDepth ? inInd : outInd, d); + i >= 0) { + getPeel(id_) = i; + peelable = true; } } - bool reassociable = in->reassociableReductionPair() == out; - invariant(reassociable == (out->reassociableReductionPair() == in)); - return peelable || reassociable; + return peelable; } } // namespace poly From a930d03b676ebc72d47618f60c31edd926ea2c10 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Fri, 26 Jan 2024 02:07:54 -0500 Subject: [PATCH 098/112] simplify control flow --- include/Polyhedra/Dependence.hpp | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 7a6043c87..a875aceb4 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -1293,19 +1293,16 @@ inline auto Dependencies::determinePeelDepth(IR::Loop *L, int32_t id) -> bool { invariant(inInd.numRow(), outInd.numRow()); ptrdiff_t d = L->getCurrentDepth(); invariant(inInd.numRow() >= d); - bool peelable = false, noInIndAtDepth = math::allZero(inInd[_, d]), + bool noInIndAtDepth = math::allZero(inInd[_, d]), noOutIndAtDepth = math::allZero(outInd[_, d]); - if (noInIndAtDepth != noOutIndAtDepth) { - // now, we want to find a loop that `in` depends on but `out` does not - // so that we can split over this loop. - // For now, to simplify codegen, we only accept the innermost non-zero - if (ptrdiff_t i = innermostNonZero(noInIndAtDepth ? inInd : outInd, d); - i >= 0) { - getPeel(id_) = i; - peelable = true; - } - } - return peelable; + if (noInIndAtDepth == noOutIndAtDepth) return false; + // now, we want to find a loop that `in` depends on but `out` does not + // so that we can split over this loop. + // For now, to simplify codegen, we only accept the innermost non-zero + ptrdiff_t i = innermostNonZero(noInIndAtDepth ? inInd : outInd, d); + if (i < 0) return false; + getPeel(id_) = i; + return true; } } // namespace poly From 6e0f705f4d7b297cb850ae820ceaadbaaf259992 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Fri, 26 Jan 2024 09:24:35 -0500 Subject: [PATCH 099/112] fairly negligible progress --- include/Optimize/Legality.hpp | 61 +++++++++++++++++++++++--------- include/Polyhedra/Dependence.hpp | 33 +++++------------ 2 files changed, 54 insertions(+), 40 deletions(-) diff --git a/include/Optimize/Legality.hpp b/include/Optimize/Legality.hpp index c2b66bfc5..6b4d79953 100644 --- a/include/Optimize/Legality.hpp +++ b/include/Optimize/Legality.hpp @@ -100,31 +100,38 @@ namespace poly::CostModeling { // // For examples 2-3 above, we should have a concept of must-scalarize this // loop's execution, but that we can vectorize/reorder it within subloops. -struct Legality { - // enum class Reduction { None = 0, Unordered = 1, Ordered = 2 }; +class Legality { + enum class Illegal : uint8_t { + None = 0, + Unroll = 1, + ReorderThis = 2, + ReorderSubLoops = 4 + }; + uint16_t peelFlag{0}; + uint16_t mindistance{std::numeric_limits::max()}; + uint8_t maxdistance{0}; uint8_t ordered_reduction_count{0}; uint8_t unordered_reduction_count{0}; - uint16_t mindistance{std::numeric_limits::max()}; - uint16_t maxdistance{0}; - bool canPeel{true}; - bool canUnroll{true}; - // uint16_t maxiters{0}; + uint8_t illegalFlag{0}; + +public: [[nodiscard]] constexpr auto minDistance() const -> uint16_t { return mindistance; } [[nodiscard]] constexpr auto maxDistance() const -> uint16_t { return mindistance; } - // [[nodiscard]] constexpr auto maxIters() const -> uint16_t { return - // maxiters; } + [[nodiscard]] constexpr auto noUnroll() const -> bool { + return illegalFlag & uint8_t(Illegal::Unroll); + } + [[nodiscard]] constexpr auto canUnroll() const -> bool { return !noUnroll(); } constexpr auto operator&=(Legality other) -> Legality & { ordered_reduction_count += other.ordered_reduction_count; unordered_reduction_count += other.unordered_reduction_count; mindistance = std::min(mindistance, other.mindistance); maxdistance = std::max(maxdistance, other.maxdistance); - canPeel = canPeel & other.canPeel; - canUnroll = canUnroll & other.canUnroll; - // maxiters = std::max(maxiters, other.maxiters); + peelFlag |= other.peelFlag; + illegalFlag |= other.illegalFlag; return *this; } [[nodiscard]] constexpr auto operator&(Legality other) const -> Legality { @@ -143,9 +150,30 @@ struct Legality { return (a->getLoop() != L) && L->contains(a); }); } - auto update(poly::Dependencies &deps, IR::Loop *L, Dependence d) -> bool { + // inline auto anyInteriorDependents(IR::Loop *L, IR::Addr *out) -> bool { + // return std::ranges::any_of(out->outputEdgeIDs(*this), + // [&](int32_t i) -> bool { + // IR::Addr *a = output(Dependence::ID{i}); + // return (a->getLoop() != L) && + // L->contains(a); + // }); + // } + + // inline auto anyInteriorDependencies(IR::Loop *L, IR::Addr *in) -> bool { + + // return std::ranges::any_of(in->inputEdgeIDs(*this), [&](int32_t i) -> + // bool { + // IR::Addr *a = input(Dependence::ID{i}); + // return (a->getLoop() != L) && L->contains(a); + // }); + // } + auto update(poly::Dependencies &deps, IR::Loop *L, int32_t did) -> bool { // note: the dependence hasn't been rotated + Dependence d{deps.get(Dependence::ID{did})}; IR::Addr *in = d.out, *out = d.in; + if (utils::Optional peel = deps.determinePeelDepth(L, did)) + peelFlag |= (1 << (*peel)); + if (d.revTimeEdge()) { bool reassociable = in->reassociableReductionPair() != out; if (reassociable) ++unordered_reduction_count; @@ -156,7 +184,7 @@ struct Legality { /// First of all, consider that unrolling is allowed if no memory accesses /// dependent on the `in` or `out` are in a deeper loop (e.g. example 3), /// even if vectorization is not. - if (canUnroll && d.revTimeEdge() && deeperAccess(deps, L, in)) { + if (canUnroll() && d.revTimeEdge() && deeperAccess(deps, L, in)) { mindistance = 0; maxdistance = std::numeric_limits::max(); canPeel = false; @@ -173,9 +201,10 @@ struct Legality { }; Legality(LoopDepSatisfaction &deps, IR::Loop *L) { - for (poly::Dependence d : deps.depencencies(L)) update(deps.deps, L, d); + for (int32_t did : deps.dependencyIDs(L)) + if (!update(deps.deps, L, did)) break; } }; - +static_assert(sizeof(Legality) == 8); } // namespace poly::CostModeling #endif // POLY_LEGALITY_HPP_INCLUDED diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index a875aceb4..6f5283809 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -600,6 +600,7 @@ class Dependencies { return datadeps.size(); } +private: constexpr auto tup(Dependence d, int32_t i) -> Tuple { IR::Addr *out = d.output(), *in = d.input(); if (out->getEdgeOut() >= 0) prevOut(ID{out->getEdgeOut()}) = i; @@ -620,7 +621,6 @@ class Dependencies { d.getPeel()}; } -private: /// set(ID i, Dependence d) /// stores `d` at index `i` /// Dependence `d` is pushed to the fronts of the edgeOut and edgeIn chains. @@ -882,23 +882,6 @@ class Dependencies { }; } - // inline auto anyInteriorDependents(IR::Loop *L, IR::Addr *out) -> bool { - // return std::ranges::any_of(out->outputEdgeIDs(*this), - // [&](int32_t i) -> bool { - // IR::Addr *a = output(Dependence::ID{i}); - // return (a->getLoop() != L) && - // L->contains(a); - // }); - // } - - // inline auto anyInteriorDependencies(IR::Loop *L, IR::Addr *in) -> bool { - - // return std::ranges::any_of(in->inputEdgeIDs(*this), [&](int32_t i) -> - // bool { - // IR::Addr *a = input(Dependence::ID{i}); - // return (a->getLoop() != L) && L->contains(a); - // }); - // } static auto innermostNonZero(PtrMatrix A, ptrdiff_t skip) -> ptrdiff_t { for (ptrdiff_t i = ptrdiff_t(A.numCol()); --i;) { @@ -1140,7 +1123,8 @@ class Dependencies { /// NOTE: this method uses `in` and `out` to check for reorderability, as /// these get rotated after the simplex solve, while the stored `DepPoly` and /// simplices do not. - inline auto determinePeelDepth(IR::Loop *, int32_t) -> bool; + inline auto determinePeelDepth(IR::Loop *, int32_t) + -> utils::Optional; }; } // namespace poly @@ -1268,7 +1252,8 @@ inline void Dependencies::copyDependencies(IR::Addr *src, IR::Addr *dst) { // `b[m] = x[0]`. The key observation here is that `x[0]` has a time component; // the violation occurs because we store in another location, providing a // non-reassociable component. -inline auto Dependencies::determinePeelDepth(IR::Loop *L, int32_t id) -> bool { +inline auto Dependencies::determinePeelDepth(IR::Loop *L, int32_t id) + -> utils::Optional { auto id_ = Dependence::ID{id}; IR::Addr *in = input(id_), *out = output(id_); // clang-format off @@ -1295,14 +1280,14 @@ inline auto Dependencies::determinePeelDepth(IR::Loop *L, int32_t id) -> bool { invariant(inInd.numRow() >= d); bool noInIndAtDepth = math::allZero(inInd[_, d]), noOutIndAtDepth = math::allZero(outInd[_, d]); - if (noInIndAtDepth == noOutIndAtDepth) return false; + if (noInIndAtDepth == noOutIndAtDepth) return -1; // now, we want to find a loop that `in` depends on but `out` does not // so that we can split over this loop. // For now, to simplify codegen, we only accept the innermost non-zero ptrdiff_t i = innermostNonZero(noInIndAtDepth ? inInd : outInd, d); - if (i < 0) return false; - getPeel(id_) = i; - return true; + if (i >= 0) getPeel(id_) = i; + return i >= 0 ? utils::Optional{size_t(i)} + : utils::Optional{}; } } // namespace poly From e454cc197a74d517c22e4ea7e82c1c92c85396c2 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Wed, 31 Jan 2024 01:48:04 -0500 Subject: [PATCH 100/112] simplify Legality for now; it can be extended later with fancier legalizations --- include/Optimize/Legality.hpp | 73 ++++++++++++++--------------------- 1 file changed, 29 insertions(+), 44 deletions(-) diff --git a/include/Optimize/Legality.hpp b/include/Optimize/Legality.hpp index 6b4d79953..91d21e42c 100644 --- a/include/Optimize/Legality.hpp +++ b/include/Optimize/Legality.hpp @@ -101,37 +101,39 @@ namespace poly::CostModeling { // For examples 2-3 above, we should have a concept of must-scalarize this // loop's execution, but that we can vectorize/reorder it within subloops. class Legality { - enum class Illegal : uint8_t { - None = 0, - Unroll = 1, - ReorderThis = 2, - ReorderSubLoops = 4 - }; + // enum class Illegal : uint8_t { + // None = 0, + // Unroll = 1, + // ReorderThis = 2, + // ReorderSubLoops = 4 + // }; uint16_t peelFlag{0}; - uint16_t mindistance{std::numeric_limits::max()}; - uint8_t maxdistance{0}; - uint8_t ordered_reduction_count{0}; - uint8_t unordered_reduction_count{0}; - uint8_t illegalFlag{0}; + // TODO: use min and max distance! + // uint16_t mindistance{std::numeric_limits::max()}; + // uint8_t maxdistance{0}; + uint16_t ordered_reduction_count{0}; + uint16_t unordered_reduction_count{0}; + bool reorderable{true}; + // uint8_t illegalFlag{0}; public: - [[nodiscard]] constexpr auto minDistance() const -> uint16_t { - return mindistance; - } - [[nodiscard]] constexpr auto maxDistance() const -> uint16_t { - return mindistance; - } - [[nodiscard]] constexpr auto noUnroll() const -> bool { - return illegalFlag & uint8_t(Illegal::Unroll); - } + // [[nodiscard]] constexpr auto minDistance() const -> uint16_t { + // return mindistance; + // } + // [[nodiscard]] constexpr auto maxDistance() const -> uint16_t { + // return maxdistance; + // } + // [[nodiscard]] constexpr auto noUnroll() const -> bool { + // return illegalFlag & uint8_t(Illegal::Unroll); + // } [[nodiscard]] constexpr auto canUnroll() const -> bool { return !noUnroll(); } constexpr auto operator&=(Legality other) -> Legality & { ordered_reduction_count += other.ordered_reduction_count; unordered_reduction_count += other.unordered_reduction_count; - mindistance = std::min(mindistance, other.mindistance); - maxdistance = std::max(maxdistance, other.maxdistance); + // mindistance = std::min(mindistance, other.mindistance); + // maxdistance = std::max(maxdistance, other.maxdistance); peelFlag |= other.peelFlag; - illegalFlag |= other.illegalFlag; + // illegalFlag |= other.illegalFlag; return *this; } [[nodiscard]] constexpr auto operator&(Legality other) const -> Legality { @@ -171,33 +173,16 @@ class Legality { // note: the dependence hasn't been rotated Dependence d{deps.get(Dependence::ID{did})}; IR::Addr *in = d.out, *out = d.in; - if (utils::Optional peel = deps.determinePeelDepth(L, did)) - peelFlag |= (1 << (*peel)); + utils::Optional peel = deps.determinePeelDepth(L, did); + if (peel) peelFlag |= (1 << (*peel)); if (d.revTimeEdge()) { bool reassociable = in->reassociableReductionPair() != out; if (reassociable) ++unordered_reduction_count; if (!reassociable) ++ordered_reduction_count; - return reassociable; - } - /// Now we check if we're allowed any reorderings - /// First of all, consider that unrolling is allowed if no memory accesses - /// dependent on the `in` or `out` are in a deeper loop (e.g. example 3), - /// even if vectorization is not. - if (canUnroll() && d.revTimeEdge() && deeperAccess(deps, L, in)) { - mindistance = 0; - maxdistance = std::numeric_limits::max(); - canPeel = false; - canUnroll = false; - return false; - } - if (mindistance || maxdistance != std::numeric_limits::max()) { - // for now, just check peelability - } - if (!canPeel) { - // then we have a dependence + return reorderable = reassociable || peel; } - return canPeel; + return reorderable = peel.hasValue(); }; Legality(LoopDepSatisfaction &deps, IR::Loop *L) { From 82211274fe1b7ffc18d428e34d46a928140da907 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Wed, 31 Jan 2024 18:32:14 -0500 Subject: [PATCH 101/112] minor progress --- include/IR/Node.hpp | 32 ++++++++------------------------ include/Optimize/Legality.hpp | 13 +++++++------ 2 files changed, 15 insertions(+), 30 deletions(-) diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index c62ed3076..acf4bd8f1 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -4,6 +4,7 @@ #include "Containers/UnrolledList.hpp" #include "IR/InstructionCost.hpp" #include "IR/Users.hpp" +#include "Optimize/Legality.hpp" #include "Polyhedra/Loops.hpp" #include "Support/Iterators.hpp" #include "Utilities/ListRanges.hpp" @@ -287,20 +288,12 @@ static_assert(sizeof(Node) == 4 * sizeof(Node *) + 8); /// last is the last instruction in the body /// exit is the associated exit block class Loop : public Node { - // TOOD: this is to be replaced with - // the `Legality` struct - enum LegalTransforms { - Unknown = 0, - DependenceFree = 1, - IndexMismatch = 2, - None = 3 - }; poly::Loop *affineLoop{nullptr}; Node *last{nullptr}; /// loopMeta's leading 2 bits give `LegalTransforms` /// remaining 30 bits give an ID to the loop. /// IDs are in topologically sorted order. - uint32_t loopMeta; + CostModeling::Legality legality{}; int32_t edgeId{-1}; // LegalTransforms legal{Unknown}; // while `child` points to the first contained instruction, @@ -308,23 +301,11 @@ class Loop : public Node { // and can be used for backwards iteration over the graph. public: - constexpr void setMeta(uint32_t m) { loopMeta = m; } - [[nodiscard]] constexpr auto getID() const -> uint32_t { - return loopMeta & 0x3FFFFFFF; - } - [[nodiscard]] constexpr auto getLegal() const -> LegalTransforms { - return static_cast(loopMeta >> 30); - } - constexpr auto setLegal(LegalTransforms l) -> LegalTransforms { - loopMeta = (loopMeta & 0x3FFFFFFF) | (static_cast(l) << 30); - return l; - } [[nodiscard]] constexpr auto edges(poly::PtrVector edges) const -> utils::VForwardRange { return utils::VForwardRange{edges, edgeId}; } - constexpr Loop(unsigned d) - : Node{VK_Loop, d}, loopMeta{std::numeric_limits::max()} {} + constexpr Loop(unsigned d) : Node{VK_Loop, d} {} constexpr Loop(unsigned d, poly::Loop *AL) : Node{VK_Loop, d}, affineLoop{AL} {} static constexpr auto classof(const Node *v) -> bool { @@ -392,8 +373,11 @@ class Loop : public Node { L = L->getOuterLoop(); return L; } - inline auto getLegality(const poly::Dependencies &, math::PtrVector) - -> LegalTransforms; + constexpr auto getLegality() -> CostModeling::Legality { return legality; } + inline void setLegality(CostModeling::LoopDepSatisfaction &deps) { + for (int32_t did : deps.dependencyIDs(this)) + if (!legality.update(deps.deps, this, did)) break; + } }; [[nodiscard]] inline constexpr auto Node::getLoop() const noexcept -> Loop * { if (!parent || (parent->kind != VK_Loop)) return nullptr; diff --git a/include/Optimize/Legality.hpp b/include/Optimize/Legality.hpp index 91d21e42c..bdf03b7e8 100644 --- a/include/Optimize/Legality.hpp +++ b/include/Optimize/Legality.hpp @@ -126,7 +126,8 @@ class Legality { // [[nodiscard]] constexpr auto noUnroll() const -> bool { // return illegalFlag & uint8_t(Illegal::Unroll); // } - [[nodiscard]] constexpr auto canUnroll() const -> bool { return !noUnroll(); } + // [[nodiscard]] constexpr auto canUnroll() const -> bool { return + // !noUnroll(); } constexpr auto operator&=(Legality other) -> Legality & { ordered_reduction_count += other.ordered_reduction_count; unordered_reduction_count += other.unordered_reduction_count; @@ -136,12 +137,17 @@ class Legality { // illegalFlag |= other.illegalFlag; return *this; } + constexpr auto operator=(const Legality &) -> Legality & = default; [[nodiscard]] constexpr auto operator&(Legality other) const -> Legality { Legality l{*this}; return l &= other; } constexpr Legality() = default; constexpr Legality(const Legality &) = default; + Legality(LoopDepSatisfaction &deps, IR::Loop *L) { + for (int32_t did : deps.dependencyIDs(L)) + if (!update(deps.deps, L, did)) break; + } // deeperAccess(const poly::Dependencies &deps, IR::Loop *L, IR::Addr *in) // are any of the outputs of `in` in a subloop of `L` static auto deeperAccess(const poly::Dependencies &deps, IR::Loop *L, @@ -184,11 +190,6 @@ class Legality { } return reorderable = peel.hasValue(); }; - - Legality(LoopDepSatisfaction &deps, IR::Loop *L) { - for (int32_t did : deps.dependencyIDs(L)) - if (!update(deps.deps, L, did)) break; - } }; static_assert(sizeof(Legality) == 8); } // namespace poly::CostModeling From cbdff4a040336ef79ac649093e0f8000ba130098 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Thu, 1 Feb 2024 13:23:21 -0500 Subject: [PATCH 102/112] order fixes --- include/IR/Node.hpp | 10 ++---- include/Optimize/CostModeling.hpp | 40 +++++++++++++++++++--- include/Optimize/Legality.hpp | 57 ++++++++++++++----------------- include/Polyhedra/Dependence.hpp | 23 ------------- 4 files changed, 64 insertions(+), 66 deletions(-) diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index acf4bd8f1..4c6b4cf1d 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -290,11 +290,9 @@ static_assert(sizeof(Node) == 4 * sizeof(Node *) + 8); class Loop : public Node { poly::Loop *affineLoop{nullptr}; Node *last{nullptr}; - /// loopMeta's leading 2 bits give `LegalTransforms` - /// remaining 30 bits give an ID to the loop. /// IDs are in topologically sorted order. CostModeling::Legality legality{}; - int32_t edgeId{-1}; + int32_t edgeId{-1}; // edge cycle id // LegalTransforms legal{Unknown}; // while `child` points to the first contained instruction, // `last` points to the last contained instruction, @@ -374,11 +372,9 @@ class Loop : public Node { return L; } constexpr auto getLegality() -> CostModeling::Legality { return legality; } - inline void setLegality(CostModeling::LoopDepSatisfaction &deps) { - for (int32_t did : deps.dependencyIDs(this)) - if (!legality.update(deps.deps, this, did)) break; - } + inline void setLegality(CostModeling::LoopDepSatisfaction &deps); }; + [[nodiscard]] inline constexpr auto Node::getLoop() const noexcept -> Loop * { if (!parent || (parent->kind != VK_Loop)) return nullptr; return static_cast(parent); diff --git a/include/Optimize/CostModeling.hpp b/include/Optimize/CostModeling.hpp index e2776ad69..88ba324ed 100644 --- a/include/Optimize/CostModeling.hpp +++ b/include/Optimize/CostModeling.hpp @@ -5,6 +5,7 @@ #include "IR/Address.hpp" #include "LinearProgramming/LoopBlock.hpp" #include "LinearProgramming/ScheduledNode.hpp" +#include "Optimize/Legality.hpp" #include "Polyhedra/Dependence.hpp" #include #include @@ -28,7 +29,8 @@ #include #include #include -namespace poly::IR { +namespace poly { +namespace IR { /// If this is a store of a reassocialbe reduction, this sets the /// `reassociableReduction` field to the corresponding load, and that field of /// the load to `this` store. @@ -106,8 +108,8 @@ Addr::maybeReassociableReduction(const Dependencies &deps) { dst->reassociableReduction = this; } -} // namespace poly::IR -namespace poly::CostModeling { +} // namespace IR +namespace CostModeling { using poly::Dependence; // struct CPUExecutionModel {}; @@ -412,7 +414,7 @@ inline auto buildSubGraph(const IR::Dependencies &deps, IR::Loop *root, // top sorting as we recurse out for (IR::Loop *child : root->subLoops()) id = buildSubGraph(deps, child, depth + 1, id); - root->setMeta(id++); + // root->setMeta(id++); // The very outer `root` needs to have all instr constituents // we also need to add the last instruction of each loop as `last` @@ -479,6 +481,26 @@ struct LoopDepSatisfaction { return dependencyIDs(L) | deps.getEdgeTransform(); } }; +inline Legality::Legality(LoopDepSatisfaction &deps, IR::Loop *L) { + for (int32_t did : deps.dependencyIDs(L)) + if (!update(deps.deps, L, did)) break; +} +inline auto Legality::update(poly::Dependencies &deps, IR::Loop *L, int32_t did) + -> bool { + // note: the dependence hasn't been rotated + Dependence d{deps.get(Dependence::ID{did})}; + IR::Addr *in = d.out, *out = d.in; + utils::Optional peel = deps.determinePeelDepth(L, did); + if (peel) peelFlag |= (1 << (*peel)); + + if (d.revTimeEdge()) { + bool reassociable = in->reassociableReductionPair() != out; + if (reassociable) ++unordered_reduction_count; + if (!reassociable) ++ordered_reduction_count; + return reorderable = reassociable || peel; + } + return reorderable = peel.hasValue(); +}; class IROptimizer { IR::Dependencies &deps; @@ -920,3 +942,13 @@ out << "}\n"; // [[no_unique_address]] Arena<> *allocator; // }; } // namespace poly::CostModeling + +namespace IR { + +inline void Loop::setLegality(CostModeling::LoopDepSatisfaction &deps) { + for (int32_t did : deps.dependencyIDs(this)) + if (!legality.update(deps.deps, this, did)) break; +} + +} // namespace IR +} // namespace poly diff --git a/include/Optimize/Legality.hpp b/include/Optimize/Legality.hpp index bdf03b7e8..71e1a03d9 100644 --- a/include/Optimize/Legality.hpp +++ b/include/Optimize/Legality.hpp @@ -2,12 +2,20 @@ #ifndef POLY_LEGALITY_HPP_INCLUDED #define POLY_LEGALITY_HPP_INCLUDED -#include "Optimize/CostModeling.hpp" -#include "Polyhedra/Dependence.hpp" -#include #include -namespace poly::CostModeling { +namespace poly { +namespace IR { +class Loop; +class Addr; +}; // namespace IR +namespace poly { +struct Dependence; +class Dependencies; +}; // namespace poly +namespace CostModeling { + +struct LoopDepSatisfaction; // If a loop doesn't carry a dependency, it is legal // If a loop does carry a dependency, we can still consider @@ -144,20 +152,18 @@ class Legality { } constexpr Legality() = default; constexpr Legality(const Legality &) = default; - Legality(LoopDepSatisfaction &deps, IR::Loop *L) { - for (int32_t did : deps.dependencyIDs(L)) - if (!update(deps.deps, L, did)) break; - } + Legality(LoopDepSatisfaction &deps, IR::Loop *L); // deeperAccess(const poly::Dependencies &deps, IR::Loop *L, IR::Addr *in) // are any of the outputs of `in` in a subloop of `L` - static auto deeperAccess(const poly::Dependencies &deps, IR::Loop *L, - IR::Addr *in) -> bool { - return std::ranges::any_of(in->outputEdgeIDs(deps), - [&](int32_t id) -> bool { - IR::Addr *a = deps.output(Dependence::ID{id}); - return (a->getLoop() != L) && L->contains(a); - }); - } + // static auto deeperAccess(const poly::Dependencies &deps, IR::Loop *L, + // IR::Addr *in) -> bool { + // return std::ranges::any_of(in->outputEdgeIDs(deps), + // [&](int32_t id) -> bool { + // IR::Addr *a = + // deps.output(Dependence::ID{id}); return + // (a->getLoop() != L) && L->contains(a); + // }); + // } // inline auto anyInteriorDependents(IR::Loop *L, IR::Addr *out) -> bool { // return std::ranges::any_of(out->outputEdgeIDs(*this), // [&](int32_t i) -> bool { @@ -175,22 +181,9 @@ class Legality { // return (a->getLoop() != L) && L->contains(a); // }); // } - auto update(poly::Dependencies &deps, IR::Loop *L, int32_t did) -> bool { - // note: the dependence hasn't been rotated - Dependence d{deps.get(Dependence::ID{did})}; - IR::Addr *in = d.out, *out = d.in; - utils::Optional peel = deps.determinePeelDepth(L, did); - if (peel) peelFlag |= (1 << (*peel)); - - if (d.revTimeEdge()) { - bool reassociable = in->reassociableReductionPair() != out; - if (reassociable) ++unordered_reduction_count; - if (!reassociable) ++ordered_reduction_count; - return reorderable = reassociable || peel; - } - return reorderable = peel.hasValue(); - }; + auto update(poly::Dependencies &deps, IR::Loop *L, int32_t did) -> bool; }; static_assert(sizeof(Legality) == 8); -} // namespace poly::CostModeling +} // namespace CostModeling +} // namespace poly #endif // POLY_LEGALITY_HPP_INCLUDED diff --git a/include/Polyhedra/Dependence.hpp b/include/Polyhedra/Dependence.hpp index 6f5283809..059747c48 100644 --- a/include/Polyhedra/Dependence.hpp +++ b/include/Polyhedra/Dependence.hpp @@ -1189,29 +1189,6 @@ inline void IR::Addr::drop(Dependencies &deps) { } using math::StridedVector; -inline auto Loop::getLegality(const poly::Dependencies &deps, - math::PtrVector loopDeps) - -> LegalTransforms { - const auto legal = getLegal(); - if (legal != Unknown) return legal; - if (edgeId < 0) return setLegal(DependenceFree); - if (this->currentDepth == 0) return setLegal(None); - ptrdiff_t loop = this->currentDepth - 1; - for (int32_t id : edges(loopDeps)) { - Dependence::ID i{id}; - StridedVector in = deps.input(i)->indexMatrix()[_, loop], - out = deps.output(i)->indexMatrix()[_, loop]; - invariant(in.size(), out.size()); - if (in != out) return setLegal(IndexMismatch); - // ptrdiff_t common = std::min(in.size(), out.size()); - // if ((in[_(0, common)] != out[_(0, common)]) || - // math::anyNEZero(((in.size() > out.size() ? in : out)[_(common, - // end)]))) - // return legal = IndexMismatch; - } - return setLegal(None); -} -// } // namespace IR namespace poly { From 7d4f167467df618ccad5c087158f90a8fa7e1a37 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Thu, 1 Feb 2024 13:26:21 -0500 Subject: [PATCH 103/112] relicense --- LICENSE | 236 +++++--------------------------------------------------- 1 file changed, 20 insertions(+), 216 deletions(-) diff --git a/LICENSE b/LICENSE index 94472c35c..2c88274e8 100644 --- a/LICENSE +++ b/LICENSE @@ -1,222 +1,26 @@ -============================================================================== -The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: -============================================================================== +MIT License - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +Copyright (c) 2021-2024: Chris Elrod, Yingbo Ma, JuliaHub, and other contributors: https://github.com/LoopModels/LoopModels/graphs/contributors - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: - 1. Definitions. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +end of terms and conditions - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - ----- LLVM Exceptions to the Apache 2.0 License ---- - -As an exception, if, as a result of your compiling your source code, portions -of this Software are embedded into an Object form of such source code, you -may redistribute such embedded portions in such Object form without complying -with the conditions of Sections 4(a), 4(b) and 4(d) of the License. - -In addition, if you combine or link compiled forms of this Software with -software that is licensed under the GPLv2 ("Combined Software") and if a -court of competent jurisdiction determines that the patent provision (Section -3), the indemnity provision (Section 9) or other Section of the License -conflicts with the conditions of the GPLv2, you may retroactively and -prospectively choose to deem waived or otherwise exclude such Section(s) of -the License, but only in their entirety and only with respect to the Combined -Software. +Please see [THIRDPARTY.md](./THIRDPARTY.md) for license information for other software used in this project. From 05b0f3fb444de4c5e15bd711c058f8237b5b64f3 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Fri, 2 Feb 2024 01:16:05 -0500 Subject: [PATCH 104/112] modify a couple comments; note we should probably accumulate latencies as we find reassociable pairs, as finding the path through the graph isn't necessarilly a trivial operation; no sense finding it twice. --- include/IR/Instruction.hpp | 1 + include/Optimize/CostFunction.hpp | 20 +++++++------------- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/include/IR/Instruction.hpp b/include/IR/Instruction.hpp index e3e96a18d..33188846b 100644 --- a/include/IR/Instruction.hpp +++ b/include/IR/Instruction.hpp @@ -850,6 +850,7 @@ constexpr auto find(Addr *src, Compute *dst) -> bool { }); } // from dst, search through operands for `src` +// TODO: accumulate latency as we go! // NOLINTNEXTLINE misc-no-recursion constexpr auto findThroughReassociable(Addr *src, Compute *dst) -> unsigned { invariant(src->isLoad()); diff --git a/include/Optimize/CostFunction.hpp b/include/Optimize/CostFunction.hpp index f0e1fee0a..20a6b9f0f 100644 --- a/include/Optimize/CostFunction.hpp +++ b/include/Optimize/CostFunction.hpp @@ -565,24 +565,18 @@ class LoopTreeCostFn { if (SL) iterLoopLevel(deps, SL, maxl2VF, TTI, ++depth, exitCount); else leafCosts(deps, L, maxl2VF, TTI); } - // checks a loop for legality of vectorization and unrolling - void checkLegality(LoopDepSatisfaction deps, IR::Loop *L) { - bool canVectorize = true, canUnroll = true; - for (poly::Dependence d : deps.depencencies(L)) { - // analyze d - canVectorize = false; - } - } - void leafCosts(LoopDepSatisfaction deps, IR::Loop *L, unsigned maxl2VF, const llvm::TargetTransformInfo &TTI) { // TODO: if (!SL) we're in a leaf, and need compute latency // We use the `IROptimizer::loopDepSats` to check the depencencies held at // the loop. We check these for those that look like reductions that are - // legal to reassociate, e.g. integer add chains or floating point with the - // reassociate FMF set. We can also calculate the latency while walking the - // chain. Note that in our IR, dependencies may look something like this - // after load/store hoisting: for (j in J){ // arbitrary number of outer + // legal to reassociate (we check this earlier and set + // `in->reassociableReductionPair()==out`), e.g. integer add chains or + // floating point with the reassociate FMF set. + // TODO: cache the latency while walking the chain, then look it up here. + // Note that in our IR, dependencies may look something like this + // after load/store hoisting: + // for (j in J){ // arbitrary number of outer // loops // %w = %array[j...]; // %x = foo(%w); From 2bfde9812d7c4b1fe21ef1eea5400d9cb4e77100 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Sun, 4 Feb 2024 01:26:33 -0500 Subject: [PATCH 105/112] minor progress --- include/IR/Instruction.hpp | 39 +++++++++++++++++++++++-------- include/IR/Node.hpp | 5 ++++ include/Optimize/CostFunction.hpp | 29 ++++++++++++++++------- include/Optimize/CostModeling.hpp | 2 +- include/Optimize/RegisterFile.hpp | 39 +++++++++++++++++-------------- 5 files changed, 77 insertions(+), 37 deletions(-) diff --git a/include/IR/Instruction.hpp b/include/IR/Instruction.hpp index 33188846b..7ba6ff22c 100644 --- a/include/IR/Instruction.hpp +++ b/include/IR/Instruction.hpp @@ -259,8 +259,6 @@ class Compute : public Instruction { return true; } - /// fall back in case we need value operand - // [[nodiscard]] auto isValue() const -> bool { return id.isValue(); } auto getCost(const llvm::TargetTransformInfo &TTI, VectorWidth W) -> RecipThroughputLatency { RecipThroughputLatency c = costs[W]; @@ -841,16 +839,25 @@ inline void Instruction::setOperands(Arena<> *alloc, // llvm::Intrinsic::IndependentIntrinsics x = llvm::Intrinsic::sqrt; // llvm::Intrinsic::IndependentIntrinsics y = llvm::Intrinsic::sin; +constexpr auto findComp(Addr *src, Compute *dst) -> bool; +// NOLINTNEXTLINE misc-no-recursion +constexpr auto find(Addr *src, Value *op) { + auto *c = llvm::dyn_cast(op); + return c && findComp(src, c); +} + /// Defined here, because we're using `Compute` -constexpr auto find(Addr *src, Compute *dst) -> bool { +// NOLINTNEXTLINE misc-no-recursion +constexpr auto findComp(Addr *src, Compute *dst) -> bool { return std::ranges::any_of(dst->getOperands(), [=](Value *op) -> bool { - if (op == src) return true; - if (auto *c = llvm::dyn_cast(op)) return find(src, c); - return false; + if (op != src && !find(src, op)) return false; + static_cast(op)->linkReductionDst(dst); + return true; }); } // from dst, search through operands for `src` // TODO: accumulate latency as we go! +// Maybe store visited, to avoid potentially revisiting? // NOLINTNEXTLINE misc-no-recursion constexpr auto findThroughReassociable(Addr *src, Compute *dst) -> unsigned { invariant(src->isLoad()); @@ -860,10 +867,22 @@ constexpr auto findThroughReassociable(Addr *src, Compute *dst) -> unsigned { unsigned foundflag = 0; for (Value *op : dst->getOperands()) { auto *c = llvm::dyn_cast(op); - if (reassociable & 1) - if (op == src) foundflag |= 1; - else foundflag |= findThroughReassociable(src, c); - else if ((op == src) || (c && find(src, c))) return 0x2; + bool found{false}; + if (reassociable & 1) { + if (op == src) { + foundflag |= 1; + found = true; + } else if (c) { + unsigned f = findThroughReassociable(src, c); + if (!f) continue; + foundflag |= f; + found = true; + } + } else if ((op == src) || (c && findComp(src, c))) { + found = true; + foundflag = 0x2; + } + if (found) static_cast(op)->linkReductionDst(dst); if (foundflag & 2) return 0x2; reassociable >>= 1; } diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index 4c6b4cf1d..14c666e02 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -475,6 +475,7 @@ class Instruction : public Value { constexpr Instruction(ValKind kind_, unsigned curDepth, unsigned natDepth, unsigned maxDepth_) : Value(kind_, curDepth, natDepth, maxDepth_) {} + Instruction *reductionDst{nullptr}; public: static constexpr auto classof(const Node *v) -> bool { @@ -489,6 +490,10 @@ class Instruction : public Value { // declarations [[nodiscard]] auto getIdentifier() const -> Identifier; inline void setOperands(Arena<> *alloc, math::PtrVector); + constexpr void linkReductionDst(Instruction *op) { reductionDst = op; } + constexpr auto getReductionDst() const -> Instruction * { + return reductionDst; + } }; static_assert(std::is_copy_assignable_v); diff --git a/include/Optimize/CostFunction.hpp b/include/Optimize/CostFunction.hpp index 20a6b9f0f..20a1d0aa8 100644 --- a/include/Optimize/CostFunction.hpp +++ b/include/Optimize/CostFunction.hpp @@ -5,6 +5,7 @@ #include "IR/Node.hpp" #include "IR/OrthogonalAxes.hpp" #include "Optimize/CostModeling.hpp" +#include "Optimize/RegisterFile.hpp" #include "Polyhedra/Dependence.hpp" #include #include @@ -14,6 +15,7 @@ #include #include #include +#include namespace poly::CostModeling { using containers::Pair; using math::AbstractVector, math::AbstractMatrix, math::DensePtrMatrix, math::_; @@ -258,6 +260,7 @@ auto compcosts(const AbstractMatrix auto &invunrolls, // in which case unrolling the loops they don't depend on will help. // Thus, it would probably be best to handle these with code // similar to the memory cost-fun above, ideally we can abstract away the core. +// /// memcost = I*J*(Ui*Uj*C_{Al} + Uj*C_{yl}) / (Ui*Uj) + /// I*(C_{xl}*Ui + C_{xs}*Ui) / Ui /// cthroughput = I*J*(Ui*Uj*C_{t,fma}) / (Ui*Uj) + I*(Ui*C_{t,add}*(Uj-1)) / @@ -265,6 +268,7 @@ auto compcosts(const AbstractMatrix auto &invunrolls, /// I*C_{l,add}*log2(Uj) /// /// Here, we define a cost fn that can be optimized to produce +/// /// vectorization and unrolling factors. /// We assemble all addrs into a vector, sorted by depth first traversal order /// of the loop tree, e.g. @@ -465,10 +469,15 @@ auto compcosts(const AbstractMatrix auto &invunrolls, /// /// /// class LoopTreeCostFn { + // counts per loop, indicating how many of each of the following three fields math::Vector cost_counts{}; + // orthogonal axes and costs math::Vector orth_axes{}; + // non-orthogonal axes and costs math::Vector>> conv_axes{}; + // compute cost summary math::Vector> compute_independence{}; + // for leaves, we need latency information math::Vector>> leafs{}; unsigned maxVectorWidth; ptrdiff_t max_depth{}; @@ -573,9 +582,10 @@ class LoopTreeCostFn { // legal to reassociate (we check this earlier and set // `in->reassociableReductionPair()==out`), e.g. integer add chains or // floating point with the reassociate FMF set. - // TODO: cache the latency while walking the chain, then look it up here. - // Note that in our IR, dependencies may look something like this - // after load/store hoisting: + // When we have reductions, we have src->dst chains stored through + // `linkReductionDst()` that can be used for accumulating latencies. + // FIXME (maybe): Current implementation only allows each instruction to be + // a part of 1 chain. // for (j in J){ // arbitrary number of outer // loops // %w = %array[j...]; @@ -587,9 +597,11 @@ class LoopTreeCostFn { // %array[j...] = %z; // } // Rather than using PhiNodes, we represent dependencies through addresses. - bool vectorizationLegal = true, unrollLegal = true; + // we can get legality from the loop. + CostModeling::Legality legality = L->getLegality(); for (poly::Dependence d : deps.depencencies(L)) { - // is + IR::Addr *in = d.input(), *out=d.output(); + // instruction latency can be a function of vector width } // for (IR::Node *N = L->getChild(); N; N = N->getNext()) {} return; @@ -673,14 +685,15 @@ class LoopTreeCostFn { return c; } void init(LoopDepSatisfaction deps, IR::Loop *root, unsigned maxl2VF, - const llvm::TargetTransformInfo &TTI) { + llvm::LLVMContext &C, const llvm::TargetTransformInfo &TTI) { clear(); // max_depth = 0; + maxVectorWidth = RegisterFile::estimateMaximumVectorWidth(C, TTI); iterLoopLevel(deps, root->getSubLoop(), maxl2VF, TTI, 0, 0); } LoopTreeCostFn(LoopDepSatisfaction deps, IR::Loop *root, unsigned maxVF, - const llvm::TargetTransformInfo &TTI) + llvm::LLVMContext &C, const llvm::TargetTransformInfo &TTI) : maxVectorWidth{unsigned(1) << maxVF} { - init(deps, root, maxVF, TTI); + init(deps, root, maxVF, C, TTI); } }; diff --git a/include/Optimize/CostModeling.hpp b/include/Optimize/CostModeling.hpp index 88ba324ed..5ce42dd00 100644 --- a/include/Optimize/CostModeling.hpp +++ b/include/Optimize/CostModeling.hpp @@ -941,7 +941,7 @@ out << "}\n"; // class LoopForestSchedule : LoopTreeSchedule { // [[no_unique_address]] Arena<> *allocator; // }; -} // namespace poly::CostModeling +} // namespace CostModeling namespace IR { diff --git a/include/Optimize/RegisterFile.hpp b/include/Optimize/RegisterFile.hpp index 62bbb37de..3ede8b7d6 100644 --- a/include/Optimize/RegisterFile.hpp +++ b/include/Optimize/RegisterFile.hpp @@ -5,6 +5,26 @@ #include #include +namespace poly::RegisterFile { +// returns vector width in bytes, ignoring mprefer-vector-width +inline auto estimateMaximumVectorWidth(llvm::LLVMContext &C, + const llvm::TargetTransformInfo &TTI) + -> uint8_t { + uint8_t twiceMaxVectorWidth = 2; + auto *f32 = llvm::Type::getFloatTy(C); + llvm::InstructionCost prevCost = TTI.getArithmeticInstrCost( + llvm::Instruction::FAdd, + llvm::FixedVectorType::get(f32, twiceMaxVectorWidth)); + while (true) { + llvm::InstructionCost nextCost = TTI.getArithmeticInstrCost( + llvm::Instruction::FAdd, + llvm::FixedVectorType::get(f32, twiceMaxVectorWidth *= 2)); + if (nextCost > prevCost) break; + prevCost = nextCost; + } + return 2 * twiceMaxVectorWidth; +} + class CPURegisterFile { uint8_t maximumVectorWidth; uint8_t numVectorRegisters; @@ -35,24 +55,6 @@ class CPURegisterFile { if (hasAVX512(C, TTI)) return 7; // 7, because k0 is reserved for unmasked return 0; } - // returns vector width in bytes, ignoring mprefer-vector-width - static auto estimateMaximumVectorWidth(llvm::LLVMContext &C, - const llvm::TargetTransformInfo &TTI) - -> uint8_t { - uint8_t twiceMaxVectorWidth = 2; - auto *f32 = llvm::Type::getFloatTy(C); - llvm::InstructionCost prevCost = TTI.getArithmeticInstrCost( - llvm::Instruction::FAdd, - llvm::FixedVectorType::get(f32, twiceMaxVectorWidth)); - while (true) { - llvm::InstructionCost nextCost = TTI.getArithmeticInstrCost( - llvm::Instruction::FAdd, - llvm::FixedVectorType::get(f32, twiceMaxVectorWidth *= 2)); - if (nextCost > prevCost) break; - prevCost = nextCost; - } - return 2 * twiceMaxVectorWidth; - } public: CPURegisterFile(llvm::LLVMContext &C, const llvm::TargetTransformInfo &TTI) { @@ -75,4 +77,5 @@ class CPURegisterFile { } }; +} // namespace poly::RegisterFile #endif // RegisterFile_hpp_INCLUDED From 6ae72b73f735f0f78b11e1e08631b7b5512bd5e3 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Sun, 4 Feb 2024 05:43:45 -0500 Subject: [PATCH 106/112] minor progress --- include/IR/Address.hpp | 5 +++++ include/IR/Instruction.hpp | 11 +++++++++++ include/Optimize/CostFunction.hpp | 18 ++++++++++++++++-- include/Optimize/Legality.hpp | 7 +++++++ 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/include/IR/Address.hpp b/include/IR/Address.hpp index b353e5279..862c49068 100644 --- a/include/IR/Address.hpp +++ b/include/IR/Address.hpp @@ -16,9 +16,11 @@ #include #include #include +#include #include #include #include +#include namespace poly { namespace lp { @@ -643,6 +645,9 @@ class Addr : public Instruction { if (std::optional o = scalar.getValue()) dc = *o; return {dc, dd, ds}; } + inline auto reductionLatency(const llvm::TargetTransformInfo &TTI, + unsigned vectorWidth) + -> llvm::InstructionCost::CostType; /// drop `this` and remove it from `Dependencies` inline void drop(Dependencies &); diff --git a/include/IR/Instruction.hpp b/include/IR/Instruction.hpp index 7ba6ff22c..cdf991a49 100644 --- a/include/IR/Instruction.hpp +++ b/include/IR/Instruction.hpp @@ -888,6 +888,17 @@ constexpr auto findThroughReassociable(Addr *src, Compute *dst) -> unsigned { } return foundflag; } + +inline auto Addr::reductionLatency(const llvm::TargetTransformInfo &TTI, + unsigned vectorWidth) + -> llvm::InstructionCost::CostType { + llvm::InstructionCost::CostType latency{0}; + for (Instruction *d = getReductionDst(); d; d = d->getReductionDst()) + if (Compute *c = llvm::dyn_cast(d)) + latency += c->calcCost(TTI, vectorWidth).latency; + return latency; +} + } // namespace poly::IR [[nodiscard]] inline auto diff --git a/include/Optimize/CostFunction.hpp b/include/Optimize/CostFunction.hpp index 20a1d0aa8..1e46e5a4b 100644 --- a/include/Optimize/CostFunction.hpp +++ b/include/Optimize/CostFunction.hpp @@ -15,7 +15,10 @@ #include #include #include +#include +#include #include +#include namespace poly::CostModeling { using containers::Pair; using math::AbstractVector, math::AbstractMatrix, math::DensePtrMatrix, math::_; @@ -598,11 +601,22 @@ class LoopTreeCostFn { // } // Rather than using PhiNodes, we represent dependencies through addresses. // we can get legality from the loop. - CostModeling::Legality legality = L->getLegality(); + // The tricker thing to compute here is register pressure + llvm::InstructionCost::CostType latency{0}; for (poly::Dependence d : deps.depencencies(L)) { - IR::Addr *in = d.input(), *out=d.output(); // instruction latency can be a function of vector width + latency = + std::max(latency, d.input()->reductionLatency(TTI, maxVectorWidth)); } + CostModeling::Legality legality = L->getLegality(); + uint16_t l = std::numeric_limits::max(); + if (l > latency) l = latency; + // for reg use, lets add register dep flag + // what kind of traversal would minimize width? + // breadth-first lets us retire early, but can increase + // live count? + // Note, every reduction must add register contribution. + leafs.emplace_back(regUse, {l, legality.numReductions()}); // for (IR::Node *N = L->getChild(); N; N = N->getNext()) {} return; }; diff --git a/include/Optimize/Legality.hpp b/include/Optimize/Legality.hpp index 71e1a03d9..b84b8c0d7 100644 --- a/include/Optimize/Legality.hpp +++ b/include/Optimize/Legality.hpp @@ -182,6 +182,13 @@ class Legality { // }); // } auto update(poly::Dependencies &deps, IR::Loop *L, int32_t did) -> bool; + constexpr auto numReductions() const -> uint16_t { + uint16_t numReduct; + if (__builtin_add_overflow(ordered_reduction_count, + unordered_reduction_count, &numReduct)) + return std::numeric_limits::max(); + return numReduct; + } }; static_assert(sizeof(Legality) == 8); } // namespace CostModeling From 555dd9655271a9c8d0807b16263a0f454d9a816d Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Sun, 4 Feb 2024 17:23:58 -0500 Subject: [PATCH 107/112] add top sort idx to nodes --- include/IR/Node.hpp | 14 ++++++---- include/Optimize/CostFunction.hpp | 43 ++++++++++++++++++++++--------- include/Optimize/CostModeling.hpp | 27 ++++++++----------- 3 files changed, 51 insertions(+), 33 deletions(-) diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index 14c666e02..de86c2a83 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -124,10 +124,7 @@ class Node { uint8_t visitDepth{255}; uint8_t maxDepth; // memory allocated to support up to this depth bool dependsOnParentLoop_{false}; - // 7 bytes; we have 1 left! - // uint16_t index_; - // uint16_t lowLink_; - // uint16_t bitfield; + uint16_t topologicalIndex{0}; constexpr Node(ValKind kind_) : kind(kind_) {} constexpr Node(ValKind kind_, unsigned depth) @@ -162,7 +159,14 @@ class Node { [[nodiscard]] constexpr auto sameBlock(const Node *other) const -> bool { return other && other->parent == parent && other->child == child; } - + constexpr void setTopIndex(uint16_t idx) { topologicalIndex = idx; } + constexpr auto getTopIndex() const -> uint16_t { return topologicalIndex; } + constexpr auto isAfter(Node *v) const -> bool { + return topologicalIndex > v->getTopIndex(); + } + constexpr auto isBefore(Node *v) const -> bool { + return topologicalIndex < v->getTopIndex(); + } // [[nodiscard]] constexpr auto wasVisited() const -> bool { // return bitfield & 0x1; // } diff --git a/include/Optimize/CostFunction.hpp b/include/Optimize/CostFunction.hpp index 1e46e5a4b..618decf8a 100644 --- a/include/Optimize/CostFunction.hpp +++ b/include/Optimize/CostFunction.hpp @@ -209,8 +209,8 @@ constexpr auto cost(const AbstractMatrix auto &invunrolls, MemCostSummary orth, // We need to define an unroll ordering. struct RegisterUseByUnroll { - math::PtrVector> masks; // coef, mask pairs - unsigned register_count; // includes constant offset + math::Vector> masks{}; // coef, mask pairs + unsigned register_count; // includes constant offset [[nodiscard]] constexpr auto begin() const -> const std::array * { return masks.begin(); @@ -235,27 +235,46 @@ constexpr auto registerPressure(const AbstractMatrix auto &invunrolls, return 0.25 * math::softplus(8.0 * (acc - r.register_count)); } -auto memcosts( - const AbstractMatrix auto &invunrolls, VectorizationFactor vf, - math::PtrVector> orth_axes) { +inline auto registerUse(const llvm::TargetTransformInfo &TTI, IR::Loop *L) + -> RegisterUseByUnroll { + RegisterUseByUnroll u; + // Ideally, we'd have the transitive closure of depencencies, or better yet + // top-sorted IDs for quick checks on relative order w/ respect to the current + // top-sorting. + // E.g. ID_x < ID_y proves it is legal for ID_x to be first, but does not + // prove the opposite is illegal. The weak proof may often be enough. "better + // yet" is because the check is very efficient, not because it is powerful. + // For a somewhat-efficient check of the former variety, we'd probably want + // to use `BitSet`s + canonical ID-values (not position-based) for each + // `Value`, which is something we could do if switching to a more + // data-oriented design. + // The simple top-index check is enough for checking if something is infront, + // behind, or within a loop. + return u; +} + +inline auto +memcosts(const AbstractMatrix auto &invunrolls, VectorizationFactor vf, + math::PtrVector> orth_axes) { utils::eltype_t ic{}; for (auto [oa, mc] : orth_axes) ic += cost(invunrolls, oa, mc, vf); return ic; } -auto memcosts( - const AbstractMatrix auto &invunrolls, VectorizationFactor vf, - math::PtrVector>> - orth_axes) { +inline auto +memcosts(const AbstractMatrix auto &invunrolls, VectorizationFactor vf, + math::PtrVector>> + orth_axes) { utils::eltype_t ic{}; for (auto [oa, inds] : orth_axes) ic += cost(invunrolls, oa, vf, inds); return ic; } -auto compcosts(const AbstractMatrix auto &invunrolls, - math::PtrVector> compindep) { +inline auto compcosts(const AbstractMatrix auto &invunrolls, + math::PtrVector> compindep) { utils::eltype_t cc{}; for (auto [oa, sf] : compindep) cc += cost(invunrolls, oa) * sf; return cc; } + // We then additionally need a throughput vs latency estimator, and code for // handling the tail. // Standard throughput is fairly trivial/should be a vector sum, @@ -616,7 +635,7 @@ class LoopTreeCostFn { // breadth-first lets us retire early, but can increase // live count? // Note, every reduction must add register contribution. - leafs.emplace_back(regUse, {l, legality.numReductions()}); + leafs.emplace_back(registerUse(TTI, L), {l, legality.numReductions()}); // for (IR::Node *N = L->getChild(); N; N = N->getNext()) {} return; }; diff --git a/include/Optimize/CostModeling.hpp b/include/Optimize/CostModeling.hpp index 5ce42dd00..f05753ace 100644 --- a/include/Optimize/CostModeling.hpp +++ b/include/Optimize/CostModeling.hpp @@ -409,30 +409,27 @@ inline void topologicalSort(const IR::Dependencies &deps, IR::Loop *root, } // NOLINTNEXTLINE(misc-no-recursion) inline auto buildSubGraph(const IR::Dependencies &deps, IR::Loop *root, - int depth, uint32_t id) -> uint32_t { + int depth) -> int16_t { // We build the instruction graph, via traversing the tree, and then // top sorting as we recurse out for (IR::Loop *child : root->subLoops()) - id = buildSubGraph(deps, child, depth + 1, id); - // root->setMeta(id++); - + buildSubGraph(deps, child, depth + 1); // The very outer `root` needs to have all instr constituents // we also need to add the last instruction of each loop as `last` topologicalSort(deps, root, depth); - return id; + return idx; } -inline auto buildGraph(const IR::Dependencies &deps, IR::Loop *root) - -> uint32_t { +inline void buildGraph(const IR::Dependencies &deps, IR::Loop *root) { // We build the instruction graph, via traversing the tree, and then // top sorting as we recurse out - uint32_t id = 0; - for (IR::Loop *child : root->subLoops()) - id = buildSubGraph(deps, child, 1, id); + for (IR::Loop *child : root->subLoops()) buildSubGraph(deps, child, 1); // The very outer `root` needs to have all instr constituents // we also need to add the last instruction of each loop as `last` addBody(deps, root, 0, root->getChild()); - return id; + // Add top sort idx + uint32_t idx = 0; // we use ++idx, so only `const` have idx==0 + for (IR::Node *n : root->nodes()) n->setTopIndex(++idx); } inline auto addAddrToGraph(Arena<> *salloc, Arena<> *lalloc, @@ -718,8 +715,7 @@ class IROptimizer { IROptimizer(IR::Dependencies &deps, IR::Cache &instr, dict::set &loopBBs, dict::set &eraseCandidates_, IR::Loop *root, - Arena<> *lalloc, lp::LoopBlock::OptimizationResult res, - uint32_t numLoops) + Arena<> *lalloc, lp::LoopBlock::OptimizationResult res) : deps{deps}, instructions{instr}, LBBs{loopBBs}, eraseCandidates{eraseCandidates_}, root_{root}, lalloc_{lalloc} { sortEdges(root_, 0); @@ -871,12 +867,11 @@ inline void optimize(IR::Dependencies deps, IR::Cache &instr, // as it allocates the actual nodes. IR::Loop *root = addAddrToGraph(instr.getAllocator(), lalloc, res.nodes); - uint32_t numLoops = buildGraph(deps, root); + buildGraph(deps, root); // `N` is the head of the topologically sorted graph // We now try to remove redundant memory operations - IROptimizer(deps, instr, loopBBs, eraseCandidates, root, lalloc, res, - numLoops); + IROptimizer(deps, instr, loopBBs, eraseCandidates, root, lalloc, res); } /* From 63b97723bb28700141a4f82ac221bd6e60459ba1 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Sun, 4 Feb 2024 19:09:36 -0500 Subject: [PATCH 108/112] some discontiguous cost comments --- include/Optimize/CostFunction.hpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/include/Optimize/CostFunction.hpp b/include/Optimize/CostFunction.hpp index 618decf8a..5be86905d 100644 --- a/include/Optimize/CostFunction.hpp +++ b/include/Optimize/CostFunction.hpp @@ -133,20 +133,23 @@ constexpr auto cost(const AbstractMatrix auto &invunrolls, MemCostSummary mcs, // 2. contiguous load for each vectorization factor of length equal to // unroll, followed by shuffles. // E.g., unroll contig by 4, another dim is vectorized by 8: - // we'd have 8 vloads (max(4/8,1) * 8), followed by 4*log2(8) + - // log2(max(8/4,1))*4 shuffles. + // we'd have 8 vloads (max(4/8,1) * 8), followed by 4*log2(8) shuffles. // Or, if we unroll contig by 8, and another dim is vectorzeed by 2, we'd - // have 8 = (max(8/2,1) * 2) vloads, 8*log2(2) + log2(max(2/8,1))*8 + // have 8 = (max(8/2,1) * 2) vloads, 8*log2(2) // shuffles. + // Earlier, I had another term, `4*log2(max(8/4,1)) `log2(max(2/8,1))*8` + // but I think we can avoid this by always working with vectors that are + // the larger of `u` and `v`, inserting at the start or extracting at the + // end, whichever is necessary. // We divide by `u[contig]`, as it is now accounted for // So we have - // max(v/u, 1) + u*log2(v) + log2(max(v/u ,1))*u + // max(v/u, 1) + u*log2(v) utils::eltype_t iu{invunrolls[0, orth.contig]}, u{invunrolls[1, orth.contig]}, mr{math::smax((1 << vfi.l2factor) * iu, 1)}; utils::invariant(iu == 1 / u); - c *= math::smin(mc.contiguous * mr + u * (vfi.l2factor + log2(mr)), - mc.discontiguous); + // FIXME: memory and shuffle cost should be separate? + c *= math::smin(mc.contiguous * mr + u * vfi.l2factor, mc.discontiguous); } } else c *= mc.scalar; return c; From 6179fb482fd95a004907baee28c91dc4202286bb Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Mon, 5 Feb 2024 03:59:10 -0500 Subject: [PATCH 109/112] some more examples in a comment --- include/Optimize/CostFunction.hpp | 57 +++++++++++++++++++++++++++---- 1 file changed, 50 insertions(+), 7 deletions(-) diff --git a/include/Optimize/CostFunction.hpp b/include/Optimize/CostFunction.hpp index 5be86905d..8cbb635a3 100644 --- a/include/Optimize/CostFunction.hpp +++ b/include/Optimize/CostFunction.hpp @@ -119,7 +119,8 @@ constexpr auto cost(const AbstractMatrix auto &invunrolls, MemCostSummary mcs, VectorizationFactor vfi) -> utils::eltype_t { auto [mc, orth] = mcs; - utils::eltype_t c{cost(invunrolls, orth.indep)}; + using T = utils::eltype_t; + T c{cost(invunrolls, orth.indep)}; if (!(orth.indep & vfi.indexMask)) { // depends on vectorized index if (vfi.indexMask & orth.contig) { @@ -134,22 +135,64 @@ constexpr auto cost(const AbstractMatrix auto &invunrolls, MemCostSummary mcs, // unroll, followed by shuffles. // E.g., unroll contig by 4, another dim is vectorized by 8: // we'd have 8 vloads (max(4/8,1) * 8), followed by 4*log2(8) shuffles. + // w_0 = [0, 8, 16, 24] + // w_1 = [1, 9, 17, 25] + // w_2 = [2, 10, 18, 26] + // w_3 = [3, 11, 19, 27] + // w_4 = [4, 12, 20, 28] + // w_5 = [5, 13, 21, 29] + // w_6 = [6, 14, 22, 30] + // w_7 = [7, 15, 23, 31] + // + // x_0 = [0, 8, 16, 24, 4, 12, 20, 28] + // x_1 = [1, 9, 17, 25, 5, 13, 21, 29] + // x_2 = [2, 10, 18, 26, 6, 14, 22, 30] + // x_3 = [3, 11, 19, 27, 7, 15, 23, 31] + // + // y_0 = [0, 1, 16, 17, 4, 5, 20, 21] + // y_1 = [8, 9, 24, 25, 12, 13, 28, 29] + // y_2 = [2, 3, 18, 19, 6, 7, 22, 23] + // y_3 = [10, 11, 26, 27, 14, 15, 30, 31] + // + // z_0 = [0, 1, 2, 3, 4, 5, 6, 7] + // z_1 = [8, 9, 10, 11, 12, 13, 14, 15] + // z_2 = [16, 17, 18, 19, 20, 21, 22, 23] + // z_3 = [24, 25, 26, 27, 28, 29, 30, 31] + // // Or, if we unroll contig by 8, and another dim is vectorzeed by 2, we'd // have 8 = (max(8/2,1) * 2) vloads, 8*log2(2) // shuffles. - // Earlier, I had another term, `4*log2(max(8/4,1)) `log2(max(2/8,1))*8` + // w_0_0 = [0, 2] + // w_0_1 = [4, 6] + // w_0_2 = [8, 10] + // w_0_3 = [12, 14] + // w_1_0 = [1, 3] + // w_1_1 = [5, 7] + // w_1_2 = [9, 11] + // w_1_3 = [13, 15] + // + // z_0 = [0, 1] + // z_1 = [2, 3] + // z_2 = [4, 5] + // z_3 = [6, 7] + // z_4 = [8, 9] + // z_5 = [10, 11] + // z_6 = [12, 13] + // z_7 = [14, 15] + // Earlier, I had another term, `4*log2(max(8/4,1)) `8*log2(max(2/8,1))` + // i.e. u*log2(max(v/u,1)) // but I think we can avoid this by always working with vectors that are // the larger of `u` and `v`, inserting at the start or extracting at the // end, whichever is necessary. // We divide by `u[contig]`, as it is now accounted for // So we have - // max(v/u, 1) + u*log2(v) - utils::eltype_t iu{invunrolls[0, orth.contig]}, - u{invunrolls[1, orth.contig]}, - mr{math::smax((1 << vfi.l2factor) * iu, 1)}; + // v*max(u/v, 1) + u*log2(v) + T iu{invunrolls[0, orth.contig]}, u{invunrolls[1, orth.contig]}; utils::invariant(iu == 1 / u); // FIXME: memory and shuffle cost should be separate? - c *= math::smin(mc.contiguous * mr + u * vfi.l2factor, mc.discontiguous); + c *= math::smin(mc.contiguous * math::smax(u, (1 << vfi.l2factor) * iu) + + u * vfi.l2factor, + mc.discontiguous); } } else c *= mc.scalar; return c; From 6cc6047031a6208d4dd076e05692c13b62e606ab Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Tue, 6 Feb 2024 07:28:57 -0500 Subject: [PATCH 110/112] mostly negligibile; update comment to use multidimensional operator, factor out a few eltype_t in cost funs --- include/Optimize/CostFunction.hpp | 13 +++++++------ test/dependence_test.cpp | 6 +++--- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/include/Optimize/CostFunction.hpp b/include/Optimize/CostFunction.hpp index 8cbb635a3..c5fe95977 100644 --- a/include/Optimize/CostFunction.hpp +++ b/include/Optimize/CostFunction.hpp @@ -207,7 +207,8 @@ constexpr auto cost(const AbstractMatrix auto &invunrolls, MemCostSummary mcs, constexpr auto cost(const AbstractMatrix auto &invunrolls, MemCostSummary orth, VectorizationFactor vfi, DensePtrMatrix inds) -> utils::eltype_t { - utils::eltype_t c{1}; + using T = utils::eltype_t; + T c{1}; auto [arrayDim, numLoops] = shape(inds); utils::invariant(numLoops > 0); utils::invariant(arrayDim > 0); @@ -216,7 +217,7 @@ constexpr auto cost(const AbstractMatrix auto &invunrolls, MemCostSummary orth, for (ptrdiff_t d = 0; d < arrayDim; ++d) { int64_t g = 0; containers::BitSet64 bs; - utils::eltype_t uprod; + T uprod; for (ptrdiff_t l = 0; l < numLoops; ++l) { if ((uint32_t(1) << l) == vfi.indexMask) continue; int64_t a = inds[d, l]; @@ -239,7 +240,7 @@ constexpr auto cost(const AbstractMatrix auto &invunrolls, MemCostSummary orth, bs.insert(l); }; if (bs.size() < 2) continue; - utils::eltype_t prod{1}; + T prod{1}; for (ptrdiff_t l : bs) { if ((uint32_t(1) << l) == vfi.indexMask) continue; int64_t a = inds[d, l]; @@ -331,7 +332,7 @@ inline auto compcosts(const AbstractMatrix auto &invunrolls, // /// memcost = I*J*(Ui*Uj*C_{Al} + Uj*C_{yl}) / (Ui*Uj) + /// I*(C_{xl}*Ui + C_{xs}*Ui) / Ui -/// cthroughput = I*J*(Ui*Uj*C_{t,fma}) / (Ui*Uj) + I*(Ui*C_{t,add}*(Uj-1)) / +/// cthroughput = I*J*(Ui*Uj*C_{t,fma}) / (Ui*Uj) + I*(Ui*C_{t,add}*(Uj-1)) / Ui /// Ui clatency = I*J*C_{l,fma}/smin(Ui*Uj, C_{l,fma}/C_{t,fma}) + /// I*C_{l,add}*log2(Uj) /// @@ -394,7 +395,7 @@ inline auto compcosts(const AbstractMatrix auto &invunrolls, /// Thus, a cost function for the above gemv could be something like /// memcost = I*J*(Ui*Uj*C_{Al} + Uj*C_{yl}) / (Ui*Uj) + /// I*(C_{xl}*Ui + C_{xs}*Ui) / Ui -/// cthroughput = I*J*(Ui*Uj*C_{t,fma}) / (Ui*Uj) + I*(Ui*C_{t,add}*(Uj-1)) / +/// cthroughput = I*J*(Ui*Uj*C_{t,fma}) / (Ui*Uj) + I*(C_{t,add}*(Uj-1)) / /// Ui clatency = I*J*C_{l,fma}/smin(Ui*Uj, C_{l,fma}/C_{t,fma}) + /// I*C_{l,add}*log2(Uj) /// cost = memcost + smax(cthroughput, clatency) @@ -466,7 +467,7 @@ inline auto compcosts(const AbstractMatrix auto &invunrolls, /// as the cost, where `a_g = abs(a/gcd(a,b))` and `b_g = abs(b/gcd(a,b))`. /// /// For more, we generalize this pattern -/// = 1 - \prod_{d}^{D}\left(1 - \frac{coef_{g,d}*U_d}{\prod_{i}^{D}U_i}\right) +/// = 1 - \prod_{d}^{D}\left(1 - \frac{coef_{g,d}U_d}{\prod_{i}^{D}U_i}\right) /// /// In the `D=3` case, this expands to /// 1 - (1 - a_g/(U_j*U_k))(1 - b_g/(U_i*U_k))(1 - c_g/(U_i*U_j)) diff --git a/test/dependence_test.cpp b/test/dependence_test.cpp index b8de45810..b6d8fbaed 100644 --- a/test/dependence_test.cpp +++ b/test/dependence_test.cpp @@ -555,12 +555,12 @@ TEST(TriangularExampleTest, BasicAssertions) { // badly written triangular solve: // for (m = 0; m < M; ++m){ // for (n = 0; n < N; ++n){ - // A(n,m) = B(n,m); + // A[n,m] = B[n,m]; // } // for (n = 0; n < N; ++n){ - // A(n,m) = A(n,m) / U(n,n); + // A[n,m] = A[n,m] / U[n,n]; // for (k = n+1; k < N; ++k){ - // A(k,m) = A(k,m) - A(n,m)*U(k,n); + // A[k,m] = A[k,m] - U[k,n]*A[n,m]; // } // } // } From 96ec52658d15e88d63fc2ca51e0748a97891a964 Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Tue, 6 Feb 2024 16:59:07 -0500 Subject: [PATCH 111/112] if RegisterUseByUnroll contains non-trivially-destructable types, must be held by a vector type that supprts them --- include/Optimize/CostFunction.hpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/include/Optimize/CostFunction.hpp b/include/Optimize/CostFunction.hpp index c5fe95977..c8117b7f4 100644 --- a/include/Optimize/CostFunction.hpp +++ b/include/Optimize/CostFunction.hpp @@ -5,6 +5,7 @@ #include "IR/Node.hpp" #include "IR/OrthogonalAxes.hpp" #include "Optimize/CostModeling.hpp" +#include "Optimize/Legality.hpp" #include "Optimize/RegisterFile.hpp" #include "Polyhedra/Dependence.hpp" #include @@ -282,7 +283,8 @@ constexpr auto registerPressure(const AbstractMatrix auto &invunrolls, return 0.25 * math::softplus(8.0 * (acc - r.register_count)); } -inline auto registerUse(const llvm::TargetTransformInfo &TTI, IR::Loop *L) +inline auto registerUse(const llvm::TargetTransformInfo &TTI, + LoopDepSatisfaction deps, IR::Loop *L) -> RegisterUseByUnroll { RegisterUseByUnroll u; // Ideally, we'd have the transitive closure of depencencies, or better yet @@ -297,6 +299,17 @@ inline auto registerUse(const llvm::TargetTransformInfo &TTI, IR::Loop *L) // data-oriented design. // The simple top-index check is enough for checking if something is infront, // behind, or within a loop. + // + // We scan dependencies, looking for reduction latencies + // can we use `TTI.getRegUsageForType()`? + // TargetTransformInfoImplBase defaults to `1`, and some backends like x86 + // do not override it, so it is not something we can rely on. + // + // d.input()->reductionLatency() > 0 indicates a dependence is live across the + // loop otherwise, we only consider instructions within the loop? + // ...or...perhaps we only need to consider the loop leaf's instructions; we + // can see what is written and referenced. + // For now, will try and follow the latter approach. return u; } @@ -547,7 +560,8 @@ class LoopTreeCostFn { // compute cost summary math::Vector> compute_independence{}; // for leaves, we need latency information - math::Vector>> leafs{}; + llvm::SmallVector>> + leafs{}; unsigned maxVectorWidth; ptrdiff_t max_depth{}; @@ -682,7 +696,8 @@ class LoopTreeCostFn { // breadth-first lets us retire early, but can increase // live count? // Note, every reduction must add register contribution. - leafs.emplace_back(registerUse(TTI, L), {l, legality.numReductions()}); + leafs.emplace_back(registerUse(TTI, deps, L), + Pair{l, legality.numReductions()}); // for (IR::Node *N = L->getChild(); N; N = N->getNext()) {} return; }; From 77c40e3b59eaf37a89a2cec2b61fda1b735489ca Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Wed, 7 Feb 2024 19:18:33 -0500 Subject: [PATCH 112/112] Need to fix/implement allNodes; document ways for traversing all instructions in a chain, and subloops only! --- include/IR/Node.hpp | 5 +++-- include/Optimize/CostFunction.hpp | 3 +++ include/Optimize/CostModeling.hpp | 7 +++---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/include/IR/Node.hpp b/include/IR/Node.hpp index de86c2a83..2427a9182 100644 --- a/include/IR/Node.hpp +++ b/include/IR/Node.hpp @@ -148,7 +148,7 @@ class Node { return visitDepth; } constexpr void clearVisited() { visitDepth = 255; } - /// wasVisited(d) { return visitDepth == d; } + /// bool wasVisited(uint8_t d) { return visitDepth == d; } [[nodiscard]] constexpr auto wasVisited(uint8_t d) const -> bool { return visitDepth == d; } @@ -274,6 +274,7 @@ class Node { if (llvm::isa(v)) return VK_Bflt; return VK_CVal; } + /// Iterate through all instructions [[nodiscard]] constexpr auto nodes() noexcept -> utils::ListRange { return utils::ListRange{this, utils::GetNext{}}; @@ -297,12 +298,12 @@ class Loop : public Node { /// IDs are in topologically sorted order. CostModeling::Legality legality{}; int32_t edgeId{-1}; // edge cycle id - // LegalTransforms legal{Unknown}; // while `child` points to the first contained instruction, // `last` points to the last contained instruction, // and can be used for backwards iteration over the graph. public: + /// Get the IDs for the Dependencies carried by this loop [[nodiscard]] constexpr auto edges(poly::PtrVector edges) const -> utils::VForwardRange { return utils::VForwardRange{edges, edgeId}; diff --git a/include/Optimize/CostFunction.hpp b/include/Optimize/CostFunction.hpp index c8117b7f4..7891ab6be 100644 --- a/include/Optimize/CostFunction.hpp +++ b/include/Optimize/CostFunction.hpp @@ -310,6 +310,9 @@ inline auto registerUse(const llvm::TargetTransformInfo &TTI, // ...or...perhaps we only need to consider the loop leaf's instructions; we // can see what is written and referenced. // For now, will try and follow the latter approach. + for (IR::Value *v : L->nodes()) { + // use `v` + } return u; } diff --git a/include/Optimize/CostModeling.hpp b/include/Optimize/CostModeling.hpp index f05753ace..a8176ea4c 100644 --- a/include/Optimize/CostModeling.hpp +++ b/include/Optimize/CostModeling.hpp @@ -408,8 +408,8 @@ inline void topologicalSort(const IR::Dependencies &deps, IR::Loop *root, body = visitLoopDependent(deps, root, N, depth, body, P); } // NOLINTNEXTLINE(misc-no-recursion) -inline auto buildSubGraph(const IR::Dependencies &deps, IR::Loop *root, - int depth) -> int16_t { +inline void buildSubGraph(const IR::Dependencies &deps, IR::Loop *root, + int depth) { // We build the instruction graph, via traversing the tree, and then // top sorting as we recurse out for (IR::Loop *child : root->subLoops()) @@ -417,7 +417,6 @@ inline auto buildSubGraph(const IR::Dependencies &deps, IR::Loop *root, // The very outer `root` needs to have all instr constituents // we also need to add the last instruction of each loop as `last` topologicalSort(deps, root, depth); - return idx; } inline void buildGraph(const IR::Dependencies &deps, IR::Loop *root) { // We build the instruction graph, via traversing the tree, and then @@ -429,7 +428,7 @@ inline void buildGraph(const IR::Dependencies &deps, IR::Loop *root) { addBody(deps, root, 0, root->getChild()); // Add top sort idx uint32_t idx = 0; // we use ++idx, so only `const` have idx==0 - for (IR::Node *n : root->nodes()) n->setTopIndex(++idx); + for (IR::Node *n : root->allNodes()) n->setTopIndex(++idx); } inline auto addAddrToGraph(Arena<> *salloc, Arena<> *lalloc,