@@ -2601,7 +2601,7 @@ EmitAsmStores(CodeGenFunction &CGF, const AsmStmt &S,
26012601 const llvm::ArrayRef<LValue> ResultRegDests,
26022602 const llvm::ArrayRef<QualType> ResultRegQualTys,
26032603 const llvm::BitVector &ResultTypeRequiresCast,
2604- const std::vector<unsigned > &ResultRegIsFlagReg ) {
2604+ const std::vector<unsigned > &ResultFlagRegCCBound ) {
26052605 CGBuilderTy &Builder = CGF.Builder ;
26062606 CodeGenModule &CGM = CGF.CGM ;
26072607 llvm::LLVMContext &CTX = CGF.getLLVMContext ();
@@ -2612,23 +2612,19 @@ EmitAsmStores(CodeGenFunction &CGF, const AsmStmt &S,
26122612 // ResultRegDests can be also populated by addReturnRegisterOutputs() above,
26132613 // in which case its size may grow.
26142614 assert (ResultTypeRequiresCast.size () <= ResultRegDests.size ());
2615- assert (ResultRegIsFlagReg .size () <= ResultRegDests.size ());
2615+ assert (ResultFlagRegCCBound .size () <= ResultRegDests.size ());
26162616
26172617 for (unsigned i = 0 , e = RegResults.size (); i != e; ++i) {
26182618 llvm::Value *Tmp = RegResults[i];
26192619 llvm::Type *TruncTy = ResultTruncRegTypes[i];
26202620
2621- if ((i < ResultRegIsFlagReg .size ()) && ResultRegIsFlagReg [i]) {
2621+ if ((i < ResultFlagRegCCBound .size ()) && ResultFlagRegCCBound [i]) {
26222622 // Target must guarantee the Value `Tmp` here is lowered to a boolean
26232623 // value.
2624- // Lowering 'Tmp' as - 'icmp ult %Tmp , CCUpperBound'. On some targets
2625- // CCUpperBound is not binary. CCUpperBound is 4 for SystemZ,
2626- // interval [0, 4). With this range known, llvm.assume intrinsic guides
2627- // optimizer to generate more optimized IR in most of the cases as
2628- // observed for select_cc on SystemZ unit tests for flag output operands.
2629- // For some cases for br_cc, generated IR was weird. e.g. switch table
2630- // for simple simple comparison terms for br_cc.
2631- unsigned CCUpperBound = ResultRegIsFlagReg[i];
2624+ // Lowering 'Tmp' as - 'icmp ult %Tmp , CCUpperBound'.
2625+ unsigned CCUpperBound = ResultFlagRegCCBound[i];
2626+ assert ((CCUpperBound == 2 || CCUpperBound == 4 ) &&
2627+ " CC upper bound out of range!" );
26322628 llvm::Constant *CCUpperBoundConst =
26332629 llvm::ConstantInt::get (Tmp->getType (), CCUpperBound);
26342630 llvm::Value *IsBooleanValue =
@@ -2759,7 +2755,7 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
27592755 std::vector<llvm::Type *> ArgElemTypes;
27602756 std::vector<llvm::Value*> Args;
27612757 llvm::BitVector ResultTypeRequiresCast;
2762- std::vector<unsigned > ResultRegIsFlagReg ;
2758+ std::vector<unsigned > ResultFlagRegCCBound ;
27632759
27642760 // Keep track of inout constraints.
27652761 std::string InOutConstraints;
@@ -2817,7 +2813,7 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
28172813 ResultRegQualTys.push_back (QTy);
28182814 ResultRegDests.push_back (Dest);
28192815
2820- ResultRegIsFlagReg .push_back (Info.getFlagOutputCCUpperBound ());
2816+ ResultFlagRegCCBound .push_back (Info.getFlagOutputCCUpperBound ());
28212817
28222818 llvm::Type *Ty = ConvertTypeForMem (QTy);
28232819 const bool RequiresCast = Info.allowsRegister () &&
@@ -3164,7 +3160,7 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
31643160
31653161 EmitAsmStores (*this , S, RegResults, ResultRegTypes, ResultTruncRegTypes,
31663162 ResultRegDests, ResultRegQualTys, ResultTypeRequiresCast,
3167- ResultRegIsFlagReg );
3163+ ResultFlagRegCCBound );
31683164
31693165 // If this is an asm goto with outputs, repeat EmitAsmStores, but with a
31703166 // different insertion point; one for each indirect destination and with
@@ -3175,7 +3171,7 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
31753171 Builder.SetInsertPoint (Succ, --(Succ->end ()));
31763172 EmitAsmStores (*this , S, CBRRegResults[Succ], ResultRegTypes,
31773173 ResultTruncRegTypes, ResultRegDests, ResultRegQualTys,
3178- ResultTypeRequiresCast, ResultRegIsFlagReg );
3174+ ResultTypeRequiresCast, ResultFlagRegCCBound );
31793175 }
31803176 }
31813177}
0 commit comments