-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[SandboxVec] Boilerplate #107431
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[SandboxVec] Boilerplate #107431
Conversation
@llvm/pr-subscribers-llvm-transforms Author: vporpo (vporpo) ChangesThis patch implements the new pass and registers it with the pass manager. For context, this is a vectorizer that operates on Sandbox IR, which is a transactional IR on top of LLVM IR. Full diff: https://github.com/llvm/llvm-project/pull/107431.diff 8 Files Affected:
diff --git a/llvm/include/llvm/Transforms/Vectorize/SandboxVec/SandboxVectorizer.h b/llvm/include/llvm/Transforms/Vectorize/SandboxVec/SandboxVectorizer.h
new file mode 100644
index 00000000000000..0f7e43112d2d88
--- /dev/null
+++ b/llvm/include/llvm/Transforms/Vectorize/SandboxVec/SandboxVectorizer.h
@@ -0,0 +1,35 @@
+//===- SandboxVectorizer.h --------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_TRANSFORMS_VECTORIZE_SANDBOXVEC_SANDBOXVECTORIZER_H
+#define LLVM_TRANSFORMS_VECTORIZE_SANDBOXVEC_SANDBOXVECTORIZER_H
+
+#include "llvm/Analysis/AliasAnalysis.h"
+#include "llvm/Analysis/ScalarEvolution.h"
+#include "llvm/Analysis/TargetTransformInfo.h"
+#include "llvm/IR/DataLayout.h"
+#include "llvm/IR/PassManager.h"
+#include "llvm/SandboxIR/SandboxIR.h"
+
+namespace llvm {
+
+class SandboxVectorizerPass : public PassInfoMixin<SandboxVectorizerPass> {
+ DenseSet<sandboxir::Value *> Visited;
+ ScalarEvolution *SE = nullptr;
+ const DataLayout *DL = nullptr;
+ TargetTransformInfo *TTI = nullptr;
+ AliasAnalysis *AA = nullptr;
+
+public:
+ PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
+
+ bool runImpl(Function &F);
+};
+
+} // namespace llvm
+
+#endif // LLVM_TRANSFORMS_VECTORIZE_SANDBOXVEC_SANDBOXVECTORIZER_H
diff --git a/llvm/lib/Passes/CMakeLists.txt b/llvm/lib/Passes/CMakeLists.txt
index 6425f4934b2103..a90b196b0b0292 100644
--- a/llvm/lib/Passes/CMakeLists.txt
+++ b/llvm/lib/Passes/CMakeLists.txt
@@ -26,6 +26,7 @@ add_llvm_component_library(LLVMPasses
InstCombine
IRPrinter
ObjCARC
+ SandboxVec
Scalar
Support
Target
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index a22abed8051a11..80916b8a9502a0 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -321,6 +321,7 @@
#include "llvm/Transforms/Vectorize/LoopIdiomVectorize.h"
#include "llvm/Transforms/Vectorize/LoopVectorize.h"
#include "llvm/Transforms/Vectorize/SLPVectorizer.h"
+#include "llvm/Transforms/Vectorize/SandboxVec/SandboxVectorizer.h"
#include "llvm/Transforms/Vectorize/VectorCombine.h"
#include <optional>
diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def
index d6067089c6b5c1..a1324e81705669 100644
--- a/llvm/lib/Passes/PassRegistry.def
+++ b/llvm/lib/Passes/PassRegistry.def
@@ -453,6 +453,7 @@ FUNCTION_PASS("reassociate", ReassociatePass())
FUNCTION_PASS("redundant-dbg-inst-elim", RedundantDbgInstEliminationPass())
FUNCTION_PASS("reg2mem", RegToMemPass())
FUNCTION_PASS("safe-stack", SafeStackPass(TM))
+FUNCTION_PASS("sandbox-vectorizer", SandboxVectorizerPass())
FUNCTION_PASS("scalarize-masked-mem-intrin", ScalarizeMaskedMemIntrinPass())
FUNCTION_PASS("scalarizer", ScalarizerPass())
FUNCTION_PASS("sccp", SCCPPass())
diff --git a/llvm/lib/Transforms/Vectorize/CMakeLists.txt b/llvm/lib/Transforms/Vectorize/CMakeLists.txt
index 5c88d94d96622d..cabddd7a8a8e0d 100644
--- a/llvm/lib/Transforms/Vectorize/CMakeLists.txt
+++ b/llvm/lib/Transforms/Vectorize/CMakeLists.txt
@@ -1,3 +1,5 @@
+add_subdirectory(SandboxVec)
+
add_llvm_component_library(LLVMVectorize
LoadStoreVectorizer.cpp
LoopIdiomVectorize.cpp
@@ -27,4 +29,5 @@ add_llvm_component_library(LLVMVectorize
Core
Support
TransformUtils
+ SandboxVec
)
diff --git a/llvm/lib/Transforms/Vectorize/SandboxVec/CMakeLists.txt b/llvm/lib/Transforms/Vectorize/SandboxVec/CMakeLists.txt
new file mode 100644
index 00000000000000..ccf0c8c2d5da2d
--- /dev/null
+++ b/llvm/lib/Transforms/Vectorize/SandboxVec/CMakeLists.txt
@@ -0,0 +1,16 @@
+add_llvm_component_library(LLVMSandboxVec
+ SandboxVectorizer.cpp
+
+ ADDITIONAL_HEADER_DIRS
+ ${LLVM_MAIN_INCLUDE_DIR}/llvm/Transforms/Vectorize/SandboxVec
+
+ DEPENDS
+ intrinsics_gen
+
+ LINK_COMPONENTS
+ Analysis
+ Core
+ SandboxIR
+ Support
+ TransformUtils
+)
diff --git a/llvm/lib/Transforms/Vectorize/SandboxVec/SandboxVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SandboxVec/SandboxVectorizer.cpp
new file mode 100644
index 00000000000000..d113f02d7fa978
--- /dev/null
+++ b/llvm/lib/Transforms/Vectorize/SandboxVec/SandboxVectorizer.cpp
@@ -0,0 +1,63 @@
+//===- SandboxVectorizer.cpp - Vectorizer based on Sandbox IR -------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Transforms/Vectorize/SandboxVec/SandboxVectorizer.h"
+#include "llvm/Support/CommandLine.h"
+
+using namespace llvm;
+
+#define SV_NAME "sandbox-vectorizer"
+#define DEBUG_TYPE "SBVec"
+
+cl::opt<bool>
+ SBVecDisable("sbvec-disable", cl::init(false), cl::Hidden,
+ cl::desc("Disable the Sandbox Vectorization passes"));
+
+PreservedAnalyses SandboxVectorizerPass::run(Function &F,
+ FunctionAnalysisManager &AM) {
+ TTI = &AM.getResult<TargetIRAnalysis>(F);
+ SE = &AM.getResult<ScalarEvolutionAnalysis>(F);
+ DL = &F.getParent()->getDataLayout();
+ AA = &AM.getResult<AAManager>(F);
+
+ bool Changed = runImpl(F);
+ if (!Changed)
+ return PreservedAnalyses::all();
+
+ PreservedAnalyses PA;
+ PA.preserveSet<CFGAnalyses>();
+ return PA;
+}
+
+bool SandboxVectorizerPass::runImpl(Function &F) {
+ if (SBVecDisable)
+ return false;
+
+ // If the target claims to have no vector registers don't attempt
+ // vectorization.
+ if (!TTI->getNumberOfRegisters(TTI->getRegisterClassForType(true))) {
+ LLVM_DEBUG(dbgs() << "SBVec: Target has no vector registers, abort.\n");
+ return false;
+ }
+
+ // Don't vectorize when the attribute NoImplicitFloat is used.
+ if (F.hasFnAttribute(Attribute::NoImplicitFloat))
+ return false;
+
+ sandboxir::Context Ctx(F.getContext());
+
+ LLVM_DEBUG(dbgs() << "SBVec: Analyzing blocks in " << F.getName() << ".\n");
+
+ // Create SandboxIR for `F`.
+ sandboxir::Function &SBF = *Ctx.createFunction(&F);
+
+ // TODO: Initialize SBVec Pass Manager
+ (void)SBF;
+
+ return false;
+}
diff --git a/llvm/test/Transforms/SandboxVec/boilerplate.ll b/llvm/test/Transforms/SandboxVec/boilerplate.ll
new file mode 100644
index 00000000000000..353659d41485fc
--- /dev/null
+++ b/llvm/test/Transforms/SandboxVec/boilerplate.ll
@@ -0,0 +1,11 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt -passes=sandbox-vectorizer %s -S | FileCheck %s
+
+; This test checks that the pass was registered with the pass manager.
+; TODO: Remove this test once actual tests land.
+define void @boilerplate() {
+; CHECK-LABEL: define void @boilerplate() {
+; CHECK-NEXT: ret void
+;
+ ret void
+}
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wouldn't shorten "Vec" in the directory name
@@ -1,3 +1,5 @@ | |||
add_subdirectory(SandboxVec) | |||
|
|||
add_llvm_component_library(LLVMVectorize |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if we list the sources here we avoid a new component
#define DEBUG_TYPE "SBVec" | ||
|
||
cl::opt<bool> | ||
SBVecDisable("sbvec-disable", cl::init(false), cl::Hidden, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
we basically already have this with -fno-slp-vectorize
, I don't think we need a separate option?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As long as you are not using the pass in production, opt should suffice for use it or not.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it's not being added to any pipelines, so this option isn't useful right now. and once it is added to the pipelines, it'll be controlled by PipelineTuningOptions::SLPVectorization
anyway
PreservedAnalyses SandboxVectorizerPass::run(Function &F, | ||
FunctionAnalysisManager &AM) { | ||
TTI = &AM.getResult<TargetIRAnalysis>(F); | ||
SE = &AM.getResult<ScalarEvolutionAnalysis>(F); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Most of this is dead code.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah I guess I can drop these for now and add them when needed.
The vectorizer is going to be spread of several files and some files will be added to the generic sandbox directory? |
Not sure what you mean by There will be a number of SandboxVectorizer-specific files living in |
Sorry for being slow. Could the pass manager be used for other optimizations on top of SandboxIR or is it tied to the vectorizer? |
The pass manager will be launched by the vectorizer pass, so in that sense it is tied to the vectorizer. But I see your point. Ideally there should be a generic pass manager for Sandbox IR passes. I think we could accommodate for that if Sandbox IR ended up being used by other transformations too. In that case we could move the Pass/PassManager files to a generic directory. |
My dream would be a loop optimizer on top of SandboxIR. It would also have passes and a pass manager. |
Neither worry nor hurry. |
Yeah, loop transformations would be a great fit. I think the pass-manager infrastructure is generic enough that we could reuse most of it. |
I accidentally force-pushed, but I think I addressed all comments. |
Ah I still need to rename the test directory from |
|
||
// If the target claims to have no vector registers don't attempt | ||
// vectorization. | ||
if (!TTI->getNumberOfRegisters(TTI->getRegisterClassForType(true))) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd add this (and below) logic alongside tests later
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
#define DEBUG_TYPE "SBVec" | ||
|
||
cl::opt<bool> | ||
SBVecDisable("sbvec-disable", cl::init(false), cl::Hidden, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it's not being added to any pipelines, so this option isn't useful right now. and once it is added to the pipelines, it'll be controlled by PipelineTuningOptions::SLPVectorization
anyway
Done. |
using namespace llvm; | ||
|
||
#define SV_NAME "sandbox-vectorizer" | ||
#define DEBUG_TYPE "SBVec" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
SBVectorizer
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We could change it to #define DEBUG_TYPE SV_NAME
like it's done in LoopVectorize.cpp. Wdyt?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
SGTM.
This patch implements the new pass and registers it with the pass manager. For context, this is a vectorizer that operates on Sandbox IR, which is a transactional IR on top of LLVM IR.
#include "llvm/Analysis/TargetTransformInfo.h" | ||
#include "llvm/IR/DataLayout.h" | ||
#include "llvm/IR/PassManager.h" | ||
#include "llvm/SandboxIR/SandboxIR.h" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Most of these includes are either (currently) unused or should be forward declarations. (You should only need PassManager.h).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah I removed the objects themselves and forgot to remove the header files. Let me remove them.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Removed them here: 7ea9f0d
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/146/builds/1079 Here is the relevant piece of the build log for the reference
|
Hi,
crashes with
|
And this crash goes away with d14a600
|
@mikaelholmen Just curious how did you run into that issue? |
We run some tests with randomized opt pass pipelines, and when sandbox-vectorizer was created we threw that pass into the mix as well. |
Ah makes sense, thanks. |
We started seeing a
|
Isn't this a downstream issue? |
Ok, you're right, and I'll fix it on our end. Sorry for the false alarm. |
This patch implements the new pass and registers it with the pass manager. For context, this is a vectorizer that operates on Sandbox IR, which is a transactional IR on top of LLVM IR.