Hi.
I have a test program:
class A {
int A;
public:
virtual void test ( int x ) = 0;
};
class B : public A {
int B;
public:
void test ( int x ) {};
};
int main() {
A *a = new B();
a->test(1);
}
We have call site CS: "a->test(1);". CS.getCalledFunction() -
return NULL, so we can say that this call site is virtual. My optimization
determines, that in this call site B::test() should be called.
I've tried to use CSn.setCalledFunction(F) (where F is B::test()), but
I've got this:
Check function __cxa_pure_virtual
Call parameter type does not match function signature!
%6 = load %class.A** %a, align 4
%class.B* call void @_ZN1B4testEi(%class.A* %6, i32 1)
Ok! I've tried to change the first %class.A %6 to %class.B %6 by
"FirstArgumentOfCS->get()->mutateType(FunctionFirstArgement->getType());",
but in this case I've got this:
Check function __cxa_pure_virtual
Load result type does not match pointer operand type!
%6 = load %class.A** %a, align 4
%class.A*Instruction does not dominate all uses!
%6 = load %class.A** %a, align 4
%7 = bitcast %class.B* %6 to void (%class.A*, i32)***
Instruction does not dominate all uses!
%7 = bitcast %class.B* %6 to void (%class.A*, i32)***
%8 = load void (%class.A*, i32)*** %7
Instruction does not dominate all uses!
%8 = load void (%class.A*, i32)*** %7
%9 = getelementptr inbounds void (%class.A*, i32)** %8, i64 0
Instruction does not dominate all uses!
%9 = getelementptr inbounds void (%class.A*, i32)** %8, i64 0
%10 = load void (%class.A*, i32)** %9
Instruction does not dominate all uses!
%6 = load %class.A** %a, align 4
call void @_ZN1B4testEi(%class.B* %6, i32 1)
Can you tell me how correctly I can use CSn.setCalledFunction(F) in my case.
Thanks!
Yours sincerely,
Kadysev Mikhail
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20120306/62b1d497/attachment.html>
Hi Mikhail,
You probably want to send this to cfe-dev - this mailing list is just for
the LLVM mid/backend and some of the frontend guys don't subscribe here.
Cheers,
James
From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] On
Behalf Of ??????
Sent: 06 March 2012 14:17
To: llvmdev
Subject: [LLVMdev] Work with CallSites
Hi.
I have a test program:
class A {
int A;
public:
virtual void test ( int x ) = 0;
};
class B : public A {
int B;
public:
void test ( int x ) {};
};
int main() {
A *a = new B();
a->test(1);
}
We have call site CS: "a->test(1);". CS.getCalledFunction() -
return NULL,
so we can say that this call site is virtual. My optimization determines,
that in this call site B::test() should be called.
I've tried to use CSn.setCalledFunction(F) (where F is B::test()), but
I've
got this:
Check function __cxa_pure_virtual
Call parameter type does not match function signature!
%6 = load %class.A** %a, align 4
%class.B* call void @_ZN1B4testEi(%class.A* %6, i32 1)
Ok! I've tried to change the first %class.A %6 to %class.B %6 by
"FirstArgumentOfCS->get()->mutateType(FunctionFirstArgement->getType());",
but in this case I've got this:
Check function __cxa_pure_virtual
Load result type does not match pointer operand type!
%6 = load %class.A** %a, align 4
%class.A*Instruction does not dominate all uses!
%6 = load %class.A** %a, align 4
%7 = bitcast %class.B* %6 to void (%class.A*, i32)***
Instruction does not dominate all uses!
%7 = bitcast %class.B* %6 to void (%class.A*, i32)***
%8 = load void (%class.A*, i32)*** %7
Instruction does not dominate all uses!
%8 = load void (%class.A*, i32)*** %7
%9 = getelementptr inbounds void (%class.A*, i32)** %8, i64 0
Instruction does not dominate all uses!
%9 = getelementptr inbounds void (%class.A*, i32)** %8, i64 0
%10 = load void (%class.A*, i32)** %9
Instruction does not dominate all uses!
%6 = load %class.A** %a, align 4
call void @_ZN1B4testEi(%class.B* %6, i32 1)
Can you tell me how correctly I can use CSn.setCalledFunction(F) in my case.
Thanks!
Yours sincerely,
Kadysev Mikhail
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20120306/16dbdf9b/attachment.html>
Hi Михаил,> I have a test program: > > class A { > int A; > public: > virtual void test ( int x ) = 0; > }; > > class B : public A { > int B; > public: > void test ( int x ) {}; > }; > > int main() { > A *a = new B(); > a->test(1); > } > > > We have call site CS: "a->test(1);". CS.getCalledFunction() - return NULL,LLVM is already capable of devirtualizing this. For example, I added extern void foo(int); to your testcase, and changed void test ( int x ) {}; to void test ( int x ) { foo(x); }; Compiling with "clang -S -O4 -o -" gives: define i32 @main() uwtable { entry: tail call void @_Z3fooi(i32 1) ret i32 0 } If you want to enhance LLVM's devirtualization, I suggest you start by studying how the optimizers manage to work things like this out, and build on that. Ciao, Duncan.