@@ -2193,46 +2193,45 @@ static Constant *ConstantFoldGetElementPtrImpl(Type *PointeeTy, Constant *C,
2193
2193
for (unsigned i = 1 , e = Idxs.size (); i != e;
2194
2194
Prev = Ty, Ty = cast<CompositeType>(Ty)->getTypeAtIndex (Idxs[i]), ++i) {
2195
2195
if (ConstantInt *CI = dyn_cast<ConstantInt>(Idxs[i])) {
2196
- if (isa<ArrayType>(Ty))
2197
- if (CI->getSExtValue () > 0 &&
2198
- !isIndexInRangeOfSequentialType (cast<SequentialType>(Ty), CI)) {
2199
- if (isa<SequentialType>(Prev)) {
2200
- // It's out of range, but we can factor it into the prior
2201
- // dimension.
2202
- NewIdxs.resize (Idxs.size ());
2203
- uint64_t NumElements = 0 ;
2204
- if (auto *ATy = dyn_cast<ArrayType>(Ty))
2205
- NumElements = ATy->getNumElements ();
2206
- else
2207
- NumElements = cast<VectorType>(Ty)->getNumElements ();
2208
-
2209
- ConstantInt *Factor = ConstantInt::get (CI->getType (), NumElements);
2210
- NewIdxs[i] = ConstantExpr::getSRem (CI, Factor);
2211
-
2212
- Constant *PrevIdx = cast<Constant>(Idxs[i-1 ]);
2213
- Constant *Div = ConstantExpr::getSDiv (CI, Factor);
2214
-
2215
- unsigned CommonExtendedWidth =
2216
- std::max (PrevIdx->getType ()->getIntegerBitWidth (),
2217
- Div->getType ()->getIntegerBitWidth ());
2218
- CommonExtendedWidth = std::max (CommonExtendedWidth, 64U );
2219
-
2220
- // Before adding, extend both operands to i64 to avoid
2221
- // overflow trouble.
2222
- if (!PrevIdx->getType ()->isIntegerTy (CommonExtendedWidth))
2223
- PrevIdx = ConstantExpr::getSExt (
2224
- PrevIdx,
2225
- Type::getIntNTy (Div->getContext (), CommonExtendedWidth));
2226
- if (!Div->getType ()->isIntegerTy (CommonExtendedWidth))
2227
- Div = ConstantExpr::getSExt (
2228
- Div, Type::getIntNTy (Div->getContext (), CommonExtendedWidth));
2229
-
2230
- NewIdxs[i-1 ] = ConstantExpr::getAdd (PrevIdx, Div);
2231
- } else {
2232
- // It's out of range, but the prior dimension is a struct
2233
- // so we can't do anything about it.
2234
- Unknown = true ;
2235
- }
2196
+ if (isa<ArrayType>(Ty) && CI->getSExtValue () > 0 &&
2197
+ !isIndexInRangeOfSequentialType (cast<ArrayType>(Ty), CI)) {
2198
+ if (isa<SequentialType>(Prev)) {
2199
+ // It's out of range, but we can factor it into the prior
2200
+ // dimension.
2201
+ NewIdxs.resize (Idxs.size ());
2202
+ uint64_t NumElements = 0 ;
2203
+ if (auto *ATy = dyn_cast<ArrayType>(Ty))
2204
+ NumElements = ATy->getNumElements ();
2205
+ else
2206
+ NumElements = cast<VectorType>(Ty)->getNumElements ();
2207
+
2208
+ ConstantInt *Factor = ConstantInt::get (CI->getType (), NumElements);
2209
+ NewIdxs[i] = ConstantExpr::getSRem (CI, Factor);
2210
+
2211
+ Constant *PrevIdx = cast<Constant>(Idxs[i - 1 ]);
2212
+ Constant *Div = ConstantExpr::getSDiv (CI, Factor);
2213
+
2214
+ unsigned CommonExtendedWidth =
2215
+ std::max (PrevIdx->getType ()->getIntegerBitWidth (),
2216
+ Div->getType ()->getIntegerBitWidth ());
2217
+ CommonExtendedWidth = std::max (CommonExtendedWidth, 64U );
2218
+
2219
+ // Before adding, extend both operands to i64 to avoid
2220
+ // overflow trouble.
2221
+ if (!PrevIdx->getType ()->isIntegerTy (CommonExtendedWidth))
2222
+ PrevIdx = ConstantExpr::getSExt (
2223
+ PrevIdx,
2224
+ Type::getIntNTy (Div->getContext (), CommonExtendedWidth));
2225
+ if (!Div->getType ()->isIntegerTy (CommonExtendedWidth))
2226
+ Div = ConstantExpr::getSExt (
2227
+ Div, Type::getIntNTy (Div->getContext (), CommonExtendedWidth));
2228
+
2229
+ NewIdxs[i - 1 ] = ConstantExpr::getAdd (PrevIdx, Div);
2230
+ } else {
2231
+ // It's out of range, but the prior dimension is a struct
2232
+ // so we can't do anything about it.
2233
+ Unknown = true ;
2234
+ }
2236
2235
}
2237
2236
} else {
2238
2237
// We don't know if it's in range or not.
0 commit comments