@@ -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+
10751090llvm::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
11981206llvm::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