aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/IR
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/IR')
-rw-r--r--llvm/lib/IR/AutoUpgrade.cpp56
-rw-r--r--llvm/lib/IR/Value.cpp14
2 files changed, 61 insertions, 9 deletions
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp
index 5385b1f..f28b989 100644
--- a/llvm/lib/IR/AutoUpgrade.cpp
+++ b/llvm/lib/IR/AutoUpgrade.cpp
@@ -594,6 +594,42 @@ static bool upgradeX86IntrinsicFunction(Function *F, StringRef Name,
return false; // No other 'x86.avx512.*'.
}
+ if (Name.consume_front("avx2.vpdpb")) {
+ // Added in 21.1
+ ID = StringSwitch<Intrinsic::ID>(Name)
+ .Case("ssd.128", Intrinsic::x86_avx2_vpdpbssd_128)
+ .Case("ssd.256", Intrinsic::x86_avx2_vpdpbssd_256)
+ .Case("ssds.128", Intrinsic::x86_avx2_vpdpbssds_128)
+ .Case("ssds.256", Intrinsic::x86_avx2_vpdpbssds_256)
+ .Case("sud.128", Intrinsic::x86_avx2_vpdpbsud_128)
+ .Case("sud.256", Intrinsic::x86_avx2_vpdpbsud_256)
+ .Case("suds.128", Intrinsic::x86_avx2_vpdpbsuds_128)
+ .Case("suds.256", Intrinsic::x86_avx2_vpdpbsuds_256)
+ .Case("uud.128", Intrinsic::x86_avx2_vpdpbuud_128)
+ .Case("uud.256", Intrinsic::x86_avx2_vpdpbuud_256)
+ .Case("uuds.128", Intrinsic::x86_avx2_vpdpbuuds_128)
+ .Case("uuds.256", Intrinsic::x86_avx2_vpdpbuuds_256)
+ .Default(Intrinsic::not_intrinsic);
+ if (ID != Intrinsic::not_intrinsic)
+ return upgradeX86MultiplyAddBytes(F, ID, NewFn);
+ return false; // No other 'x86.avx2.*'
+ }
+
+ if (Name.consume_front("avx10.vpdpb")) {
+ // Added in 21.1
+ ID = StringSwitch<Intrinsic::ID>(Name)
+ .Case("ssd.512", Intrinsic::x86_avx10_vpdpbssd_512)
+ .Case("ssds.512", Intrinsic::x86_avx10_vpdpbssds_512)
+ .Case("sud.512", Intrinsic::x86_avx10_vpdpbsud_512)
+ .Case("suds.512", Intrinsic::x86_avx10_vpdpbsuds_512)
+ .Case("uud.512", Intrinsic::x86_avx10_vpdpbuud_512)
+ .Case("uuds.512", Intrinsic::x86_avx10_vpdpbuuds_512)
+ .Default(Intrinsic::not_intrinsic);
+ if (ID != Intrinsic::not_intrinsic)
+ return upgradeX86MultiplyAddBytes(F, ID, NewFn);
+ return false; // No other 'x86.avx10.*'
+ }
+
if (Name.consume_front("avx512bf16.")) {
// Added in 9.0
ID = StringSwitch<Intrinsic::ID>(Name)
@@ -5224,7 +5260,25 @@ void llvm::UpgradeIntrinsicCall(CallBase *CI, Function *NewFn) {
case Intrinsic::x86_avx512_vpdpbusd_512:
case Intrinsic::x86_avx512_vpdpbusds_128:
case Intrinsic::x86_avx512_vpdpbusds_256:
- case Intrinsic::x86_avx512_vpdpbusds_512: {
+ case Intrinsic::x86_avx512_vpdpbusds_512:
+ case Intrinsic::x86_avx2_vpdpbssd_128:
+ case Intrinsic::x86_avx2_vpdpbssd_256:
+ case Intrinsic::x86_avx10_vpdpbssd_512:
+ case Intrinsic::x86_avx2_vpdpbssds_128:
+ case Intrinsic::x86_avx2_vpdpbssds_256:
+ case Intrinsic::x86_avx10_vpdpbssds_512:
+ case Intrinsic::x86_avx2_vpdpbsud_128:
+ case Intrinsic::x86_avx2_vpdpbsud_256:
+ case Intrinsic::x86_avx10_vpdpbsud_512:
+ case Intrinsic::x86_avx2_vpdpbsuds_128:
+ case Intrinsic::x86_avx2_vpdpbsuds_256:
+ case Intrinsic::x86_avx10_vpdpbsuds_512:
+ case Intrinsic::x86_avx2_vpdpbuud_128:
+ case Intrinsic::x86_avx2_vpdpbuud_256:
+ case Intrinsic::x86_avx10_vpdpbuud_512:
+ case Intrinsic::x86_avx2_vpdpbuuds_128:
+ case Intrinsic::x86_avx2_vpdpbuuds_256:
+ case Intrinsic::x86_avx10_vpdpbuuds_512: {
unsigned NumElts = CI->getType()->getPrimitiveSizeInBits() / 8;
Value *Args[] = {CI->getArgOperand(0), CI->getArgOperand(1),
CI->getArgOperand(2)};
diff --git a/llvm/lib/IR/Value.cpp b/llvm/lib/IR/Value.cpp
index 4e8f359..e5e062d 100644
--- a/llvm/lib/IR/Value.cpp
+++ b/llvm/lib/IR/Value.cpp
@@ -1000,14 +1000,12 @@ Align Value::getPointerAlignment(const DataLayout &DL) const {
ConstantInt *CI = mdconst::extract<ConstantInt>(MD->getOperand(0));
return Align(CI->getLimitedValue());
}
- } else if (auto *CstPtr = dyn_cast<Constant>(this)) {
- // Strip pointer casts to avoid creating unnecessary ptrtoint expression
- // if the only "reduction" is combining a bitcast + ptrtoint.
- CstPtr = CstPtr->stripPointerCasts();
- if (auto *CstInt = dyn_cast_or_null<ConstantInt>(ConstantExpr::getPtrToInt(
- const_cast<Constant *>(CstPtr), DL.getIntPtrType(getType()),
- /*OnlyIfReduced=*/true))) {
- size_t TrailingZeros = CstInt->getValue().countr_zero();
+ } else if (auto *CE = dyn_cast<ConstantExpr>(this)) {
+ // Determine the alignment of inttoptr(C).
+ if (CE->getOpcode() == Instruction::IntToPtr &&
+ isa<ConstantInt>(CE->getOperand(0))) {
+ ConstantInt *IntPtr = cast<ConstantInt>(CE->getOperand(0));
+ size_t TrailingZeros = IntPtr->getValue().countr_zero();
// While the actual alignment may be large, elsewhere we have
// an arbitrary upper alignmet limit, so let's clamp to it.
return Align(TrailingZeros < Value::MaxAlignmentExponent