Skip to content

Commit e2f03da

Browse files
author
anoopkg6
committed
Making flag output operand infrastructure more generic as output operand.
1 parent 69f8f25 commit e2f03da

File tree

2 files changed

+17
-14
lines changed

2 files changed

+17
-14
lines changed

clang/include/clang/Basic/TargetInfo.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1216,7 +1216,10 @@ class TargetInfo : public TransferrableTargetInfo,
12161216
void setOutputOperandBounds(unsigned Min, unsigned Max) {
12171217
setRequiresImmediate(Min, Max);
12181218
}
1219-
unsigned getFlagOutputCCUpperBound() const { return ImmRange.Max; }
1219+
std::pair<unsigned, unsigned> getOutputOperandBounds() const {
1220+
return ImmRange.isConstrained ? std::make_pair(ImmRange.Min, ImmRange.Max)
1221+
: std::make_pair(0, 0);
1222+
}
12201223
};
12211224

12221225
/// Validate register name used for global register variables.

clang/lib/CodeGen/CGStmt.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)