Skip to content

Commit 06cd8a7

Browse files
committed
[Clang][CodeGen] Use createConstGEP2_32
1 parent 9189eaa commit 06cd8a7

File tree

4 files changed

+29
-26
lines changed

4 files changed

+29
-26
lines changed

clang/lib/CodeGen/CGBuilder.h

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -64,21 +64,27 @@ class CGBuilderTy : public CGBuilderBaseTy {
6464
Address createConstGEP2_32(Address Addr, unsigned Idx0, unsigned Idx1,
6565
const llvm::Twine &Name) {
6666
const llvm::DataLayout &DL = BB->getDataLayout();
67-
llvm::GetElementPtrInst *GEP;
67+
llvm::Value *V;
6868
if (IsInBounds)
69-
GEP = cast<llvm::GetElementPtrInst>(CreateConstInBoundsGEP2_32(
70-
Addr.getElementType(), emitRawPointerFromAddress(Addr), Idx0, Idx1,
71-
Name));
69+
V = CreateConstInBoundsGEP2_32(Addr.getElementType(),
70+
emitRawPointerFromAddress(Addr), Idx0,
71+
Idx1, Name);
7272
else
73-
GEP = cast<llvm::GetElementPtrInst>(CreateConstGEP2_32(
74-
Addr.getElementType(), emitRawPointerFromAddress(Addr), Idx0, Idx1,
75-
Name));
73+
V = CreateConstGEP2_32(Addr.getElementType(),
74+
emitRawPointerFromAddress(Addr), Idx0, Idx1, Name);
7675
llvm::APInt Offset(
7776
DL.getIndexSizeInBits(Addr.getType()->getPointerAddressSpace()), 0,
7877
/*isSigned=*/true);
79-
if (!GEP->accumulateConstantOffset(DL, Offset))
80-
llvm_unreachable("offset of GEP with constants is always computable");
81-
return Address(GEP, GEP->getResultElementType(),
78+
llvm::Type *ElementTy = nullptr;
79+
if (auto *GEP = dyn_cast<llvm::GEPOperator>(V)) {
80+
if (!GEP->accumulateConstantOffset(DL, Offset))
81+
llvm_unreachable("offset of GEP with constants is always computable");
82+
ElementTy = GEP->getResultElementType();
83+
} else {
84+
ElementTy = llvm::GetElementPtrInst::getIndexedType(Addr.getElementType(),
85+
{Idx0, Idx1});
86+
}
87+
return Address(V, ElementTy,
8288
Addr.getAlignment().alignmentAtOffset(
8389
CharUnits::fromQuantity(Offset.getSExtValue())),
8490
IsInBounds ? Addr.isKnownNonNull() : NotKnownNonNull);
@@ -219,21 +225,17 @@ class CGBuilderTy : public CGBuilderBaseTy {
219225
/// true.
220226
using CGBuilderBaseTy::CreateStructGEP;
221227
Address CreateStructGEP(Address Addr, unsigned Index,
222-
const llvm::Twine &Name = "",
223-
bool IsBaseConstantNull = false) {
228+
const llvm::Twine &Name = "") {
224229
llvm::StructType *ElTy = cast<llvm::StructType>(Addr.getElementType());
225230
const llvm::DataLayout &DL = BB->getDataLayout();
226231
const llvm::StructLayout *Layout = DL.getStructLayout(ElTy);
227232
auto Offset = CharUnits::fromQuantity(Layout->getElementOffset(Index));
228233

229-
llvm::GEPNoWrapFlags NWFlags = llvm::GEPNoWrapFlags::noUnsignedWrap();
230-
if (!IsBaseConstantNull)
231-
NWFlags |= llvm::GEPNoWrapFlags::inBounds();
232-
return Address(
233-
CreateConstGEP2_32(Addr.getElementType(), Addr.getBasePointer(), 0,
234-
Index, Name, NWFlags),
235-
ElTy->getElementType(Index),
236-
Addr.getAlignment().alignmentAtOffset(Offset), Addr.isKnownNonNull());
234+
return Address(CreateStructGEP(Addr.getElementType(), Addr.getBasePointer(),
235+
Index, Name),
236+
ElTy->getElementType(Index),
237+
Addr.getAlignment().alignmentAtOffset(Offset),
238+
Addr.isKnownNonNull());
237239
}
238240

239241
/// Given

clang/lib/CodeGen/CGExpr.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4919,8 +4919,9 @@ static Address emitAddrOfFieldStorage(CodeGenFunction &CGF, Address base,
49194919
unsigned idx =
49204920
CGF.CGM.getTypes().getCGRecordLayout(rec).getLLVMFieldNo(field);
49214921

4922-
return CGF.Builder.CreateStructGEP(base, idx, field->getName(),
4923-
IsBaseConstantNull);
4922+
if (IsBaseConstantNull)
4923+
return CGF.Builder.CreateConstGEP2_32(base, 0, idx, field->getName());
4924+
return CGF.Builder.CreateStructGEP(base, idx, field->getName());
49244925
}
49254926

49264927
static Address emitPreserveStructAccess(CodeGenFunction &CGF, LValue base,

clang/test/CodeGen/catch-nullptr-and-nonzero-offset-in-offsetof-idiom.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ struct S {
1717

1818
// CHECK-LABEL: @get_offset_of_y_naively(
1919
// CHECK-NEXT: entry:
20-
// CHECK-NEXT: ret i64 ptrtoint (ptr getelementptr nuw ([[STRUCT_S:%.*]], ptr null, i32 0, i32 1) to i64)
20+
// CHECK-NEXT: ret i64 ptrtoint (ptr getelementptr ([[STRUCT_S:%.*]], ptr null, i32 0, i32 1) to i64)
2121
//
2222
uintptr_t get_offset_of_y_naively(void) {
2323
return ((uintptr_t)(&(((struct S *)0)->y)));

clang/test/CodeGenCXX/catch-nullptr-and-nonzero-offset-in-offsetof-idiom.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ struct S {
1010

1111
// CHECK-LABEL: @_Z23get_offset_of_y_naivelyv(
1212
// CHECK-NEXT: entry:
13-
// CHECK-NEXT: ret i64 ptrtoint (ptr getelementptr nuw ([[STRUCT_S:%.*]], ptr null, i32 0, i32 1) to i64)
13+
// CHECK-NEXT: ret i64 ptrtoint (ptr getelementptr ([[STRUCT_S:%.*]], ptr null, i32 0, i32 1) to i64)
1414
//
1515
uintptr_t get_offset_of_y_naively() {
1616
return ((uintptr_t)(&(((S *)nullptr)->y)));
@@ -28,15 +28,15 @@ struct T {
2828

2929
// CHECK-LABEL: @_Z30get_offset_of_y_naively_nestedv(
3030
// CHECK-NEXT: entry:
31-
// CHECK-NEXT: ret i64 ptrtoint (ptr getelementptr nuw ([[STRUCT_S:%.*]], ptr getelementptr nuw ([[STRUCT_T:%.*]], ptr null, i32 0, i32 1), i32 0, i32 1) to i64)
31+
// CHECK-NEXT: ret i64 ptrtoint (ptr getelementptr ([[STRUCT_S:%.*]], ptr getelementptr ([[STRUCT_T:%.*]], ptr null, i32 0, i32 1), i32 0, i32 1) to i64)
3232
//
3333
uintptr_t get_offset_of_y_naively_nested() {
3434
return ((uintptr_t)(&(((T *)nullptr)->s.y)));
3535
}
3636

3737
// CHECK-LABEL: @_Z42get_offset_of_y_naively_nested_with_parensv(
3838
// CHECK-NEXT: entry:
39-
// CHECK-NEXT: ret i64 ptrtoint (ptr getelementptr nuw ([[STRUCT_S:%.*]], ptr getelementptr nuw ([[STRUCT_T:%.*]], ptr null, i32 0, i32 1), i32 0, i32 1) to i64)
39+
// CHECK-NEXT: ret i64 ptrtoint (ptr getelementptr ([[STRUCT_S:%.*]], ptr getelementptr ([[STRUCT_T:%.*]], ptr null, i32 0, i32 1), i32 0, i32 1) to i64)
4040
//
4141
uintptr_t get_offset_of_y_naively_nested_with_parens() {
4242
return ((uintptr_t)(&((((T *)nullptr)->s).y)));

0 commit comments

Comments
 (0)