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

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

Issue 16042011: PNaCl: Disable parts of InstCombine that introduce *.with.overflow intrinsics (Closed) Base URL: http://git.chromium.org/native_client/pnacl-llvm.git@master
Patch Set: Created 7 years, 6 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/Analysis/NaCl/PNaClABIVerifyModule.cpp ('k') | test/Transforms/InstCombine/overflow.ll » ('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.
(...skipping 1924 matching lines...) Expand 10 before | Expand all | Expand 10 after
1935 // addition in wider type, and explicitly checks for overflow using 1935 // addition in wider type, and explicitly checks for overflow using
1936 // comparisons against INT_MIN and INT_MAX. Simplify this by using the 1936 // comparisons against INT_MIN and INT_MAX. Simplify this by using the
1937 // sadd_with_overflow intrinsic. 1937 // sadd_with_overflow intrinsic.
1938 // 1938 //
1939 // TODO: This could probably be generalized to handle other overflow-safe 1939 // TODO: This could probably be generalized to handle other overflow-safe
1940 // operations if we worked out the formulas to compute the appropriate 1940 // operations if we worked out the formulas to compute the appropriate
1941 // magic constants. 1941 // magic constants.
1942 // 1942 //
1943 // sum = a + b 1943 // sum = a + b
1944 // if (sum+128 >u 255) ... -> llvm.sadd.with.overflow.i8 1944 // if (sum+128 >u 255) ... -> llvm.sadd.with.overflow.i8
1945 { 1945 // @LOCALMOD-BEGIN
1946 ConstantInt *CI2; // I = icmp ugt (add (add A, B), CI2), CI 1946 // This is disabled for PNaCl, because we don't support the
1947 if (I.getPredicate() == ICmpInst::ICMP_UGT && 1947 // with.overflow intrinsics in PNaCl's stable ABI.
1948 match(Op0, m_Add(m_Add(m_Value(A), m_Value(B)), m_ConstantInt(CI2)))) 1948 if (0) {
1949 if (Instruction *Res = ProcessUGT_ADDCST_ADD(I, A, B, CI2, CI, *this)) 1949 ConstantInt *CI2; // I = icmp ugt (add (add A, B), CI2), CI
1950 return Res; 1950 if (I.getPredicate() == ICmpInst::ICMP_UGT &&
1951 match(Op0, m_Add(m_Add(m_Value(A), m_Value(B)), m_ConstantInt(CI2))))
1952 if (Instruction *Res = ProcessUGT_ADDCST_ADD(I, A, B, CI2, CI, *this))
1953 return Res;
1951 } 1954 }
1955 // @LOCALMOD-END
1952 1956
1953 // (icmp ne/eq (sub A B) 0) -> (icmp ne/eq A, B) 1957 // (icmp ne/eq (sub A B) 0) -> (icmp ne/eq A, B)
1954 if (I.isEquality() && CI->isZero() && 1958 if (I.isEquality() && CI->isZero() &&
1955 match(Op0, m_Sub(m_Value(A), m_Value(B)))) { 1959 match(Op0, m_Sub(m_Value(A), m_Value(B)))) {
1956 // (icmp cond A B) if cond is equality 1960 // (icmp cond A B) if cond is equality
1957 return new ICmpInst(I.getPredicate(), A, B); 1961 return new ICmpInst(I.getPredicate(), A, B);
1958 } 1962 }
1959 1963
1960 // If we have an icmp le or icmp ge instruction, turn it into the 1964 // If we have an icmp le or icmp ge instruction, turn it into the
1961 // appropriate icmp lt or icmp gt instruction. This allows us to rely on 1965 // appropriate icmp lt or icmp gt instruction. This allows us to rely on
(...skipping 585 matching lines...) Expand 10 before | Expand all | Expand 10 after
2547 { Value *A, *B; 2551 { Value *A, *B;
2548 // ~x < ~y --> y < x 2552 // ~x < ~y --> y < x
2549 // ~x < cst --> ~cst < x 2553 // ~x < cst --> ~cst < x
2550 if (match(Op0, m_Not(m_Value(A)))) { 2554 if (match(Op0, m_Not(m_Value(A)))) {
2551 if (match(Op1, m_Not(m_Value(B)))) 2555 if (match(Op1, m_Not(m_Value(B))))
2552 return new ICmpInst(I.getPredicate(), B, A); 2556 return new ICmpInst(I.getPredicate(), B, A);
2553 if (ConstantInt *RHSC = dyn_cast<ConstantInt>(Op1)) 2557 if (ConstantInt *RHSC = dyn_cast<ConstantInt>(Op1))
2554 return new ICmpInst(I.getPredicate(), ConstantExpr::getNot(RHSC), A); 2558 return new ICmpInst(I.getPredicate(), ConstantExpr::getNot(RHSC), A);
2555 } 2559 }
2556 2560
2557 // (a+b) <u a --> llvm.uadd.with.overflow. 2561 // @LOCALMOD-BEGIN
2558 // (a+b) <u b --> llvm.uadd.with.overflow. 2562 // This is disabled for PNaCl, because we don't support the
2559 if (I.getPredicate() == ICmpInst::ICMP_ULT && 2563 // with.overflow intrinsics in PNaCl's stable ABI.
2560 match(Op0, m_Add(m_Value(A), m_Value(B))) && 2564 if (0) {
2561 (Op1 == A || Op1 == B)) 2565 // (a+b) <u a --> llvm.uadd.with.overflow.
2562 if (Instruction *R = ProcessUAddIdiom(I, Op0, *this)) 2566 // (a+b) <u b --> llvm.uadd.with.overflow.
2563 return R; 2567 if (I.getPredicate() == ICmpInst::ICMP_ULT &&
2568 match(Op0, m_Add(m_Value(A), m_Value(B))) &&
2569 (Op1 == A || Op1 == B))
2570 if (Instruction *R = ProcessUAddIdiom(I, Op0, *this))
2571 return R;
2564 2572
2565 // a >u (a+b) --> llvm.uadd.with.overflow. 2573 // a >u (a+b) --> llvm.uadd.with.overflow.
2566 // b >u (a+b) --> llvm.uadd.with.overflow. 2574 // b >u (a+b) --> llvm.uadd.with.overflow.
2567 if (I.getPredicate() == ICmpInst::ICMP_UGT && 2575 if (I.getPredicate() == ICmpInst::ICMP_UGT &&
2568 match(Op1, m_Add(m_Value(A), m_Value(B))) && 2576 match(Op1, m_Add(m_Value(A), m_Value(B))) &&
2569 (Op0 == A || Op0 == B)) 2577 (Op0 == A || Op0 == B))
2570 if (Instruction *R = ProcessUAddIdiom(I, Op1, *this)) 2578 if (Instruction *R = ProcessUAddIdiom(I, Op1, *this))
2571 return R; 2579 return R;
2580 }
2581 // @LOCALMOD-END
2572 } 2582 }
2573 2583
2574 if (I.isEquality()) { 2584 if (I.isEquality()) {
2575 Value *A, *B, *C, *D; 2585 Value *A, *B, *C, *D;
2576 2586
2577 if (match(Op0, m_Xor(m_Value(A), m_Value(B)))) { 2587 if (match(Op0, m_Xor(m_Value(A), m_Value(B)))) {
2578 if (A == Op1 || B == Op1) { // (A^B) == A -> B == 0 2588 if (A == Op1 || B == Op1) { // (A^B) == A -> B == 0
2579 Value *OtherVal = A == Op1 ? B : A; 2589 Value *OtherVal = A == Op1 ? B : A;
2580 return new ICmpInst(I.getPredicate(), OtherVal, 2590 return new ICmpInst(I.getPredicate(), OtherVal,
2581 Constant::getNullValue(A->getType())); 2591 Constant::getNullValue(A->getType()));
(...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after
3083 3093
3084 // fcmp (fpext x), (fpext y) -> fcmp x, y 3094 // fcmp (fpext x), (fpext y) -> fcmp x, y
3085 if (FPExtInst *LHSExt = dyn_cast<FPExtInst>(Op0)) 3095 if (FPExtInst *LHSExt = dyn_cast<FPExtInst>(Op0))
3086 if (FPExtInst *RHSExt = dyn_cast<FPExtInst>(Op1)) 3096 if (FPExtInst *RHSExt = dyn_cast<FPExtInst>(Op1))
3087 if (LHSExt->getSrcTy() == RHSExt->getSrcTy()) 3097 if (LHSExt->getSrcTy() == RHSExt->getSrcTy())
3088 return new FCmpInst(I.getPredicate(), LHSExt->getOperand(0), 3098 return new FCmpInst(I.getPredicate(), LHSExt->getOperand(0),
3089 RHSExt->getOperand(0)); 3099 RHSExt->getOperand(0));
3090 3100
3091 return Changed ? &I : 0; 3101 return Changed ? &I : 0;
3092 } 3102 }
OLDNEW
« no previous file with comments | « lib/Analysis/NaCl/PNaClABIVerifyModule.cpp ('k') | test/Transforms/InstCombine/overflow.ll » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698