Index: lib/Transforms/InstCombine/InstCombineCompares.cpp |
diff --git a/lib/Transforms/InstCombine/InstCombineCompares.cpp b/lib/Transforms/InstCombine/InstCombineCompares.cpp |
index 682820a25ca24bb2eaf41a6017306377608eb062..0a7e99413feddd430dda44b061c5927b9dcbe7ae 100644 |
--- a/lib/Transforms/InstCombine/InstCombineCompares.cpp |
+++ b/lib/Transforms/InstCombine/InstCombineCompares.cpp |
@@ -13,6 +13,7 @@ |
#include "InstCombine.h" |
#include "llvm/ADT/Statistic.h" |
+#include "llvm/ADT/Triple.h" // @LOCALMOD |
#include "llvm/Analysis/ConstantFolding.h" |
#include "llvm/Analysis/InstructionSimplify.h" |
#include "llvm/Analysis/MemoryBuiltins.h" |
@@ -1635,6 +1636,11 @@ Instruction *InstCombiner::visitICmpInstWithInstAndIntCst(ICmpInst &ICI, |
// smaller constant, which will be target friendly. |
unsigned Amt = ShAmt->getLimitedValue(TypeBits-1); |
if (LHSI->hasOneUse() && |
+ // @LOCALMOD-BEGIN |
+ // We don't want to introduce non-power-of-two integer sizes for PNaCl's |
+ // stable wire format, so modify this transformation for NaCl. |
+ isPowerOf2_32(TypeBits - Amt) && (TypeBits - Amt) >= 8 && |
+ // @LOCALMOD-END |
Amt != 0 && RHSV.countTrailingZeros() >= Amt) { |
Type *NTy = IntegerType::get(ICI.getContext(), TypeBits - Amt); |
Constant *NCI = ConstantExpr::getTrunc( |
@@ -2677,6 +2683,12 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) { |
// |
// sum = a + b |
// if (sum+128 >u 255) ... -> llvm.sadd.with.overflow.i8 |
+ // @LOCALMOD-BEGIN |
+ // This is disabled for PNaCl, because we don't support the |
+ // with.overflow intrinsics in PNaCl's stable ABI. |
+ Triple T(I.getParent()->getParent()->getParent()->getTargetTriple()); |
+ if (T.getArch() != Triple::le32) |
+ // @LOCALMOD-END |
{ |
ConstantInt *CI2; // I = icmp ugt (add (add A, B), CI2), CI |
if (I.getPredicate() == ICmpInst::ICMP_UGT && |
@@ -3417,6 +3429,11 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) { |
return new ICmpInst(I.getPredicate(), ConstantExpr::getNot(RHSC), A); |
} |
+ // @LOCALMOD-BEGIN |
+ // This is disabled for PNaCl, because we don't support the |
+ // with.overflow intrinsics in PNaCl's stable ABI. |
+ Triple T(I.getParent()->getParent()->getParent()->getTargetTriple()); |
+ if (T.getArch() != Triple::le32) { |
// (a+b) <u a --> llvm.uadd.with.overflow. |
// (a+b) <u b --> llvm.uadd.with.overflow. |
if (I.getPredicate() == ICmpInst::ICMP_ULT && |
@@ -3442,6 +3459,8 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) { |
if (Instruction *R = ProcessUMulZExtIdiom(I, Op1, Op0, *this)) |
return R; |
} |
+ } |
+ // @LOCALMOD-END |
} |
if (I.isEquality()) { |