[llvm] [GVNSink] Fix non-determinisms by using Depth-First ordering (PR #90995)

via llvm-commits llvm-commits at lists.llvm.org
Sat May 4 06:50:21 PDT 2024


github-actions[bot] wrote:

<!--LLVM CODE FORMAT COMMENT: {clang-format}-->


:warning: C/C++ code formatter, clang-format found issues in your code. :warning:

<details>
<summary>
You can test this locally with the following command:
</summary>

``````````bash
git-clang-format --diff 2f58b9aae2d6f1aeaecd98766ef31cebc0dcbb5b 5f59326e1e03043c1d8a86e9668c33fa1eebb011 -- llvm/lib/Transforms/Scalar/GVNSink.cpp
``````````

</details>

<details>
<summary>
View the diff from clang-format here.
</summary>

``````````diff
diff --git a/llvm/lib/Transforms/Scalar/GVNSink.cpp b/llvm/lib/Transforms/Scalar/GVNSink.cpp
index bf5b788b86..72a5262dcd 100644
--- a/llvm/lib/Transforms/Scalar/GVNSink.cpp
+++ b/llvm/lib/Transforms/Scalar/GVNSink.cpp
@@ -227,14 +227,14 @@ class ModelledPHI {
 public:
   ModelledPHI() = default;
 
-  ModelledPHI(const PHINode *PN, DominatorTree *DT) : DT(DT){
+  ModelledPHI(const PHINode *PN, DominatorTree *DT) : DT(DT) {
     // BasicBlock comes first so we sort by basic block pointer order, then by value pointer order.
     using OpsType = std::pair<BasicBlock *, Value *>;
     SmallVector<OpsType, 4> Ops;
     for (unsigned I = 0, E = PN->getNumIncomingValues(); I != E; ++I)
       Ops.push_back({PN->getIncomingBlock(I), PN->getIncomingValue(I)});
 
-    auto DFSOrder = [DT](OpsType O1, OpsType O2){
+    auto DFSOrder = [DT](OpsType O1, OpsType O2) {
       return DT->getNode(O1.first) < DT->getNode(O2.first);
     };
     // Sort by DFSNumber to have a deterministic order.
@@ -263,16 +263,16 @@ public:
     };
     assert(llvm::is_sorted(Blocks, DFSOrder));
     int C = 0;
-    llvm::for_each(Values, [&C, this](const Value* V){
-      const Instruction* I = cast<Instruction>(V);
+    llvm::for_each(Values, [&C, this](const Value *V) {
+      const Instruction *I = cast<Instruction>(V);
       assert(I->getParent() == this->Blocks[C++]);
     });
   }
   /// Create a PHI from an array of incoming values and incoming blocks.
   // TODO: Sort as per their DFS numbers
   ModelledPHI(SmallVectorImpl<Instruction *> &V,
-              SmallSetVector<BasicBlock *, 4> &B,
-              DominatorTree *DT) : DT(DT){
+              SmallSetVector<BasicBlock *, 4> &B, DominatorTree *DT)
+      : DT(DT) {
     llvm::copy(V, std::back_inserter(Values));
     llvm::copy(B, std::back_inserter(Blocks));
     verifyModelledPHI();
@@ -280,8 +280,8 @@ public:
 
   /// Create a PHI from [I[OpNum] for I in Insts].
   ModelledPHI(ArrayRef<Instruction *> Insts, unsigned OpNum,
-              SmallSetVector<BasicBlock *, 4> &B,
-              DominatorTree *DT) : DT(DT) {
+              SmallSetVector<BasicBlock *, 4> &B, DominatorTree *DT)
+      : DT(DT) {
     llvm::copy(B, std::back_inserter(Blocks));
     for (auto *I : Insts)
       Values.push_back(I->getOperand(OpNum));
@@ -322,8 +322,8 @@ public:
 
   // Hash functor
   unsigned hash() const {
-      // Is deterministic because Values are saved in DFSOrder.
-      return (unsigned)hash_combine_range(Values.begin(), Values.end());
+    // Is deterministic because Values are saved in DFSOrder.
+    return (unsigned)hash_combine_range(Values.begin(), Values.end());
   }
 
   bool operator==(const ModelledPHI &Other) const {
@@ -592,7 +592,7 @@ public:
 
 class GVNSink {
 public:
-  GVNSink(DominatorTree *DT) :DT(DT) {}
+  GVNSink(DominatorTree *DT) : DT(DT) {}
 
   bool run(Function &F) {
     LLVM_DEBUG(dbgs() << "GVNSink: running on function @" << F.getName()

``````````

</details>


https://github.com/llvm/llvm-project/pull/90995


More information about the llvm-commits mailing list