|
|
@@ -2874,8 +2874,12 @@ Value *ScalarExprEmitter::VisitBinAssign(const BinaryOperator *E) { |
|
|
}
|
|
|
|
|
|
Value *ScalarExprEmitter::VisitBinLAnd(const BinaryOperator *E) {
|
|
|
RegionCounter Cnt = CGF.getPGORegionCounter(E);
|
|
|
|
|
|
// Perform vector logical and on comparisons with zero vectors.
|
|
|
if (E->getType()->isVectorType()) {
|
|
|
Cnt.beginRegion(Builder);
|
|
|
|
|
|
Value *LHS = Visit(E->getLHS());
|
|
|
Value *RHS = Visit(E->getRHS());
|
|
|
Value *Zero = llvm::ConstantAggregateZero::get(LHS->getType());
|
|
|
@@ -2897,6 +2901,8 @@ Value *ScalarExprEmitter::VisitBinLAnd(const BinaryOperator *E) { |
|
|
bool LHSCondVal;
|
|
|
if (CGF.ConstantFoldsToSimpleInteger(E->getLHS(), LHSCondVal)) {
|
|
|
if (LHSCondVal) { // If we have 1 && X, just emit X.
|
|
|
Cnt.beginRegion(Builder);
|
|
|
|
|
|
Value *RHSCond = CGF.EvaluateExprAsBool(E->getRHS());
|
|
|
// ZExt result to int or bool.
|
|
|
return Builder.CreateZExtOrBitCast(RHSCond, ResTy, "land.ext");
|
|
|
@@ -2913,7 +2919,7 @@ Value *ScalarExprEmitter::VisitBinLAnd(const BinaryOperator *E) { |
|
|
CodeGenFunction::ConditionalEvaluation eval(CGF);
|
|
|
|
|
|
// Branch on the LHS first. If it is false, go to the failure (cont) block.
|
|
|
CGF.EmitBranchOnBoolExpr(E->getLHS(), RHSBlock, ContBlock);
|
|
|
CGF.EmitBranchOnBoolExpr(E->getLHS(), RHSBlock, ContBlock, Cnt.getCount());
|
|
|
|
|
|
// Any edges into the ContBlock are now from an (indeterminate number of)
|
|
|
// edges from this first condition. All of these values will be false. Start
|
|
|
@@ -2926,7 +2932,9 @@ Value *ScalarExprEmitter::VisitBinLAnd(const BinaryOperator *E) { |
|
|
|
|
|
eval.begin(CGF);
|
|
|
CGF.EmitBlock(RHSBlock);
|
|
|
Cnt.beginRegion(Builder);
|
|
|
Value *RHSCond = CGF.EvaluateExprAsBool(E->getRHS());
|
|
|
Cnt.adjustFallThroughCount();
|
|
|
eval.end(CGF);
|
|
|
|
|
|
// Reaquire the RHS block, as there may be subblocks inserted.
|
|
|
@@ -2939,14 +2947,19 @@ Value *ScalarExprEmitter::VisitBinLAnd(const BinaryOperator *E) { |
|
|
Builder.SetCurrentDebugLocation(llvm::DebugLoc());
|
|
|
CGF.EmitBlock(ContBlock);
|
|
|
PN->addIncoming(RHSCond, RHSBlock);
|
|
|
Cnt.applyAdjustmentsToRegion();
|
|
|
|
|
|
// ZExt result to int.
|
|
|
return Builder.CreateZExtOrBitCast(PN, ResTy, "land.ext");
|
|
|
}
|
|
|
|
|
|
Value *ScalarExprEmitter::VisitBinLOr(const BinaryOperator *E) {
|
|
|
RegionCounter Cnt = CGF.getPGORegionCounter(E);
|
|
|
|
|
|
// Perform vector logical or on comparisons with zero vectors.
|
|
|
if (E->getType()->isVectorType()) {
|
|
|
Cnt.beginRegion(Builder);
|
|
|
|
|
|
Value *LHS = Visit(E->getLHS());
|
|
|
Value *RHS = Visit(E->getRHS());
|
|
|
Value *Zero = llvm::ConstantAggregateZero::get(LHS->getType());
|
|
|
@@ -2968,6 +2981,8 @@ Value *ScalarExprEmitter::VisitBinLOr(const BinaryOperator *E) { |
|
|
bool LHSCondVal;
|
|
|
if (CGF.ConstantFoldsToSimpleInteger(E->getLHS(), LHSCondVal)) {
|
|
|
if (!LHSCondVal) { // If we have 0 || X, just emit X.
|
|
|
Cnt.beginRegion(Builder);
|
|
|
|
|
|
Value *RHSCond = CGF.EvaluateExprAsBool(E->getRHS());
|
|
|
// ZExt result to int or bool.
|
|
|
return Builder.CreateZExtOrBitCast(RHSCond, ResTy, "lor.ext");
|
|
|
@@ -2984,7 +2999,8 @@ Value *ScalarExprEmitter::VisitBinLOr(const BinaryOperator *E) { |
|
|
CodeGenFunction::ConditionalEvaluation eval(CGF);
|
|
|
|
|
|
// Branch on the LHS first. If it is true, go to the success (cont) block.
|
|
|
CGF.EmitBranchOnBoolExpr(E->getLHS(), ContBlock, RHSBlock);
|
|
|
CGF.EmitBranchOnBoolExpr(E->getLHS(), ContBlock, RHSBlock,
|
|
|
Cnt.getParentCount() - Cnt.getCount());
|
|
|
|
|
|
// Any edges into the ContBlock are now from an (indeterminate number of)
|
|
|
// edges from this first condition. All of these values will be true. Start
|
|
|
@@ -2999,7 +3015,9 @@ Value *ScalarExprEmitter::VisitBinLOr(const BinaryOperator *E) { |
|
|
|
|
|
// Emit the RHS condition as a bool value.
|
|
|
CGF.EmitBlock(RHSBlock);
|
|
|
Cnt.beginRegion(Builder);
|
|
|
Value *RHSCond = CGF.EvaluateExprAsBool(E->getRHS());
|
|
|
Cnt.adjustFallThroughCount();
|
|
|
|
|
|
eval.end(CGF);
|
|
|
|
|
|
@@ -3010,6 +3028,7 @@ Value *ScalarExprEmitter::VisitBinLOr(const BinaryOperator *E) { |
|
|
// into the phi node for the edge with the value of RHSCond.
|
|
|
CGF.EmitBlock(ContBlock);
|
|
|
PN->addIncoming(RHSCond, RHSBlock);
|
|
|
Cnt.applyAdjustmentsToRegion();
|
|
|
|
|
|
// ZExt result to int.
|
|
|
return Builder.CreateZExtOrBitCast(PN, ResTy, "lor.ext");
|
|
|
@@ -3049,6 +3068,7 @@ VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) { |
|
|
|
|
|
// Bind the common expression if necessary.
|
|
|
CodeGenFunction::OpaqueValueMapping binding(CGF, E);
|
|
|
RegionCounter Cnt = CGF.getPGORegionCounter(E);
|
|
|
|
|
|
Expr *condExpr = E->getCond();
|
|
|
Expr *lhsExpr = E->getTrueExpr();
|
|
|
@@ -3063,6 +3083,8 @@ VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) { |
|
|
|
|
|
// If the dead side doesn't have labels we need, just emit the Live part.
|
|
|
if (!CGF.ContainsLabel(dead)) {
|
|
|
if (CondExprBool)
|
|
|
Cnt.beginRegion(Builder);
|
|
|
Value *Result = Visit(live);
|
|
|
|
|
|
// If the live part is a throw expression, it acts like it has a void
|
|
|
@@ -3079,6 +3101,8 @@ VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) { |
|
|
// the select function.
|
|
|
if (CGF.getLangOpts().OpenCL
|
|
|
&& condExpr->getType()->isVectorType()) {
|
|
|
Cnt.beginRegion(Builder);
|
|
|
|
|
|
llvm::Value *CondV = CGF.EmitScalarExpr(condExpr);
|
|
|
llvm::Value *LHS = Visit(lhsExpr);
|
|
|
llvm::Value *RHS = Visit(rhsExpr);
|
|
|
@@ -3122,6 +3146,8 @@ VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) { |
|
|
// safe to evaluate the LHS and RHS unconditionally.
|
|
|
if (isCheapEnoughToEvaluateUnconditionally(lhsExpr, CGF) &&
|
|
|
isCheapEnoughToEvaluateUnconditionally(rhsExpr, CGF)) {
|
|
|
Cnt.beginRegion(Builder);
|
|
|
|
|
|
llvm::Value *CondV = CGF.EvaluateExprAsBool(condExpr);
|
|
|
llvm::Value *LHS = Visit(lhsExpr);
|
|
|
llvm::Value *RHS = Visit(rhsExpr);
|
|
|
@@ -3138,23 +3164,28 @@ VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) { |
|
|
llvm::BasicBlock *ContBlock = CGF.createBasicBlock("cond.end");
|
|
|
|
|
|
CodeGenFunction::ConditionalEvaluation eval(CGF);
|
|
|
CGF.EmitBranchOnBoolExpr(condExpr, LHSBlock, RHSBlock);
|
|
|
CGF.EmitBranchOnBoolExpr(condExpr, LHSBlock, RHSBlock, Cnt.getCount());
|
|
|
|
|
|
CGF.EmitBlock(LHSBlock);
|
|
|
Cnt.beginRegion(Builder);
|
|
|
eval.begin(CGF);
|
|
|
Value *LHS = Visit(lhsExpr);
|
|
|
eval.end(CGF);
|
|
|
Cnt.adjustFallThroughCount();
|
|
|
|
|
|
LHSBlock = Builder.GetInsertBlock();
|
|
|
Builder.CreateBr(ContBlock);
|
|
|
|
|
|
CGF.EmitBlock(RHSBlock);
|
|
|
Cnt.beginElseRegion();
|
|
|
eval.begin(CGF);
|
|
|
Value *RHS = Visit(rhsExpr);
|
|
|
eval.end(CGF);
|
|
|
Cnt.adjustFallThroughCount();
|
|
|
|
|
|
RHSBlock = Builder.GetInsertBlock();
|
|
|
CGF.EmitBlock(ContBlock);
|
|
|
Cnt.applyAdjustmentsToRegion();
|
|
|
|
|
|
// If the LHS or RHS is a throw expression, it will be legitimately null.
|
|
|
if (!LHS)
|
|
|
|
0 comments on commit
e0e019f