@@ -5262,33 +5262,47 @@ void llvm::UpgradeIntrinsicCall(CallBase *CI, Function *NewFn) {
52625262 return ;
52635263 }
52645264
5265+ auto GetMaybeAlign = [](Value *Op) {
5266+ if (auto *CI = dyn_cast<ConstantInt>(Op)) {
5267+ uint64_t Val = CI->getZExtValue ();
5268+ if (Val == 0 )
5269+ return MaybeAlign ();
5270+ if (isPowerOf2_64 (Val))
5271+ return MaybeAlign (Val);
5272+ }
5273+ reportFatalUsageError (" Invalid alignment argument" );
5274+ };
5275+ auto GetAlign = [&](Value *Op) {
5276+ MaybeAlign Align = GetMaybeAlign (Op);
5277+ if (Align)
5278+ return *Align;
5279+ reportFatalUsageError (" Invalid zero alignment argument" );
5280+ };
5281+
52655282 const DataLayout &DL = CI->getDataLayout ();
52665283 switch (NewFn->getIntrinsicID ()) {
52675284 case Intrinsic::masked_load:
52685285 NewCall = Builder.CreateMaskedLoad (
5269- CI->getType (), CI->getArgOperand (0 ),
5270- cast<ConstantInt>(CI->getArgOperand (1 ))->getAlignValue (),
5286+ CI->getType (), CI->getArgOperand (0 ), GetAlign (CI->getArgOperand (1 )),
52715287 CI->getArgOperand (2 ), CI->getArgOperand (3 ));
52725288 break ;
52735289 case Intrinsic::masked_gather:
52745290 NewCall = Builder.CreateMaskedGather (
52755291 CI->getType (), CI->getArgOperand (0 ),
5276- DL.getValueOrABITypeAlignment (
5277- cast<ConstantInt>(CI->getArgOperand (1 ))->getMaybeAlignValue (),
5278- CI->getType ()->getScalarType ()),
5292+ DL.getValueOrABITypeAlignment (GetMaybeAlign (CI->getArgOperand (1 )),
5293+ CI->getType ()->getScalarType ()),
52795294 CI->getArgOperand (2 ), CI->getArgOperand (3 ));
52805295 break ;
52815296 case Intrinsic::masked_store:
52825297 NewCall = Builder.CreateMaskedStore (
52835298 CI->getArgOperand (0 ), CI->getArgOperand (1 ),
5284- cast<ConstantInt>(CI->getArgOperand (2 ))->getAlignValue (),
5285- CI->getArgOperand (3 ));
5299+ GetAlign (CI->getArgOperand (2 )), CI->getArgOperand (3 ));
52865300 break ;
52875301 case Intrinsic::masked_scatter:
52885302 NewCall = Builder.CreateMaskedScatter (
52895303 CI->getArgOperand (0 ), CI->getArgOperand (1 ),
52905304 DL.getValueOrABITypeAlignment (
5291- cast<ConstantInt> (CI->getArgOperand (2 ))-> getMaybeAlignValue ( ),
5305+ GetMaybeAlign (CI->getArgOperand (2 )),
52925306 CI->getArgOperand (0 )->getType ()->getScalarType ()),
52935307 CI->getArgOperand (3 ));
52945308 break ;
0 commit comments