- // Functions are at least 4-byte aligned. If and'ing the address of a
- // function with a constant < 4, fold it to zero.
- if (const ConstantInt *CI = dyn_cast<ConstantInt>(C2))
- if (CI->getValue().ult(APInt(CI->getType()->getBitWidth(),4)) &&
- isa<Function>(CPR))
- return Constant::getNullValue(CI->getType());
+ // Functions are at least 4-byte aligned.
+ unsigned GVAlign = GV->getAlignment();
+ if (isa<Function>(GV))
+ GVAlign = std::max(GVAlign, 4U);
+
+ if (GVAlign > 1) {
+ unsigned DstWidth = CI2->getType()->getBitWidth();
+ unsigned SrcWidth = std::min(SrcWidth, Log2_32(GVAlign));
+ APInt BitsNotSet(APInt::getLowBitsSet(DstWidth, SrcWidth));
+
+ // If checking bits we know are clear, return zero.
+ if ((CI2->getValue() & BitsNotSet) == CI2->getValue())
+ return Constant::getNullValue(CI2->getType());
+ }