Skip to content

Commit 27b2ad9

Browse files
committed
Peel out "return positive or zero" into its own function.
1 parent 79acdf9 commit 27b2ad9

File tree

1 file changed

+17
-20
lines changed

1 file changed

+17
-20
lines changed

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1072,6 +1072,21 @@ llvm::Value *CodeGenFunction::emitCountedBySize(const Expr *E,
10721072
return nullptr;
10731073
}
10741074

1075+
static llvm::Value *EmitPositiveResultOrZero(CodeGenFunction &CGF,
1076+
llvm::Value *Res,
1077+
llvm::Value *Index,
1078+
llvm::IntegerType *ResType,
1079+
bool IsSigned) {
1080+
// cmp = (array_size >= 0)
1081+
Value *Cmp = CGF.Builder.CreateIsNotNeg(Res);
1082+
if (Index)
1083+
// cmp = (cmp && index >= 0)
1084+
Cmp = CGF.Builder.CreateAnd(CGF.Builder.CreateIsNotNeg(Index), Cmp);
1085+
1086+
// return cmp ? result : 0
1087+
return CGF.Builder.CreateSelect(Cmp, Res, ConstantInt::get(ResType, 0, IsSigned));
1088+
}
1089+
10751090
llvm::Value *CodeGenFunction::emitCountedByPointerSize(
10761091
const ImplicitCastExpr *E, const Expr *Idx, llvm::Value *EmittedE,
10771092
unsigned Type, llvm::IntegerType *ResType) {
@@ -1185,14 +1200,7 @@ llvm::Value *CodeGenFunction::emitCountedByPointerSize(
11851200
Res = Builder.CreateSub(Res, IndexSize, "result", !IsSigned, IsSigned);
11861201
}
11871202

1188-
// cmp = (array_size >= 0)
1189-
Value *Cmp = Builder.CreateIsNotNeg(Res);
1190-
if (Idx)
1191-
// cmp = (cmp && index >= 0)
1192-
Cmp = Builder.CreateAnd(Builder.CreateIsNotNeg(Index), Cmp);
1193-
1194-
// return cmp ? result : 0
1195-
return Builder.CreateSelect(Cmp, Res, ConstantInt::get(ResType, 0, IsSigned));
1203+
return EmitPositiveResultOrZero(*this, Res, Index, ResType, IsSigned);
11961204
}
11971205

11981206
llvm::Value *
@@ -1247,7 +1255,6 @@ CodeGenFunction::emitCountedByMemberSize(const MemberExpr *ME, const Expr *Idx,
12471255
// result = flexible_array_member_size;
12481256
//
12491257
// cmp = (result >= 0)
1250-
//
12511258
// return cmp ? result : 0;
12521259
//
12531260
// 2) '&ptr->array[idx]':
@@ -1266,7 +1273,6 @@ CodeGenFunction::emitCountedByMemberSize(const MemberExpr *ME, const Expr *Idx,
12661273
// cmp = (result >= 0)
12671274
// if (index != 0)
12681275
// cmp = (cmp && index >= 0)
1269-
//
12701276
// return cmp ? result : 0;
12711277
//
12721278
// 3) '&ptr->field':
@@ -1284,7 +1290,6 @@ CodeGenFunction::emitCountedByMemberSize(const MemberExpr *ME, const Expr *Idx,
12841290
// result = offset_diff + flexible_array_member_size;
12851291
//
12861292
// cmp = (result >= 0)
1287-
//
12881293
// return cmp ? result : 0;
12891294
//
12901295
// 4) '&ptr->field_array[idx]':
@@ -1308,7 +1313,6 @@ CodeGenFunction::emitCountedByMemberSize(const MemberExpr *ME, const Expr *Idx,
13081313
// cmp = (result >= 0)
13091314
// if (index != 0)
13101315
// cmp = (cmp && index >= 0)
1311-
//
13121316
// return cmp ? result : 0;
13131317

13141318
bool IsSigned = CountFD->getType()->isSignedIntegerType();
@@ -1400,14 +1404,7 @@ CodeGenFunction::emitCountedByMemberSize(const MemberExpr *ME, const Expr *Idx,
14001404
Res = Builder.CreateAdd(FlexibleArrayMemberSize, OffsetDiff, "result");
14011405
}
14021406

1403-
// cmp = (array_size >= 0)
1404-
Value *Cmp = Builder.CreateIsNotNeg(Res);
1405-
if (Idx)
1406-
// cmp = (cmp && index >= 0)
1407-
Cmp = Builder.CreateAnd(Builder.CreateIsNotNeg(Index), Cmp);
1408-
1409-
// return cmp ? result : 0
1410-
return Builder.CreateSelect(Cmp, Res, ConstantInt::get(ResType, 0, IsSigned));
1407+
return EmitPositiveResultOrZero(*this, Res, Index, ResType, IsSigned);
14111408
}
14121409

14131410
/// Returns a Value corresponding to the size of the given expression.

0 commit comments

Comments
 (0)