Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(385)

Side by Side Diff: lib/Transforms/InstCombine/InstCombineCompares.cpp

Issue 939073008: Rebased PNaCl localmods in LLVM to 223109 (Closed)
Patch Set: undo localmod Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « lib/Transforms/IPO/FunctionAttrs.cpp ('k') | lib/Transforms/LLVMBuild.txt » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===- InstCombineCompares.cpp --------------------------------------------===// 1 //===- InstCombineCompares.cpp --------------------------------------------===//
2 // 2 //
3 // The LLVM Compiler Infrastructure 3 // The LLVM Compiler Infrastructure
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 // 9 //
10 // This file implements the visitICmp and visitFCmp functions. 10 // This file implements the visitICmp and visitFCmp functions.
11 // 11 //
12 //===----------------------------------------------------------------------===// 12 //===----------------------------------------------------------------------===//
13 13
14 #include "InstCombine.h" 14 #include "InstCombine.h"
15 #include "llvm/ADT/Statistic.h" 15 #include "llvm/ADT/Statistic.h"
16 #include "llvm/ADT/Triple.h" // @LOCALMOD
16 #include "llvm/Analysis/ConstantFolding.h" 17 #include "llvm/Analysis/ConstantFolding.h"
17 #include "llvm/Analysis/InstructionSimplify.h" 18 #include "llvm/Analysis/InstructionSimplify.h"
18 #include "llvm/Analysis/MemoryBuiltins.h" 19 #include "llvm/Analysis/MemoryBuiltins.h"
19 #include "llvm/IR/ConstantRange.h" 20 #include "llvm/IR/ConstantRange.h"
20 #include "llvm/IR/DataLayout.h" 21 #include "llvm/IR/DataLayout.h"
21 #include "llvm/IR/GetElementPtrTypeIterator.h" 22 #include "llvm/IR/GetElementPtrTypeIterator.h"
22 #include "llvm/IR/IntrinsicInst.h" 23 #include "llvm/IR/IntrinsicInst.h"
23 #include "llvm/IR/PatternMatch.h" 24 #include "llvm/IR/PatternMatch.h"
24 #include "llvm/Support/CommandLine.h" 25 #include "llvm/Support/CommandLine.h"
25 #include "llvm/Support/Debug.h" 26 #include "llvm/Support/Debug.h"
(...skipping 1602 matching lines...) Expand 10 before | Expand all | Expand 10 after
1628 } 1629 }
1629 1630
1630 // Transform (icmp pred iM (shl iM %v, N), CI) 1631 // Transform (icmp pred iM (shl iM %v, N), CI)
1631 // -> (icmp pred i(M-N) (trunc %v iM to i(M-N)), (trunc (CI>>N)) 1632 // -> (icmp pred i(M-N) (trunc %v iM to i(M-N)), (trunc (CI>>N))
1632 // Transform the shl to a trunc if (trunc (CI>>N)) has no loss and M-N. 1633 // Transform the shl to a trunc if (trunc (CI>>N)) has no loss and M-N.
1633 // This enables to get rid of the shift in favor of a trunc which can be 1634 // This enables to get rid of the shift in favor of a trunc which can be
1634 // free on the target. It has the additional benefit of comparing to a 1635 // free on the target. It has the additional benefit of comparing to a
1635 // smaller constant, which will be target friendly. 1636 // smaller constant, which will be target friendly.
1636 unsigned Amt = ShAmt->getLimitedValue(TypeBits-1); 1637 unsigned Amt = ShAmt->getLimitedValue(TypeBits-1);
1637 if (LHSI->hasOneUse() && 1638 if (LHSI->hasOneUse() &&
1639 // @LOCALMOD-BEGIN
1640 // We don't want to introduce non-power-of-two integer sizes for PNaCl's
1641 // stable wire format, so modify this transformation for NaCl.
1642 isPowerOf2_32(TypeBits - Amt) && (TypeBits - Amt) >= 8 &&
1643 // @LOCALMOD-END
1638 Amt != 0 && RHSV.countTrailingZeros() >= Amt) { 1644 Amt != 0 && RHSV.countTrailingZeros() >= Amt) {
1639 Type *NTy = IntegerType::get(ICI.getContext(), TypeBits - Amt); 1645 Type *NTy = IntegerType::get(ICI.getContext(), TypeBits - Amt);
1640 Constant *NCI = ConstantExpr::getTrunc( 1646 Constant *NCI = ConstantExpr::getTrunc(
1641 ConstantExpr::getAShr(RHS, 1647 ConstantExpr::getAShr(RHS,
1642 ConstantInt::get(RHS->getType(), Amt)), 1648 ConstantInt::get(RHS->getType(), Amt)),
1643 NTy); 1649 NTy);
1644 return new ICmpInst(ICI.getPredicate(), 1650 return new ICmpInst(ICI.getPredicate(),
1645 Builder->CreateTrunc(LHSI->getOperand(0), NTy), 1651 Builder->CreateTrunc(LHSI->getOperand(0), NTy),
1646 NCI); 1652 NCI);
1647 } 1653 }
(...skipping 1022 matching lines...) Expand 10 before | Expand all | Expand 10 after
2670 // addition in wider type, and explicitly checks for overflow using 2676 // addition in wider type, and explicitly checks for overflow using
2671 // comparisons against INT_MIN and INT_MAX. Simplify this by using the 2677 // comparisons against INT_MIN and INT_MAX. Simplify this by using the
2672 // sadd_with_overflow intrinsic. 2678 // sadd_with_overflow intrinsic.
2673 // 2679 //
2674 // TODO: This could probably be generalized to handle other overflow-safe 2680 // TODO: This could probably be generalized to handle other overflow-safe
2675 // operations if we worked out the formulas to compute the appropriate 2681 // operations if we worked out the formulas to compute the appropriate
2676 // magic constants. 2682 // magic constants.
2677 // 2683 //
2678 // sum = a + b 2684 // sum = a + b
2679 // if (sum+128 >u 255) ... -> llvm.sadd.with.overflow.i8 2685 // if (sum+128 >u 255) ... -> llvm.sadd.with.overflow.i8
2686 // @LOCALMOD-BEGIN
2687 // This is disabled for PNaCl, because we don't support the
2688 // with.overflow intrinsics in PNaCl's stable ABI.
2689 Triple T(I.getParent()->getParent()->getParent()->getTargetTriple());
2690 if (T.getArch() != Triple::le32)
2691 // @LOCALMOD-END
2680 { 2692 {
2681 ConstantInt *CI2; // I = icmp ugt (add (add A, B), CI2), CI 2693 ConstantInt *CI2; // I = icmp ugt (add (add A, B), CI2), CI
2682 if (I.getPredicate() == ICmpInst::ICMP_UGT && 2694 if (I.getPredicate() == ICmpInst::ICMP_UGT &&
2683 match(Op0, m_Add(m_Add(m_Value(A), m_Value(B)), m_ConstantInt(CI2)))) 2695 match(Op0, m_Add(m_Add(m_Value(A), m_Value(B)), m_ConstantInt(CI2))))
2684 if (Instruction *Res = ProcessUGT_ADDCST_ADD(I, A, B, CI2, CI, *this)) 2696 if (Instruction *Res = ProcessUGT_ADDCST_ADD(I, A, B, CI2, CI, *this))
2685 return Res; 2697 return Res;
2686 } 2698 }
2687 2699
2688 // (icmp ne/eq (sub A B) 0) -> (icmp ne/eq A, B) 2700 // (icmp ne/eq (sub A B) 0) -> (icmp ne/eq A, B)
2689 if (I.isEquality() && CI->isZero() && 2701 if (I.isEquality() && CI->isZero() &&
(...skipping 720 matching lines...) Expand 10 before | Expand all | Expand 10 after
3410 3422
3411 // ~x < ~y --> y < x 3423 // ~x < ~y --> y < x
3412 // ~x < cst --> ~cst < x 3424 // ~x < cst --> ~cst < x
3413 if (match(Op0, m_Not(m_Value(A)))) { 3425 if (match(Op0, m_Not(m_Value(A)))) {
3414 if (match(Op1, m_Not(m_Value(B)))) 3426 if (match(Op1, m_Not(m_Value(B))))
3415 return new ICmpInst(I.getPredicate(), B, A); 3427 return new ICmpInst(I.getPredicate(), B, A);
3416 if (ConstantInt *RHSC = dyn_cast<ConstantInt>(Op1)) 3428 if (ConstantInt *RHSC = dyn_cast<ConstantInt>(Op1))
3417 return new ICmpInst(I.getPredicate(), ConstantExpr::getNot(RHSC), A); 3429 return new ICmpInst(I.getPredicate(), ConstantExpr::getNot(RHSC), A);
3418 } 3430 }
3419 3431
3432 // @LOCALMOD-BEGIN
3433 // This is disabled for PNaCl, because we don't support the
3434 // with.overflow intrinsics in PNaCl's stable ABI.
3435 Triple T(I.getParent()->getParent()->getParent()->getTargetTriple());
3436 if (T.getArch() != Triple::le32) {
3420 // (a+b) <u a --> llvm.uadd.with.overflow. 3437 // (a+b) <u a --> llvm.uadd.with.overflow.
3421 // (a+b) <u b --> llvm.uadd.with.overflow. 3438 // (a+b) <u b --> llvm.uadd.with.overflow.
3422 if (I.getPredicate() == ICmpInst::ICMP_ULT && 3439 if (I.getPredicate() == ICmpInst::ICMP_ULT &&
3423 match(Op0, m_Add(m_Value(A), m_Value(B))) && 3440 match(Op0, m_Add(m_Value(A), m_Value(B))) &&
3424 (Op1 == A || Op1 == B)) 3441 (Op1 == A || Op1 == B))
3425 if (Instruction *R = ProcessUAddIdiom(I, Op0, *this)) 3442 if (Instruction *R = ProcessUAddIdiom(I, Op0, *this))
3426 return R; 3443 return R;
3427 3444
3428 // a >u (a+b) --> llvm.uadd.with.overflow. 3445 // a >u (a+b) --> llvm.uadd.with.overflow.
3429 // b >u (a+b) --> llvm.uadd.with.overflow. 3446 // b >u (a+b) --> llvm.uadd.with.overflow.
3430 if (I.getPredicate() == ICmpInst::ICMP_UGT && 3447 if (I.getPredicate() == ICmpInst::ICMP_UGT &&
3431 match(Op1, m_Add(m_Value(A), m_Value(B))) && 3448 match(Op1, m_Add(m_Value(A), m_Value(B))) &&
3432 (Op0 == A || Op0 == B)) 3449 (Op0 == A || Op0 == B))
3433 if (Instruction *R = ProcessUAddIdiom(I, Op1, *this)) 3450 if (Instruction *R = ProcessUAddIdiom(I, Op1, *this))
3434 return R; 3451 return R;
3435 3452
3436 // (zext a) * (zext b) --> llvm.umul.with.overflow. 3453 // (zext a) * (zext b) --> llvm.umul.with.overflow.
3437 if (match(Op0, m_Mul(m_ZExt(m_Value(A)), m_ZExt(m_Value(B))))) { 3454 if (match(Op0, m_Mul(m_ZExt(m_Value(A)), m_ZExt(m_Value(B))))) {
3438 if (Instruction *R = ProcessUMulZExtIdiom(I, Op0, Op1, *this)) 3455 if (Instruction *R = ProcessUMulZExtIdiom(I, Op0, Op1, *this))
3439 return R; 3456 return R;
3440 } 3457 }
3441 if (match(Op1, m_Mul(m_ZExt(m_Value(A)), m_ZExt(m_Value(B))))) { 3458 if (match(Op1, m_Mul(m_ZExt(m_Value(A)), m_ZExt(m_Value(B))))) {
3442 if (Instruction *R = ProcessUMulZExtIdiom(I, Op1, Op0, *this)) 3459 if (Instruction *R = ProcessUMulZExtIdiom(I, Op1, Op0, *this))
3443 return R; 3460 return R;
3444 } 3461 }
3462 }
3463 // @LOCALMOD-END
3445 } 3464 }
3446 3465
3447 if (I.isEquality()) { 3466 if (I.isEquality()) {
3448 Value *A, *B, *C, *D; 3467 Value *A, *B, *C, *D;
3449 3468
3450 if (match(Op0, m_Xor(m_Value(A), m_Value(B)))) { 3469 if (match(Op0, m_Xor(m_Value(A), m_Value(B)))) {
3451 if (A == Op1 || B == Op1) { // (A^B) == A -> B == 0 3470 if (A == Op1 || B == Op1) { // (A^B) == A -> B == 0
3452 Value *OtherVal = A == Op1 ? B : A; 3471 Value *OtherVal = A == Op1 ? B : A;
3453 return new ICmpInst(I.getPredicate(), OtherVal, 3472 return new ICmpInst(I.getPredicate(), OtherVal,
3454 Constant::getNullValue(A->getType())); 3473 Constant::getNullValue(A->getType()));
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after
3958 3977
3959 // fcmp (fpext x), (fpext y) -> fcmp x, y 3978 // fcmp (fpext x), (fpext y) -> fcmp x, y
3960 if (FPExtInst *LHSExt = dyn_cast<FPExtInst>(Op0)) 3979 if (FPExtInst *LHSExt = dyn_cast<FPExtInst>(Op0))
3961 if (FPExtInst *RHSExt = dyn_cast<FPExtInst>(Op1)) 3980 if (FPExtInst *RHSExt = dyn_cast<FPExtInst>(Op1))
3962 if (LHSExt->getSrcTy() == RHSExt->getSrcTy()) 3981 if (LHSExt->getSrcTy() == RHSExt->getSrcTy())
3963 return new FCmpInst(I.getPredicate(), LHSExt->getOperand(0), 3982 return new FCmpInst(I.getPredicate(), LHSExt->getOperand(0),
3964 RHSExt->getOperand(0)); 3983 RHSExt->getOperand(0));
3965 3984
3966 return Changed ? &I : nullptr; 3985 return Changed ? &I : nullptr;
3967 } 3986 }
OLDNEW
« no previous file with comments | « lib/Transforms/IPO/FunctionAttrs.cpp ('k') | lib/Transforms/LLVMBuild.txt » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698