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
}
}
+ 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;
"i16* inttoptr (i64 0 to i16*)",
},
{
- "",
+ "i8 -1",
"i16* inttoptr (i64 -1 to i16*)",
},
{
- "",
+ "i8 -86",
"i16* inttoptr (i64 -6148914691236517206 to i16*)",
},
{
"i16* inttoptr (i48 -1 to i16*)",
},
{
- "",
+ "i8 -1",
"i16* inttoptr (i96 -1 to i16*)",
},
{