[PATCH] D28907: [SLP] Fix for PR30787: Failure to beneficially vectorize 'copyable' elements in integer binary ops.

Alexey Bataev via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Jan 12 13:31:17 PST 2018


ABataev added inline comments.


================
Comment at: lib/Transforms/Vectorize/SLPVectorizer.cpp:2451
   for (const auto &N : VectorizableTree) {
-    Instruction *Inst = dyn_cast<Instruction>(N.Scalars[0]);
+    Instruction *Inst = dyn_cast<Instruction>(N.State.OpValue);
     if (!Inst)
----------------
`auto *Inst`


================
Comment at: lib/Transforms/Vectorize/SLPVectorizer.cpp:2939
 
-  InstructionsState S = getSameOpcode(E->Scalars);
-  Instruction *VL0 = cast<Instruction>(E->Scalars[0]);
+  Instruction *VL0 = cast<Instruction>(E->State.OpValue);
   Type *ScalarTy = VL0->getType();
----------------
`auto *VL0`


================
Comment at: lib/Transforms/Vectorize/SLPVectorizer.cpp:3613
+    for (Value *V : VL) {
+      Instruction *I = dyn_cast<Instruction>(V);
+      if (!I)
----------------
`auto *I`


================
Comment at: lib/Transforms/Vectorize/SLPVectorizer.cpp:3621
+      if (I->getOpcode() == Instruction::ExtractElement ||
+          I->getOpcode() == Instruction::ExtractValue)
+        for (Value *V1 : VL) {
----------------
Why you're checking for `ExtractValue`s here?


================
Comment at: lib/Transforms/Vectorize/SLPVectorizer.cpp:3623
+        for (Value *V1 : VL) {
+          Instruction *I1 = dyn_cast<Instruction>(V1);
+          if (I1 != nullptr && I1->getOpcode() != Instruction::ExtractElement &&
----------------
`auto *I1`


================
Comment at: lib/Transforms/Vectorize/SLPVectorizer.cpp:3624
+          Instruction *I1 = dyn_cast<Instruction>(V1);
+          if (I1 != nullptr && I1->getOpcode() != Instruction::ExtractElement &&
+              I1->getOpcode() != Instruction::ExtractValue &&
----------------
1. `I1 != nullptr` -> `I1`
2. `I1` = vis very bad name


================
Comment at: lib/Transforms/Vectorize/SLPVectorizer.cpp:3629
+        }
+      // Check inner vector dependencies
+      for (User *U : I->users()) {
----------------
I still don't understand what are checking for here. Need more description and real tests


================
Comment at: lib/Transforms/Vectorize/SLPVectorizer.cpp:3631
+      for (User *U : I->users()) {
+        Instruction *UserInst = dyn_cast<Instruction>(U);
+        if (!UserInst)
----------------
`auto *UserInst`


================
Comment at: lib/Transforms/Vectorize/SLPVectorizer.cpp:3635
+        for (Value *V : VL) {
+          Instruction *I1 = dyn_cast<Instruction>(V);
+          if (!I1)
----------------
1. `auto *I1`
2. `I1` is very bad name


================
Comment at: lib/Transforms/Vectorize/SLPVectorizer.cpp:4074
+        LastScheduledInst = pickedInst;
+      } else NonAlters.insert(pickedInst);
       BundleMember = BundleMember->NextInBundle;
----------------
1. Wrong formatting. Use `clang-format`
2. Enclose into braces


================
Comment at: test/Transforms/SLPVectorizer/X86/pr35497.ll:1
+; RUN: opt -slp-vectorizer -S -mtriple=x86_64-unknown-linux-gnu < %s
+
----------------
Add test checks


https://reviews.llvm.org/D28907





More information about the llvm-commits mailing list