[llvm] 12bf183 - [AutoUpgrade] Gracefully handle invalid alignment on masked intrinsics
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 22 03:47:35 PDT 2025
Author: Nikita Popov
Date: 2025-10-22T12:47:26+02:00
New Revision: 12bf1836dec8d5f47339b485727603568fa9e819
URL: https://github.com/llvm/llvm-project/commit/12bf1836dec8d5f47339b485727603568fa9e819
DIFF: https://github.com/llvm/llvm-project/commit/12bf1836dec8d5f47339b485727603568fa9e819.diff
LOG: [AutoUpgrade] Gracefully handle invalid alignment on masked intrinsics
Generate a usage error instead of asserting.
Added:
llvm/test/Assembler/autoupgrade-invalid-masked-align.ll
Modified:
llvm/lib/IR/AutoUpgrade.cpp
Removed:
################################################################################
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp
index 7e5e7b524d85c..b838e36c8824f 100644
--- a/llvm/lib/IR/AutoUpgrade.cpp
+++ b/llvm/lib/IR/AutoUpgrade.cpp
@@ -5262,33 +5262,47 @@ void llvm::UpgradeIntrinsicCall(CallBase *CI, Function *NewFn) {
return;
}
+ auto GetMaybeAlign = [](Value *Op) {
+ if (auto *CI = dyn_cast<ConstantInt>(Op)) {
+ uint64_t Val = CI->getZExtValue();
+ if (Val == 0)
+ return MaybeAlign();
+ if (isPowerOf2_64(Val))
+ return MaybeAlign(Val);
+ }
+ reportFatalUsageError("Invalid alignment argument");
+ };
+ auto GetAlign = [&](Value *Op) {
+ MaybeAlign Align = GetMaybeAlign(Op);
+ if (Align)
+ return *Align;
+ reportFatalUsageError("Invalid zero alignment argument");
+ };
+
const DataLayout &DL = CI->getDataLayout();
switch (NewFn->getIntrinsicID()) {
case Intrinsic::masked_load:
NewCall = Builder.CreateMaskedLoad(
- CI->getType(), CI->getArgOperand(0),
- cast<ConstantInt>(CI->getArgOperand(1))->getAlignValue(),
+ CI->getType(), CI->getArgOperand(0), GetAlign(CI->getArgOperand(1)),
CI->getArgOperand(2), CI->getArgOperand(3));
break;
case Intrinsic::masked_gather:
NewCall = Builder.CreateMaskedGather(
CI->getType(), CI->getArgOperand(0),
- DL.getValueOrABITypeAlignment(
- cast<ConstantInt>(CI->getArgOperand(1))->getMaybeAlignValue(),
- CI->getType()->getScalarType()),
+ DL.getValueOrABITypeAlignment(GetMaybeAlign(CI->getArgOperand(1)),
+ CI->getType()->getScalarType()),
CI->getArgOperand(2), CI->getArgOperand(3));
break;
case Intrinsic::masked_store:
NewCall = Builder.CreateMaskedStore(
CI->getArgOperand(0), CI->getArgOperand(1),
- cast<ConstantInt>(CI->getArgOperand(2))->getAlignValue(),
- CI->getArgOperand(3));
+ GetAlign(CI->getArgOperand(2)), CI->getArgOperand(3));
break;
case Intrinsic::masked_scatter:
NewCall = Builder.CreateMaskedScatter(
CI->getArgOperand(0), CI->getArgOperand(1),
DL.getValueOrABITypeAlignment(
- cast<ConstantInt>(CI->getArgOperand(2))->getMaybeAlignValue(),
+ GetMaybeAlign(CI->getArgOperand(2)),
CI->getArgOperand(0)->getType()->getScalarType()),
CI->getArgOperand(3));
break;
diff --git a/llvm/test/Assembler/autoupgrade-invalid-masked-align.ll b/llvm/test/Assembler/autoupgrade-invalid-masked-align.ll
new file mode 100644
index 0000000000000..458bd2edce712
--- /dev/null
+++ b/llvm/test/Assembler/autoupgrade-invalid-masked-align.ll
@@ -0,0 +1,49 @@
+; RUN: split-file %s %t
+; RUN: not llvm-as < %t/masked-store.ll 2>&1 | FileCheck %s --check-prefix=MASKED-STORE
+; RUN: not llvm-as < %t/masked-store-zero.ll 2>&1 | FileCheck %s --check-prefix=MASKED-STORE-ZERO
+; RUN: not llvm-as < %t/masked-load.ll 2>&1 | FileCheck %s --check-prefix=MASKED-LOAD
+; RUN: not llvm-as < %t/masked-load-zero.ll 2>&1 | FileCheck %s --check-prefix=MASKED-LOAD-ZERO
+; RUN: not llvm-as < %t/masked-scatter.ll 2>&1 | FileCheck %s --check-prefix=MASKED-SCATTER
+; RUN: not llvm-as < %t/masked-gather.ll 2>&1 | FileCheck %s --check-prefix=MASKED-GATHER
+
+;--- masked-store.ll
+; MASKED-STORE: LLVM ERROR: Invalid alignment argument
+define void @masked_store(ptr %ptr, <2 x i1> %mask, <2 x double> %val) {
+ call void @llvm.masked.store.v2f64.p0(<2 x double> %val, ptr %ptr, i32 3, <2 x i1> %mask)
+ ret void
+}
+
+;--- masked-store-zero.ll
+; MASKED-STORE-ZERO: LLVM ERROR: Invalid zero alignment argument
+define void @masked_store_zero(ptr %ptr, <2 x i1> %mask, <2 x double> %val) {
+ call void @llvm.masked.store.v2f64.p0(<2 x double> %val, ptr %ptr, i32 0, <2 x i1> %mask)
+ ret void
+}
+
+;--- masked-load.ll
+; MASKED-LOAD: LLVM ERROR: Invalid alignment argument
+define void @masked_load(ptr %ptr, <2 x i1> %mask, <2 x double> %val) {
+ call <2 x double> @llvm.masked.load.v2f64.p0(ptr %ptr, i32 3, <2 x i1> %mask, <2 x double> %val)
+ ret void
+}
+
+;--- masked-load-zero.ll
+; MASKED-LOAD-ZERO: LLVM ERROR: Invalid zero alignment argument
+define void @masked_load_zero(ptr %ptr, <2 x i1> %mask, <2 x double> %val) {
+ call <2 x double> @llvm.masked.load.v2f64.p0(ptr %ptr, i32 0, <2 x i1> %mask, <2 x double> %val)
+ ret void
+}
+
+;--- masked-scatter.ll
+; MASKED-SCATTER: LLVM ERROR: Invalid alignment argument
+define void @masked_scatter(<2 x ptr> %ptr, <2 x i1> %mask, <2 x double> %val) {
+ call void @llvm.masked.scatter.v2f64.p0(<2 x double> %val, <2 x ptr> %ptr, i32 3, <2 x i1> %mask)
+ ret void
+}
+
+;--- masked-gather.ll
+; MASKED-GATHER: LLVM ERROR: Invalid alignment argument
+define void @masked_gather(<2 x ptr> %ptr, <2 x i1> %mask, <2 x double> %val) {
+ call <2 x double> @llvm.masked.gather.v2f64.p0(<2 x ptr> %ptr, i32 3, <2 x i1> %mask, <2 x double> %val)
+ ret void
+}
More information about the llvm-commits
mailing list