[llvm] r365858 - Handle IntToPtr in isBytewiseValue

Vitaly Buka via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 11 18:42:04 PDT 2019


Author: vitalybuka
Date: Thu Jul 11 18:42:03 2019
New Revision: 365858

URL: http://llvm.org/viewvc/llvm-project?rev=365858&view=rev
Log:
Handle IntToPtr in isBytewiseValue

Summary:
This helps with more efficient use of memset for pattern initialization

>From @pcc prototype for -ftrivial-auto-var-init=pattern optimizations

Binary size change on CTMark, (with -fuse-ld=lld -Wl,--icf=all, similar results with default linker options)
```
                   master           patch      diff
Os           8.238864e+05    8.238864e+05       0.0
O3           1.054797e+06    1.054797e+06       0.0
Os zero      8.292384e+05    8.292384e+05       0.0
O3 zero      1.062626e+06    1.062626e+06       0.0
Os pattern   8.579712e+05    8.338048e+05 -0.030299
O3 pattern   1.090502e+06    1.067574e+06 -0.020481
```

Zero vs Pattern on master
```
               zero       pattern      diff
Os     8.292384e+05  8.579712e+05  0.036578
O3     1.062626e+06  1.090502e+06  0.025124
```

Zero vs Pattern with the patch
```
               zero       pattern      diff
Os     8.292384e+05  8.338048e+05  0.003333
O3     1.062626e+06  1.067574e+06  0.003193
```

Reviewers: pcc, eugenis

Subscribers: hiraditya, cfe-commits, llvm-commits

Tags: #clang, #llvm

Differential Revision: https://reviews.llvm.org/D63967

Modified:
    llvm/trunk/lib/Analysis/ValueTracking.cpp
    llvm/trunk/unittests/Analysis/ValueTrackingTest.cpp

Modified: llvm/trunk/lib/Analysis/ValueTracking.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ValueTracking.cpp?rev=365858&r1=365857&r2=365858&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ValueTracking.cpp (original)
+++ llvm/trunk/lib/Analysis/ValueTracking.cpp Thu Jul 11 18:42:03 2019
@@ -3218,6 +3218,17 @@ Value *llvm::isBytewiseValue(Value *V, c
     }
   }
 
+  if (auto *CE = dyn_cast<ConstantExpr>(C)) {
+    if (CE->getOpcode() == Instruction::IntToPtr) {
+      auto PS = DL.getPointerSizeInBits(
+          cast<PointerType>(CE->getType())->getAddressSpace());
+      return isBytewiseValue(
+          ConstantExpr::getIntegerCast(CE->getOperand(0),
+                                       Type::getIntNTy(Ctx, PS), false),
+          DL);
+    }
+  }
+
   auto Merge = [&](Value *LHS, Value *RHS) -> Value * {
     if (LHS == RHS)
       return LHS;

Modified: llvm/trunk/unittests/Analysis/ValueTrackingTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Analysis/ValueTrackingTest.cpp?rev=365858&r1=365857&r2=365858&view=diff
==============================================================================
--- llvm/trunk/unittests/Analysis/ValueTrackingTest.cpp (original)
+++ llvm/trunk/unittests/Analysis/ValueTrackingTest.cpp Thu Jul 11 18:42:03 2019
@@ -794,11 +794,11 @@ const std::pair<const char *, const char
         "i16* inttoptr (i64 0 to i16*)",
     },
     {
-        "",
+        "i8 -1",
         "i16* inttoptr (i64 -1 to i16*)",
     },
     {
-        "",
+        "i8 -86",
         "i16* inttoptr (i64 -6148914691236517206 to i16*)",
     },
     {
@@ -806,7 +806,7 @@ const std::pair<const char *, const char
         "i16* inttoptr (i48 -1 to i16*)",
     },
     {
-        "",
+        "i8 -1",
         "i16* inttoptr (i96 -1 to i16*)",
     },
     {




More information about the llvm-commits mailing list