diff options
author | Chris Lattner <sabre@nondot.org> | 2009-11-04 05:00:12 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-11-04 05:00:12 +0000 |
commit | 6bffa63dfea29a525bbd38ff46d03bcc40459dca (patch) | |
tree | dd3ee3b675bf0c700fd6d4ec2e891b719439118a /include/llvm | |
parent | 1fce948ccbd67fff3fc7df954cd1c38f7991398d (diff) | |
download | external_llvm-6bffa63dfea29a525bbd38ff46d03bcc40459dca.zip external_llvm-6bffa63dfea29a525bbd38ff46d03bcc40459dca.tar.gz external_llvm-6bffa63dfea29a525bbd38ff46d03bcc40459dca.tar.bz2 |
make IRBuilder zap "X|0" and "X&-1" when building IR, this happens
during bitfield codegen and slows down -O0 compile times by making
useless IR. rdar://7362516
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@86006 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm')
-rw-r--r-- | include/llvm/Support/IRBuilder.h | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/include/llvm/Support/IRBuilder.h b/include/llvm/Support/IRBuilder.h index 8f26cea..4652e8f 100644 --- a/include/llvm/Support/IRBuilder.h +++ b/include/llvm/Support/IRBuilder.h @@ -390,15 +390,21 @@ public: return Insert(BinaryOperator::CreateAShr(LHS, RHS), Name); } Value *CreateAnd(Value *LHS, Value *RHS, const Twine &Name = "") { - if (Constant *LC = dyn_cast<Constant>(LHS)) - if (Constant *RC = dyn_cast<Constant>(RHS)) + if (Constant *RC = dyn_cast<Constant>(RHS)) { + if (isa<ConstantInt>(RC) && cast<ConstantInt>(RC)->isAllOnesValue()) + return LHS; // LHS & -1 -> LHS + if (Constant *LC = dyn_cast<Constant>(LHS)) return Folder.CreateAnd(LC, RC); + } return Insert(BinaryOperator::CreateAnd(LHS, RHS), Name); } Value *CreateOr(Value *LHS, Value *RHS, const Twine &Name = "") { - if (Constant *LC = dyn_cast<Constant>(LHS)) - if (Constant *RC = dyn_cast<Constant>(RHS)) + if (Constant *RC = dyn_cast<Constant>(RHS)) { + if (RC->isNullValue()) + return LHS; // LHS | 0 -> LHS + if (Constant *LC = dyn_cast<Constant>(LHS)) return Folder.CreateOr(LC, RC); + } return Insert(BinaryOperator::CreateOr(LHS, RHS), Name); } Value *CreateXor(Value *LHS, Value *RHS, const Twine &Name = "") { |