[PATCH] D144381: [SCEV] Added a utility method that raising the number 2 to the desired power to SCEV

Dmitry Bakunevich via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 27 00:58:36 PST 2023


dbakunevich updated this revision to Diff 500694.
dbakunevich marked 3 inline comments as done.

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D144381/new/

https://reviews.llvm.org/D144381

Files:
  llvm/include/llvm/Analysis/ScalarEvolution.h
  llvm/unittests/Analysis/ScalarEvolutionTest.cpp


Index: llvm/unittests/Analysis/ScalarEvolutionTest.cpp
===================================================================
--- llvm/unittests/Analysis/ScalarEvolutionTest.cpp
+++ llvm/unittests/Analysis/ScalarEvolutionTest.cpp
@@ -1744,4 +1744,26 @@
   });
 }
 
+TEST_F(ScalarEvolutionsTest, CheckGetPowerOfTwo) {
+  LLVMContext C;
+  SMDiagnostic Err;
+  std::unique_ptr<Module> M = parseAssemblyString("define void @foo(i64 %x) { "
+                                                  "  ret void "
+                                                  "} ",
+                                                  Err, C);
+
+  ASSERT_TRUE(M && "Could not parse module?");
+  ASSERT_TRUE(!verifyModule(*M) && "Must have been well formed!");
+
+  runWithSE(*M, "foo", [](Function &F, LoopInfo &LI, ScalarEvolution &SE) {
+    auto *X = SE.getSCEV(getArgByName(F, "x"));
+    Type *Ty = X->getType();
+    for (unsigned short i = 0; i < 64; ++i) {
+      EXPECT_TRUE(dyn_cast<SCEVConstant>(SE.getPowerOfTwo(Ty, i))
+                      ->getValue()
+                      ->equalsInt(1ULL << i));
+    }
+  });
+}
+
 }  // end namespace llvm
Index: llvm/include/llvm/Analysis/ScalarEvolution.h
===================================================================
--- llvm/include/llvm/Analysis/ScalarEvolution.h
+++ llvm/include/llvm/Analysis/ScalarEvolution.h
@@ -655,6 +655,13 @@
   /// Return a SCEV for the constant 1 of a specific type.
   const SCEV *getOne(Type *Ty) { return getConstant(Ty, 1); }
 
+  /// Return a SCEV for the constant \p Power of two.
+  const SCEV *getPowerOfTwo(Type *Ty, unsigned Power) {
+    auto Val = APInt::getZero(getTypeSizeInBits(Ty));
+    Val.setBit(Power);
+    return getConstant(Val);
+  }
+
   /// Return a SCEV for the constant -1 of a specific type.
   const SCEV *getMinusOne(Type *Ty) {
     return getConstant(Ty, -1, /*isSigned=*/true);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D144381.500694.patch
Type: text/x-patch
Size: 1879 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230227/548c6ea1/attachment.bin>


More information about the llvm-commits mailing list