@@ -2704,7 +2704,7 @@ EmitAsmStores(CodeGenFunction &CGF, const AsmStmt &S,
27042704 const llvm::ArrayRef<LValue> ResultRegDests,
27052705 const llvm::ArrayRef<QualType> ResultRegQualTys,
27062706 const llvm::BitVector &ResultTypeRequiresCast,
2707- const std::vector<unsigned > &ResultFlagRegCCBound ) {
2707+ const std::vector<unsigned > &OutputOperandBounds ) {
27082708 CGBuilderTy &Builder = CGF.Builder ;
27092709 CodeGenModule &CGM = CGF.CGM ;
27102710 llvm::LLVMContext &CTX = CGF.getLLVMContext ();
@@ -2715,23 +2715,22 @@ EmitAsmStores(CodeGenFunction &CGF, const AsmStmt &S,
27152715 // ResultRegDests can be also populated by addReturnRegisterOutputs() above,
27162716 // in which case its size may grow.
27172717 assert (ResultTypeRequiresCast.size () <= ResultRegDests.size ());
2718- assert (ResultFlagRegCCBound .size () <= ResultRegDests.size ());
2718+ assert (OutputOperandBounds .size () <= ResultRegDests.size ());
27192719
27202720 for (unsigned i = 0 , e = RegResults.size (); i != e; ++i) {
27212721 llvm::Value *Tmp = RegResults[i];
27222722 llvm::Type *TruncTy = ResultTruncRegTypes[i];
27232723
2724- if ((i < ResultFlagRegCCBound .size ()) && ResultFlagRegCCBound [i]) {
2724+ if ((i < OutputOperandBounds .size ()) && OutputOperandBounds [i]) {
27252725 // Target must guarantee the Value `Tmp` here is lowered to a boolean
27262726 // value.
27272727 // Lowering 'Tmp' as - 'icmp ult %Tmp , CCUpperBound'.
2728- unsigned CCUpperBound = ResultFlagRegCCBound[i];
2729- assert ((CCUpperBound == 2 || CCUpperBound == 4 ) &&
2730- " CC upper bound out of range!" );
2731- llvm::Constant *CCUpperBoundConst =
2732- llvm::ConstantInt::get (Tmp->getType (), CCUpperBound);
2728+ unsigned UpperBound = OutputOperandBounds[i];
2729+ assert (UpperBound <= 4 && " Output operand out of range!" );
2730+ llvm::Constant *UpperBoundConst =
2731+ llvm::ConstantInt::get (Tmp->getType (), UpperBound);
27332732 llvm::Value *IsBooleanValue =
2734- Builder.CreateCmp (llvm::CmpInst::ICMP_ULT, Tmp, CCUpperBoundConst );
2733+ Builder.CreateCmp (llvm::CmpInst::ICMP_ULT, Tmp, UpperBoundConst );
27352734 llvm::Function *FnAssume = CGM.getIntrinsic (llvm::Intrinsic::assume);
27362735 Builder.CreateCall (FnAssume, IsBooleanValue);
27372736 }
@@ -2860,7 +2859,7 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
28602859 std::vector<llvm::Type *> ArgElemTypes;
28612860 std::vector<llvm::Value*> Args;
28622861 llvm::BitVector ResultTypeRequiresCast;
2863- std::vector<unsigned > ResultFlagRegCCBound ;
2862+ std::vector<unsigned > OutputOperandBounds ;
28642863
28652864 // Keep track of inout constraints.
28662865 std::string InOutConstraints;
@@ -2918,7 +2917,8 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
29182917 ResultRegQualTys.push_back (QTy);
29192918 ResultRegDests.push_back (Dest);
29202919
2921- ResultFlagRegCCBound.push_back (Info.getFlagOutputCCUpperBound ());
2920+ const auto [_, UpperBound] = Info.getOutputOperandBounds ();
2921+ OutputOperandBounds.push_back (UpperBound);
29222922
29232923 llvm::Type *Ty = ConvertTypeForMem (QTy);
29242924 const bool RequiresCast = Info.allowsRegister () &&
@@ -3265,7 +3265,7 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
32653265
32663266 EmitAsmStores (*this , S, RegResults, ResultRegTypes, ResultTruncRegTypes,
32673267 ResultRegDests, ResultRegQualTys, ResultTypeRequiresCast,
3268- ResultFlagRegCCBound );
3268+ OutputOperandBounds );
32693269
32703270 // If this is an asm goto with outputs, repeat EmitAsmStores, but with a
32713271 // different insertion point; one for each indirect destination and with
@@ -3276,7 +3276,7 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
32763276 Builder.SetInsertPoint (Succ, --(Succ->end ()));
32773277 EmitAsmStores (*this , S, CBRRegResults[Succ], ResultRegTypes,
32783278 ResultTruncRegTypes, ResultRegDests, ResultRegQualTys,
3279- ResultTypeRequiresCast, ResultFlagRegCCBound );
3279+ ResultTypeRequiresCast, OutputOperandBounds );
32803280 }
32813281 }
32823282}
0 commit comments