[PATCH] D109297: [ConstFold] Support opaque pointers in constexpr GEPs
Nikita Popov via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sun Sep 5 12:51:08 PDT 2021
nikic created this revision.
nikic added a reviewer: opaque-pointers.
Herald added subscribers: dexonsmith, hiraditya.
nikic requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
Support opaque pointers in SymbolicallyEvaluateGEP by using the value type of a GlobalValue base or falling back to i8 if there isn't one. We don't unconditionally generate i8 GEPs here because that would lose `inrange`, and because some optimizations on globals currently rely on GEP types (e.g. the globals SROA mentioned in the comment).
https://reviews.llvm.org/D109297
Files:
llvm/lib/Analysis/ConstantFolding.cpp
llvm/test/Transforms/InstCombine/force-opaque-ptr.ll
Index: llvm/test/Transforms/InstCombine/force-opaque-ptr.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/InstCombine/force-opaque-ptr.ll
@@ -0,0 +1,26 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -instcombine -force-opaque-pointers < %s | FileCheck %s
+
+ at g = global [16 x i16] zeroinitializer
+
+define ptr @gep_constexpr_gv_1() {
+; CHECK-LABEL: @gep_constexpr_gv_1(
+; CHECK-NEXT: ret ptr getelementptr inbounds ([16 x i16], ptr @g, i64 0, i64 10)
+;
+ ret ptr getelementptr([16 x i16], ptr @g, i64 0, i64 10)
+}
+
+define ptr @gep_constexpr_gv_2() {
+; CHECK-LABEL: @gep_constexpr_gv_2(
+; CHECK-NEXT: ret ptr getelementptr inbounds ([16 x i16], ptr @g, i64 0, i64 12)
+;
+ ret ptr getelementptr(i32, ptr getelementptr([16 x i16], ptr @g, i64 0, i64 10), i64 1)
+}
+
+; Silly expression to get an inttoptr that does not combine with the GEP.
+define ptr @gep_constexpr_inttoptr() {
+; CHECK-LABEL: @gep_constexpr_inttoptr(
+; CHECK-NEXT: ret ptr getelementptr (i8, ptr inttoptr (i64 mul (i64 ptrtoint (ptr @g to i64), i64 2) to ptr), i64 20)
+;
+ ret ptr getelementptr([16 x i16], ptr inttoptr (i64 mul (i64 ptrtoint ([16 x i16]* @g to i64), i64 2) to ptr), i64 0, i64 10)
+}
Index: llvm/lib/Analysis/ConstantFolding.cpp
===================================================================
--- llvm/lib/Analysis/ConstantFolding.cpp
+++ llvm/lib/Analysis/ConstantFolding.cpp
@@ -987,7 +987,15 @@
// Also, this helps GlobalOpt do SROA on GlobalVariables.
SmallVector<Constant *, 32> NewIdxs;
Type *Ty = PTy;
- SrcElemTy = PTy->getElementType();
+
+ // For GEPs of GlobalValues, use the value type even for opaque pointers.
+ // Otherwise use an i8 GEP.
+ if (auto *GV = dyn_cast<GlobalValue>(Ptr))
+ SrcElemTy = GV->getValueType();
+ else if (!PTy->isOpaque())
+ SrcElemTy = PTy->getElementType();
+ else
+ SrcElemTy = Type::getInt8Ty(Ptr->getContext());
do {
if (!Ty->isStructTy()) {
@@ -1067,7 +1075,7 @@
// Create a GEP.
Constant *C = ConstantExpr::getGetElementPtr(SrcElemTy, Ptr, NewIdxs,
InBounds, InRangeIndex);
- assert(C->getType()->getPointerElementType() == Ty &&
+ assert(cast<PointerType>(C->getType())->isOpaqueOrPointeeTypeMatches(Ty) &&
"Computed GetElementPtr has unexpected type!");
// If we ended up indexing a member with a type that doesn't match
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D109297.370821.patch
Type: text/x-patch
Size: 2496 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210905/c679c323/attachment.bin>
More information about the llvm-commits
mailing list