[llvm-dev] devirtualization with new-PM pipeline

Fedor Sergeev via llvm-dev llvm-dev at lists.llvm.org
Thu Dec 7 12:20:56 PST 2017


On 12/07/2017 11:09 PM, Fedor Sergeev via llvm-dev wrote:
 > Chandler et al,
 >
 > I have been playing with the new PM pipeline, being particularly 
interested in how it can handle devirtualization.
 > Now, I discovered what I believe is a "regression" vs old PM on a 
rather simple one-translation-unit testcase.
 >
 > clang is able to devirtualize it with -O3 and fails to do so with 
-fexperimental-new-pass-manager added.

I hate to correct myself ;) yet it is able to devirtualize (that is GVN 
does its job) though it does fail to perform
a rather expected inline afterwards.

regards,
   Fedor.


 >
 > It looks like a pipeline issue, though I did not dig deeper as I'm 
not sure if this kind of behavior
 > is expected at current stage of New PM life or not?
 >
 > If it is not expected then I'ld be happy to file a bug and do a bit 
deeper look for the cause.
 >
 > regards,
 >   Fedor.
 > -------------------------------
 > ] cat devirt.cpp
 > struct A {
 >   virtual int virt1();
 > };
 > struct B : A {
 >   int virt1() override {
 >     return 20;
 >   }
 > };
 > static int redirect(A* a) {
 >   return a->virt1();
 > }
 > int calc() {
 >   B b;
 >   return redirect(&b);
 > }
 > ] clang++ -O3 devirt.cpp -std=c++11 -S -emit-llvm -o -
 > ...
 > define i32 @_Z4calcv() local_unnamed_addr #0 {
 > entry:
 >   ret i32 20    <--- nicely devirtualized (&b)->virt1() call
 > }
 > ...
 > ] clang++ -O3 -fexperimental-new-pass-manager -std=c++11 -S 
-emit-llvm -o -
 > ...
 > define i32 @_Z4calcv() local_unnamed_addr #0 {
 > entry:
 >   %b = alloca %struct.B, align 8
 >   %0 = bitcast %struct.B* %b to i8*
 >   call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %0) #3
 >   %1 = getelementptr inbounds %struct.B, %struct.B* %b, i64 0, i32 0, 
i32 0
 >   store i32 (...)** bitcast (i8** getelementptr inbounds ({ [3 x i8*] 
}, { [3 x i8*] }* @_ZTV1B, i64 0, inrange i32 0, i64 2) to i32 (...)**), 
i32 (...)*** %1, align 8, !tbaa !2
 >   %call.i = call i32 @_ZN1B5virt1Ev(%struct.B* nonnull %b)
 >   call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %0) #3
 >   ret i32 %call.i
 > }
 > ...
 > ] clang++ --version
 > clang version 6.0.0 (trunk 319748) (llvm/trunk 319768)
 > Target: x86_64-unknown-linux-gnu
 > Thread model: posix
 >
 >
 > _______________________________________________
 > LLVM Developers mailing list
 > llvm-dev at lists.llvm.org
 > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev



More information about the llvm-dev mailing list