[llvm] [GVN] Fix vtable processing of static object (PR #223456)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Sat Oct 3 00:33:27 PDT 2026


================
@@ -0,0 +1,39 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -passes=gvn -S %s -o - | FileCheck %s
+
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32"
+
+ at f = dso_local local_unnamed_addr global float 0.000000e+00, align 4
+
+ at _ZZ1gvE1a = internal global { ptr, ptr } zeroinitializer
+
+define dso_local void @_Z1hv() local_unnamed_addr {
+; CHECK-LABEL: define dso_local void @_Z1hv() local_unnamed_addr {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr @f, align 4
+; CHECK-NEXT:    [[VTABLE:%.*]] = load ptr, ptr getelementptr inbounds nuw (i8, ptr @_ZZ1gvE1a, i64 8), align 8, !invariant.group [[META0:![0-9]+]]
+; CHECK-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[VTABLE]], align 8, !invariant.load [[META0]]
+; CHECK-NEXT:    tail call void [[TMP1]](ptr getelementptr inbounds nuw (i8, ptr @_ZZ1gvE1a, i64 8), float noundef [[TMP0]])
+; CHECK-NEXT:    ret void
+;
+entry:
+  %0 = load float, ptr @f, align 4
----------------
nikic wrote:

Replace global `@f` with an argument `ptr %p`. (Though TBH I don't fully understand why this load is needed -- possibly just need some memory access before the vtable load?)

https://github.com/llvm/llvm-project/pull/223456


More information about the llvm-commits mailing list