From: Vitaly Buka Date: Fri, 12 Jul 2019 01:42:03 +0000 (+0000) Subject: Handle IntToPtr in isBytewiseValue X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f5af6baa1f9e2138bd40ec797a772623f9009a8a;p=llvm 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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@365858 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/ValueTracking.cpp b/lib/Analysis/ValueTracking.cpp index 27d8e324fad..6857cf412ed 100644 --- a/lib/Analysis/ValueTracking.cpp +++ b/lib/Analysis/ValueTracking.cpp @@ -3218,6 +3218,17 @@ Value *llvm::isBytewiseValue(Value *V, const DataLayout &DL) { } } + if (auto *CE = dyn_cast(C)) { + if (CE->getOpcode() == Instruction::IntToPtr) { + auto PS = DL.getPointerSizeInBits( + cast(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; diff --git a/unittests/Analysis/ValueTrackingTest.cpp b/unittests/Analysis/ValueTrackingTest.cpp index 90c879d2812..9f486e85759 100644 --- a/unittests/Analysis/ValueTrackingTest.cpp +++ b/unittests/Analysis/ValueTrackingTest.cpp @@ -794,11 +794,11 @@ const std::pair IsBytewiseValueTests[] = { "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 IsBytewiseValueTests[] = { "i16* inttoptr (i48 -1 to i16*)", }, { - "", + "i8 -1", "i16* inttoptr (i96 -1 to i16*)", }, {