break;
}
- // Simplify seteq and setne instructions...
+ // Simplify seteq and setne instructions with integer constant RHS.
if (I.isEquality()) {
bool isSetNE = I.getOpcode() == Instruction::SetNE;
}
default: break;
}
+ } else if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(Op0)) {
+ // Handle set{eq|ne} <intrinsic>, 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,