diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index 1e1db20ff2f..92760b60ac1 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -4664,7 +4664,7 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { break; } - // Simplify seteq and setne instructions... + // Simplify seteq and setne instructions with integer constant RHS. if (I.isEquality()) { bool isSetNE = I.getOpcode() == Instruction::SetNE; @@ -4780,6 +4780,29 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) { } default: break; } + } else if (IntrinsicInst *II = dyn_cast(Op0)) { + // Handle set{eq|ne} , intcst. + switch (II->getIntrinsicID()) { + default: break; + case Intrinsic::bswap_i16: // seteq (bswap(x)), c -> seteq(x,bswap(c)) + WorkList.push_back(II); // Dead? + I.setOperand(0, II->getOperand(1)); + I.setOperand(1, ConstantInt::get(Type::UShortTy, + ByteSwap_16(CI->getZExtValue()))); + return &I; + case Intrinsic::bswap_i32: // seteq (bswap(x)), c -> seteq(x,bswap(c)) + WorkList.push_back(II); // Dead? + I.setOperand(0, II->getOperand(1)); + I.setOperand(1, ConstantInt::get(Type::UIntTy, + ByteSwap_32(CI->getZExtValue()))); + return &I; + case Intrinsic::bswap_i64: // seteq (bswap(x)), c -> seteq(x,bswap(c)) + WorkList.push_back(II); // Dead? + I.setOperand(0, II->getOperand(1)); + I.setOperand(1, ConstantInt::get(Type::ULongTy, + ByteSwap_64(CI->getZExtValue()))); + return &I; + } } } else { // Not a SetEQ/SetNE // If the LHS is a cast from an integral value of the same size,