[PATCH] D101103: [InstSimplify] Treat invariant group insts as bitcasts for load operands

Piotr Padlewski via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 28 03:00:37 PDT 2021


Prazek added a comment.

In D101103#2720276 <https://reviews.llvm.org/D101103#2720276>, @aeubanks wrote:

> In D101103#2718965 <https://reviews.llvm.org/D101103#2718965>, @Prazek wrote:
>
>> Out of curiosity: have you seen this pattern happening in the wild with -fstrict-vtable-pointers?
>
> Yes, it was causing a major size regression in one specific file (with rtti). I've managed to reduce it down to
>
>   struct A {
>     int i;
>     virtual void f();
>     A(): i(4) {}
>   };
>   
>   const A g;
>   
>   int foo() {
>     const A* a = &g;
>     return a->i;
>   }
>
> `$ ./build/rel/bin/clang++ /tmp/a.cc -o - -S -emit-llvm -O2 -fstrict-vtable-pointers`
>
>   %struct.A = type <{ i32 (...)**, i32, [4 x i8] }>
>   
>   @_ZL1g = internal constant %struct.A <{ i32 (...)** bitcast (i8** getelementptr inbounds ({ [3 x i8*] }, { [3 x i8*] }* @_ZTV1A, i32 0, inrange i32 0, i32 2) to i32 (...)**), i32 4, [4 x i8] zeroinitializer }>, align 8
>   @_ZTV1A = external dso_local unnamed_addr constant { [3 x i8*] }, align 8
>   @llvm.global_ctors = appending global [0 x { i32, void ()*, i8* }] zeroinitializer
>   
>   ; Function Attrs: nofree nosync nounwind readnone uwtable willreturn mustprogress
>   define dso_local i32 @_Z8hahahahav() local_unnamed_addr #0 {
>   entry:
>     %0 = tail call i8* @llvm.strip.invariant.group.p0i8(i8* bitcast (%struct.A* @_ZL1g to i8*))
>     %i = getelementptr inbounds i8, i8* %0, i64 8
>     %1 = bitcast i8* %i to i32*
>     %2 = load i32, i32* %1, align 8, !tbaa !6
>     ret i32 %2
>   }
>
> `$ ./build/rel/bin/clang++ /tmp/a.cc -o - -S -emit-llvm -O2`
>
>   ; Function Attrs: nofree norecurse nosync nounwind readnone uwtable willreturn mustprogress
>   define dso_local i32 @_Z8hahahahav() local_unnamed_addr #0 {
>   entry:
>     ret i32 4
>   }

Nice finding!


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D101103/new/

https://reviews.llvm.org/D101103



More information about the llvm-commits mailing list