[llvm] [WPD] Use getGetElementPtr() overload accepting DataLayout (PR #225754)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 23 06:02:14 PDT 2026


https://github.com/nikic created https://github.com/llvm/llvm-project/pull/225754

To produce constant GEPs in canonical ptradd form.

>From f68daa0b4156d474aea6a3924e28b54d62fe9cd1 Mon Sep 17 00:00:00 2001
From: Nikita Popov <npopov at redhat.com>
Date: Wed, 23 Sep 2026 14:48:59 +0200
Subject: [PATCH] [WPD] Use getGetElementPtr() overload accepting DataLayout

To produce constant GEPs in canonical ptradd form.
---
 llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp   |  8 ++++----
 .../Transforms/WholeProgramDevirt/export-vcp.ll  | 12 ++++++------
 .../virtual-const-prop-begin.ll                  | 12 ++++++------
 .../virtual-const-prop-check.ll                  | 12 ++++++------
 .../WholeProgramDevirt/virtual-const-prop-end.ll |  8 ++++----
 .../virtual-const-prop-small-alignment-32.ll     | 16 ++++++++--------
 .../virtual-const-prop-small-alignment-64.ll     | 16 ++++++++--------
 7 files changed, 42 insertions(+), 42 deletions(-)

diff --git a/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp b/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp
index e9d2036e5fdbb7..8a35980003c27a 100644
--- a/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp
+++ b/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp
@@ -2061,10 +2061,10 @@ void DevirtModule::rebuildGlobal(VTableBits &B) {
   // element (the original initializer).
   auto *Alias = GlobalAlias::create(
       B.GV->getInitializer()->getType(), 0, B.GV->getLinkage(), "",
-      ConstantExpr::getInBoundsGetElementPtr(
-          NewInit->getType(), NewGV,
-          ArrayRef<Constant *>{ConstantInt::get(Int32Ty, 0),
-                               ConstantInt::get(Int32Ty, 1)}),
+      ConstantExpr::getGetElementPtr(
+          M.getDataLayout(), NewInit->getType(), NewGV,
+          {ConstantInt::get(Int32Ty, 0), ConstantInt::get(Int32Ty, 1)},
+          GEPNoWrapFlags::inBounds()),
       &M);
   Alias->setVisibility(B.GV->getVisibility());
   Alias->takeName(B.GV);
diff --git a/llvm/test/Transforms/WholeProgramDevirt/export-vcp.ll b/llvm/test/Transforms/WholeProgramDevirt/export-vcp.ll
index c38e5a06c0547a..5e3a48f03f0c57 100644
--- a/llvm/test/Transforms/WholeProgramDevirt/export-vcp.ll
+++ b/llvm/test/Transforms/WholeProgramDevirt/export-vcp.ll
@@ -70,12 +70,12 @@ target datalayout = "e-p:64:64"
 ; X86: @__typeid_typeid4_0_24_12_bit = hidden alias i8, inttoptr (i32 1 to ptr)
 ; ARM-NOT: alias {{.*}} inttoptr
 
-; CHECK: @vt3a = alias ptr, getelementptr inbounds ({ [8 x i8], ptr, [0 x i8] }, ptr [[CVT3A]], i32 0, i32 1)
-; CHECK: @vt3b = alias ptr, getelementptr inbounds ({ [8 x i8], ptr, [0 x i8] }, ptr [[CVT3B]], i32 0, i32 1)
-; CHECK: @vt3c = alias ptr, getelementptr inbounds ({ [8 x i8], ptr, [0 x i8] }, ptr [[CVT3C]], i32 0, i32 1)
-; CHECK: @vt3d = alias ptr, getelementptr inbounds ({ [8 x i8], ptr, [0 x i8] }, ptr [[CVT3D]], i32 0, i32 1)
-; CHECK: @vt4a = alias ptr, getelementptr inbounds ({ [8 x i8], ptr, [0 x i8] }, ptr [[CVT4A]], i32 0, i32 1)
-; CHECK: @vt4b = alias ptr, getelementptr inbounds ({ [8 x i8], ptr, [0 x i8] }, ptr [[CVT4B]], i32 0, i32 1)
+; CHECK: @vt3a = alias ptr, getelementptr inbounds (i8, ptr [[CVT3A]], i64 8)
+; CHECK: @vt3b = alias ptr, getelementptr inbounds (i8, ptr [[CVT3B]], i64 8)
+; CHECK: @vt3c = alias ptr, getelementptr inbounds (i8, ptr [[CVT3C]], i64 8)
+; CHECK: @vt3d = alias ptr, getelementptr inbounds (i8, ptr [[CVT3D]], i64 8)
+; CHECK: @vt4a = alias ptr, getelementptr inbounds (i8, ptr [[CVT4A]], i64 8)
+; CHECK: @vt4b = alias ptr, getelementptr inbounds (i8, ptr [[CVT4B]], i64 8)
 
 define i1 @vf0i1(ptr %this, i32, i32) readnone {
   ret i1 0
diff --git a/llvm/test/Transforms/WholeProgramDevirt/virtual-const-prop-begin.ll b/llvm/test/Transforms/WholeProgramDevirt/virtual-const-prop-begin.ll
index 2654b70b90e852..f38e8b5244fc2c 100644
--- a/llvm/test/Transforms/WholeProgramDevirt/virtual-const-prop-begin.ll
+++ b/llvm/test/Transforms/WholeProgramDevirt/virtual-const-prop-begin.ll
@@ -67,12 +67,12 @@ i32 trunc (i64 sub (i64 ptrtoint (ptr dso_local_equivalent @vf0i1 to i64), i64 p
 i32 trunc (i64 sub (i64 ptrtoint (ptr dso_local_equivalent @vf2i16 to i64), i64 ptrtoint (ptr @vt7_rel to i64)) to i32)
 ], !type !2
 
-; CHECK: @vt1 = alias [3 x ptr], getelementptr inbounds ({ [8 x i8], [3 x ptr], [0 x i8] }, ptr [[VT1DATA]], i32 0, i32 1)
-; CHECK: @vt2 = alias [3 x ptr], getelementptr inbounds ({ [8 x i8], [3 x ptr], [0 x i8] }, ptr [[VT2DATA]], i32 0, i32 1)
-; CHECK: @vt3 = alias [3 x ptr], getelementptr inbounds ({ [4 x i8], [3 x ptr], [0 x i8] }, ptr [[VT3DATA]], i32 0, i32 1)
-; CHECK: @vt4 = alias [3 x ptr], getelementptr inbounds ({ [16 x i8], [3 x ptr], [0 x i8] }, ptr [[VT4DATA]], i32 0, i32 1)
-; CHECK: @vt6_rel = alias [3 x i32], getelementptr inbounds ({ [4 x i8], [3 x i32], [0 x i8] }, ptr [[VT6RELDATA]], i32 0, i32 1)
-; CHECK: @vt7_rel = alias [3 x i32], getelementptr inbounds ({ [4 x i8], [3 x i32], [0 x i8] }, ptr [[VT7RELDATA]], i32 0, i32 1)
+; CHECK: @vt1 = alias [3 x ptr], getelementptr inbounds (i8, ptr [[VT1DATA]], i64 8)
+; CHECK: @vt2 = alias [3 x ptr], getelementptr inbounds (i8, ptr [[VT2DATA]], i64 8)
+; CHECK: @vt3 = alias [3 x ptr], getelementptr inbounds (i8, ptr [[VT3DATA]], i64 8)
+; CHECK: @vt4 = alias [3 x ptr], getelementptr inbounds (i8, ptr [[VT4DATA]], i64 16)
+; CHECK: @vt6_rel = alias [3 x i32], getelementptr inbounds (i8, ptr [[VT6RELDATA]], i64 4)
+; CHECK: @vt7_rel = alias [3 x i32], getelementptr inbounds (i8, ptr [[VT7RELDATA]], i64 4)
 
 define i1 @vf0i1(ptr %this) readnone {
   ret i1 0
diff --git a/llvm/test/Transforms/WholeProgramDevirt/virtual-const-prop-check.ll b/llvm/test/Transforms/WholeProgramDevirt/virtual-const-prop-check.ll
index 8327e1cfdf1d2b..df2ec4ab375844 100644
--- a/llvm/test/Transforms/WholeProgramDevirt/virtual-const-prop-check.ll
+++ b/llvm/test/Transforms/WholeProgramDevirt/virtual-const-prop-check.ll
@@ -98,12 +98,12 @@ i32 trunc (i64 sub (i64 ptrtoint (ptr dso_local_equivalent @vf0i1 to i64), i64 p
 i32 trunc (i64 sub (i64 ptrtoint (ptr dso_local_equivalent @vf4i32 to i64), i64 ptrtoint (ptr @vt7_rel to i64)) to i32)
 ], !type !1
 
-; CHECK: @vt1 = alias [3 x ptr], getelementptr inbounds ({ [8 x i8], [3 x ptr], [4 x i8] }, ptr [[VT1DATA]], i32 0, i32 1)
-; CHECK: @vt2 = alias [3 x ptr], getelementptr inbounds ({ [8 x i8], [3 x ptr], [4 x i8] }, ptr [[VT2DATA]], i32 0, i32 1)
-; CHECK: @vt3 = alias [3 x ptr], getelementptr inbounds ({ [8 x i8], [3 x ptr], [4 x i8] }, ptr [[VT3DATA]], i32 0, i32 1)
-; CHECK: @vt4 = alias [3 x ptr], getelementptr inbounds ({ [8 x i8], [3 x ptr], [4 x i8] }, ptr [[VT4DATA]], i32 0, i32 1)
-; CHECK: @vt6_rel = alias [3 x i32], getelementptr inbounds ({ [4 x i8], [3 x i32], [0 x i8] }, ptr [[VT6RELDATA]], i32 0, i32 1)
-; CHECK: @vt7_rel = alias [3 x i32], getelementptr inbounds ({ [4 x i8], [3 x i32], [0 x i8] }, ptr [[VT7RELDATA]], i32 0, i32 1)
+; CHECK: @vt1 = alias [3 x ptr], getelementptr inbounds (i8, ptr [[VT1DATA]], i64 8)
+; CHECK: @vt2 = alias [3 x ptr], getelementptr inbounds (i8, ptr [[VT2DATA]], i64 8)
+; CHECK: @vt3 = alias [3 x ptr], getelementptr inbounds (i8, ptr [[VT3DATA]], i64 8)
+; CHECK: @vt4 = alias [3 x ptr], getelementptr inbounds (i8, ptr [[VT4DATA]], i64 8)
+; CHECK: @vt6_rel = alias [3 x i32], getelementptr inbounds (i8, ptr [[VT6RELDATA]], i64 4)
+; CHECK: @vt7_rel = alias [3 x i32], getelementptr inbounds (i8, ptr [[VT7RELDATA]], i64 4)
 
 define i1 @vf0i1(ptr %this) readnone {
   ret i1 0
diff --git a/llvm/test/Transforms/WholeProgramDevirt/virtual-const-prop-end.ll b/llvm/test/Transforms/WholeProgramDevirt/virtual-const-prop-end.ll
index dd91ff6e6f3aab..4c39dee8147b77 100644
--- a/llvm/test/Transforms/WholeProgramDevirt/virtual-const-prop-end.ll
+++ b/llvm/test/Transforms/WholeProgramDevirt/virtual-const-prop-end.ll
@@ -57,10 +57,10 @@ i32 trunc (i64 sub (i64 ptrtoint (ptr dso_local_equivalent @vf1i1 to i64), i64 p
 i32 trunc (i64 sub (i64 ptrtoint (ptr dso_local_equivalent @vf4i32 to i64), i64 ptrtoint (ptr @vt6_rel to i64)) to i32)
 ], !type !2
 
-; CHECK: @vt1 = alias [4 x ptr], getelementptr inbounds ({ [0 x i8], [4 x ptr], [8 x i8] }, ptr [[VT1DATA]], i32 0, i32 1)
-; CHECK: @vt2 = alias [3 x ptr], getelementptr inbounds ({ [0 x i8], [3 x ptr], [8 x i8] }, ptr [[VT2DATA]], i32 0, i32 1)
-; CHECK: @vt3 = alias [4 x ptr], getelementptr inbounds ({ [0 x i8], [4 x ptr], [8 x i8] }, ptr [[VT3DATA]], i32 0, i32 1)
-; CHECK: @vt4 = alias [3 x ptr], getelementptr inbounds ({ [0 x i8], [3 x ptr], [8 x i8] }, ptr [[VT4DATA]], i32 0, i32 1)
+; CHECK: @vt1 = alias [4 x ptr], ptr [[VT1DATA]]
+; CHECK: @vt2 = alias [3 x ptr], ptr [[VT2DATA]]
+; CHECK: @vt3 = alias [4 x ptr], ptr [[VT3DATA]]
+; CHECK: @vt4 = alias [3 x ptr], ptr [[VT4DATA]]
 
 define i1 @vf0i1(ptr %this) readnone {
   ret i1 0
diff --git a/llvm/test/Transforms/WholeProgramDevirt/virtual-const-prop-small-alignment-32.ll b/llvm/test/Transforms/WholeProgramDevirt/virtual-const-prop-small-alignment-32.ll
index 314b1ee13a8007..3968e8c9cc5c9d 100644
--- a/llvm/test/Transforms/WholeProgramDevirt/virtual-const-prop-small-alignment-32.ll
+++ b/llvm/test/Transforms/WholeProgramDevirt/virtual-const-prop-small-alignment-32.ll
@@ -96,14 +96,14 @@ i32 trunc (i64 sub (i64 ptrtoint (ptr dso_local_equivalent @vf9i8 to i64), i64 p
 i32 trunc (i64 sub (i64 ptrtoint (ptr dso_local_equivalent @vf6i64 to i64), i64 ptrtoint (ptr @vt7_rel to i64)) to i32)
 ], !type !2
 
-; CHECK: @vt1 = alias [3 x ptr], getelementptr inbounds ({ [4 x i8], [3 x ptr], [0 x i8] }, ptr [[VT1DATA]], i32 0, i32 1)
-; CHECK: @vt2 = alias [3 x ptr], getelementptr inbounds ({ [4 x i8], [3 x ptr], [0 x i8] }, ptr [[VT2DATA]], i32 0, i32 1)
-; CHECK: @vt3 = alias [3 x ptr], getelementptr inbounds ({ [2 x i8], [3 x ptr], [0 x i8] }, ptr [[VT3DATA]], i32 0, i32 1)
-; CHECK: @vt4 = alias [3 x ptr], getelementptr inbounds ({ [16 x i8], [3 x ptr], [0 x i8] }, ptr [[VT4DATA]], i32 0, i32 1)
-; CHECK: @vt6 = alias [3 x ptr], getelementptr inbounds ({ [4 x i8], [3 x ptr], [0 x i8] }, ptr [[VT6DATA]], i32 0, i32 1)
-; CHECK: @vt7 = alias [3 x ptr], getelementptr inbounds ({ [4 x i8], [3 x ptr], [0 x i8] }, ptr [[VT7DATA]], i32 0, i32 1)
-; CHECK: @vt6_rel = alias [3 x i32], getelementptr inbounds ({ [4 x i8], [3 x i32], [0 x i8] }, ptr [[VT6RELDATA]], i32 0, i32 1)
-; CHECK: @vt7_rel = alias [3 x i32], getelementptr inbounds ({ [4 x i8], [3 x i32], [0 x i8] }, ptr [[VT7RELDATA]], i32 0, i32 1)
+; CHECK: @vt1 = alias [3 x ptr], getelementptr inbounds (i8, ptr [[VT1DATA]], i32 4)
+; CHECK: @vt2 = alias [3 x ptr], getelementptr inbounds (i8, ptr [[VT2DATA]], i32 4)
+; CHECK: @vt3 = alias [3 x ptr], getelementptr inbounds (i8, ptr [[VT3DATA]], i32 4)
+; CHECK: @vt4 = alias [3 x ptr], getelementptr inbounds (i8, ptr [[VT4DATA]], i32 16)
+; CHECK: @vt6 = alias [3 x ptr], getelementptr inbounds (i8, ptr [[VT6DATA]], i32 4)
+; CHECK: @vt7 = alias [3 x ptr], getelementptr inbounds (i8, ptr [[VT7DATA]], i32 4)
+; CHECK: @vt6_rel = alias [3 x i32], getelementptr inbounds (i8, ptr [[VT6RELDATA]], i32 4)
+; CHECK: @vt7_rel = alias [3 x i32], getelementptr inbounds (i8, ptr [[VT7RELDATA]], i32 4)
 
 define i1 @vf0i1(ptr %this) readnone {
   ret i1 0
diff --git a/llvm/test/Transforms/WholeProgramDevirt/virtual-const-prop-small-alignment-64.ll b/llvm/test/Transforms/WholeProgramDevirt/virtual-const-prop-small-alignment-64.ll
index 9f39b65e266500..111fe490a9a386 100644
--- a/llvm/test/Transforms/WholeProgramDevirt/virtual-const-prop-small-alignment-64.ll
+++ b/llvm/test/Transforms/WholeProgramDevirt/virtual-const-prop-small-alignment-64.ll
@@ -99,14 +99,14 @@ i32 trunc (i64 sub (i64 ptrtoint (ptr dso_local_equivalent @vf9i8 to i64), i64 p
 i32 trunc (i64 sub (i64 ptrtoint (ptr dso_local_equivalent @vf6i64 to i64), i64 ptrtoint (ptr @vt7_rel to i64)) to i32)
 ], !type !2
 
-; CHECK: @vt1 = alias [3 x ptr], getelementptr inbounds ({ [8 x i8], [3 x ptr], [0 x i8] }, ptr [[VT1DATA]], i32 0, i32 1)
-; CHECK: @vt2 = alias [3 x ptr], getelementptr inbounds ({ [8 x i8], [3 x ptr], [0 x i8] }, ptr [[VT2DATA]], i32 0, i32 1)
-; CHECK: @vt3 = alias [3 x ptr], getelementptr inbounds ({ [2 x i8], [3 x ptr], [0 x i8] }, ptr [[VT3DATA]], i32 0, i32 1)
-; CHECK: @vt4 = alias [3 x ptr], getelementptr inbounds ({ [16 x i8], [3 x ptr], [0 x i8] }, ptr [[VT4DATA]], i32 0, i32 1)
-; CHECK: @vt6 = alias [3 x ptr], getelementptr inbounds ({ [16 x i8], [3 x ptr], [0 x i8] }, ptr [[VT6DATA]], i32 0, i32 1)
-; CHECK: @vt7 = alias [3 x ptr], getelementptr inbounds ({ [16 x i8], [3 x ptr], [0 x i8] }, ptr [[VT7DATA]], i32 0, i32 1)
-; CHECK: @vt6_rel = alias [3 x i32], getelementptr inbounds ({ [4 x i8], [3 x i32], [0 x i8] }, ptr [[VT6RELDATA]], i32 0, i32 1)
-; CHECK: @vt7_rel = alias [3 x i32], getelementptr inbounds ({ [4 x i8], [3 x i32], [0 x i8] }, ptr [[VT7RELDATA]], i32 0, i32 1)
+; CHECK: @vt1 = alias [3 x ptr], getelementptr inbounds (i8, ptr [[VT1DATA]], i64 8)
+; CHECK: @vt2 = alias [3 x ptr], getelementptr inbounds (i8, ptr [[VT2DATA]], i64 8)
+; CHECK: @vt3 = alias [3 x ptr], getelementptr inbounds (i8, ptr [[VT3DATA]], i64 8)
+; CHECK: @vt4 = alias [3 x ptr], getelementptr inbounds (i8, ptr [[VT4DATA]], i64 16)
+; CHECK: @vt6 = alias [3 x ptr], getelementptr inbounds (i8, ptr [[VT6DATA]], i64 16)
+; CHECK: @vt7 = alias [3 x ptr], getelementptr inbounds (i8, ptr [[VT7DATA]], i64 16)
+; CHECK: @vt6_rel = alias [3 x i32], getelementptr inbounds (i8, ptr [[VT6RELDATA]], i64 4)
+; CHECK: @vt7_rel = alias [3 x i32], getelementptr inbounds (i8, ptr [[VT7RELDATA]], i64 4)
 
 define i1 @vf0i1(ptr %this) readnone {
   ret i1 0



More information about the llvm-commits mailing list