[PATCH] D76664: [ConstantFold][NFC] Compile time optimization for large vectors

David Majnemer via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 24 18:03:53 PDT 2020


majnemer added inline comments.


================
Comment at: llvm/include/llvm/IR/Constants.h:771
+  // Cache whether or not the constant is a splat.
+  mutable Optional<bool> IsSplat;
+  bool isSplatData() const;
----------------
You could save a byte by rolling your own optional. I think this is valuable because there may be many `ConstantDataVector`.

Maybe something like:
  bool IsSplatSet : 1;
  bool IsSplat : 1;


================
Comment at: llvm/lib/Analysis/ValueTracking.cpp:177-178
   DemandedLHS = DemandedRHS = APInt::getNullValue(NumElts);
-
+  if (DemandedElts.isNullValue())
+    return true;
+  // Simple case of a shuffle with zeroinitializer.
----------------
ThomasRaoux wrote:
> majnemer wrote:
> > I'd float this to the top before we create more APInts.
> I believe we still need to set DemandedLHS and DemandedRHS to APInt::getNullValue(NumElts) so I cannot really move it up? 
I was just thinking of floating this bit up:
  if (DemandedElts.isNullValue())
    return true;


================
Comment at: llvm/lib/IR/ConstantFold.cpp:1389
+      return UndefValue::get(VTy);
+    if (C1Splat && C2Splat) {
+      return ConstantVector::getSplat(
----------------
Now that these are lazy, maybe only do `C1->getSplatValue()` if C2Splat is true.


================
Comment at: llvm/lib/IR/Constants.cpp:2907
+bool ConstantDataVector::isSplat() const {
+  if(!IsSplat.hasValue())
+    IsSplat = isSplatData();
----------------
Formatting.


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

https://reviews.llvm.org/D76664





More information about the llvm-commits mailing list