Hi there,
I write two pass, a module pass, named “MP”, and a FunctionPass, “FP”.
Then I use this pass to print the scalar evolution information in two ways:
1.employ FP to process function directly
2.call MP, iterate on functions, then call FP on them
sample code is that:
MP:
bool runOnModule(Module &M)
{
for(Module::iterator itr = M.begin(); itr != M.end(); itr++)
{
FP &t = getAnalysis< FP >(*itr);
(t.SE)->print(errs()); // SE represent for scalar evolution pass.
}
}
FP:
bool runOnFunction(Function &F)
{
SE = &getAnalysis();
SE->print(errs());
}
But when processing ‘getelementptr’ instruction, these two ways return different result.
MP:
%lsr.iv1 = getelementptr inbounds [1024 x i32]* %lsr.iv, i64 0, i64 0
→ {@A,+,sizeof(i32)}<%8> Exits: (((zext i32 (0 smax %N) to i64) * sizeof(i32)) + @A)
FP:
%lsr.iv1 = getelementptr inbounds [1024 x i32]* %lsr.iv, i64 0, i64 0
→ {@A,+,4}<%8> Exits: ((4 * (zext i32 (0 smax %N) to i64)) + @A)
Then the problem comes:
In MP, sizeof(i32) seems to be treated as a variable, not a constant. On the other hand, the constant 4 for sizeof(i32) in FP seems more friendly.
What can I do if I want to translate sizeof(i32) to 4?
Any reply is appreciated.
Regards.