Add some helper methods that will be used in my next patch.
llvm-svn: 126596
This commit is contained in:
parent
80d51eb03a
commit
29911cc2f5
|
@ -387,6 +387,9 @@ bool CodeGenFunction::ContainsLabel(const Stmt *S, bool IgnoreCaseStmts) {
|
|||
|
||||
// If this is a label, we have to emit the code, consider something like:
|
||||
// if (0) { ... foo: bar(); } goto foo;
|
||||
//
|
||||
// TODO: If anyone cared, we could track __label__'s, since we know that you
|
||||
// can't jump to one from outside their declared region.
|
||||
if (isa<LabelStmt>(S))
|
||||
return true;
|
||||
|
||||
|
@ -407,12 +410,46 @@ bool CodeGenFunction::ContainsLabel(const Stmt *S, bool IgnoreCaseStmts) {
|
|||
return false;
|
||||
}
|
||||
|
||||
/// containsBreak - Return true if the statement contains a break out of it.
|
||||
/// If the statement (recursively) contains a switch or loop with a break
|
||||
/// inside of it, this is fine.
|
||||
bool CodeGenFunction::containsBreak(const Stmt *S) {
|
||||
// Null statement, not a label!
|
||||
if (S == 0) return false;
|
||||
|
||||
// If this is a switch or loop that defines its own break scope, then we can
|
||||
// include it and anything inside of it.
|
||||
if (isa<SwitchStmt>(S) || isa<WhileStmt>(S) || isa<DoStmt>(S) ||
|
||||
isa<ForStmt>(S))
|
||||
return true;
|
||||
|
||||
// Scan subexpressions for verboten breaks.
|
||||
for (Stmt::const_child_range I = S->children(); I; ++I)
|
||||
if (containsBreak(*I))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/// ConstantFoldsToSimpleInteger - If the specified expression does not fold
|
||||
/// to a constant, or if it does but contains a label, return false. If it
|
||||
/// constant folds return true and set the boolean result in Result.
|
||||
bool CodeGenFunction::ConstantFoldsToSimpleInteger(const Expr *Cond,
|
||||
bool &ResultBool) {
|
||||
llvm::APInt ResultInt;
|
||||
if (!ConstantFoldsToSimpleInteger(Cond, ResultInt))
|
||||
return false;
|
||||
|
||||
ResultBool = ResultInt.getBoolValue();
|
||||
return true;
|
||||
}
|
||||
|
||||
/// ConstantFoldsToSimpleInteger - If the specified expression does not fold
|
||||
/// to a constant, or if it does but contains a label, return false. If it
|
||||
/// constant folds return true and set the folded value.
|
||||
bool CodeGenFunction::
|
||||
ConstantFoldsToSimpleInteger(const Expr *Cond, llvm::APInt &ResultInt) {
|
||||
// FIXME: Rename and handle conversion of other evaluatable things
|
||||
// to bool.
|
||||
Expr::EvalResult Result;
|
||||
|
@ -423,11 +460,12 @@ bool CodeGenFunction::ConstantFoldsToSimpleInteger(const Expr *Cond,
|
|||
if (CodeGenFunction::ContainsLabel(Cond))
|
||||
return false; // Contains a label.
|
||||
|
||||
ResultBool = Result.Val.getInt().getBoolValue();
|
||||
ResultInt = Result.Val.getInt();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// EmitBranchOnBoolExpr - Emit a branch on a boolean condition (e.g. for an if
|
||||
/// statement) to the specified blocks. Based on the condition, this might try
|
||||
/// to simplify the codegen of the conditional based on the branch.
|
||||
|
|
|
@ -2044,11 +2044,21 @@ public:
|
|||
/// that we can just remove the code.
|
||||
static bool ContainsLabel(const Stmt *S, bool IgnoreCaseStmts = false);
|
||||
|
||||
/// containsBreak - Return true if the statement contains a break out of it.
|
||||
/// If the statement (recursively) contains a switch or loop with a break
|
||||
/// inside of it, this is fine.
|
||||
static bool containsBreak(const Stmt *S);
|
||||
|
||||
/// ConstantFoldsToSimpleInteger - If the specified expression does not fold
|
||||
/// to a constant, or if it does but contains a label, return false. If it
|
||||
/// constant folds return true and set the boolean result in Result.
|
||||
bool ConstantFoldsToSimpleInteger(const Expr *Cond, bool &Result);
|
||||
|
||||
/// ConstantFoldsToSimpleInteger - If the specified expression does not fold
|
||||
/// to a constant, or if it does but contains a label, return false. If it
|
||||
/// constant folds return true and set the folded value.
|
||||
bool ConstantFoldsToSimpleInteger(const Expr *Cond, llvm::APInt &Result);
|
||||
|
||||
/// EmitBranchOnBoolExpr - Emit a branch on a boolean condition (e.g. for an
|
||||
/// if statement) to the specified blocks. Based on the condition, this might
|
||||
/// try to simplify the codegen of the conditional based on the branch.
|
||||
|
|
Loading…
Reference in New Issue