<div dir="ltr">Hi, All,<div><br></div><div>Suppose I have a very simple code like this and variable 'a' is a global variable:</div><div>***************************************************************************</div><div><div><i>double ** a;</i></div><div><i>int main(){</i></div><div><i>    a[5][10] = 0.1;</i></div><div><i>    a[5][20] = 0.5;</i></div><div><i>    return 0;</i></div><div><i>}</i></div></div><div>***************************************************************************<i><br></i></div><div><br></div><div>Then I can get the IR without any optimization like this:</div><div>***************************************************************************<br></div><div><i>@a = global double** null, align 8</i></div><div><i><br></i></div><div><i>; Function Attrs: nounwind uwtable</i></div><div><i>define i32 @main() #0 {</i></div><div><i>  %1 = alloca i32, align 4</i></div><div><i>  store i32 0, i32* %1</i></div><div><i>  %2 = load double*** @a, align 8</i></div><div><i>  %3 = getelementptr inbounds double** %2, i64 5</i></div><div><i>  %4 = load double** %3, align 8</i></div><div><i>  %5 = getelementptr inbounds double* %4, i64 10</i></div><div><i>  store double 1.000000e-01, double* %5, align 8</i></div><div><i>  %6 = load double*** @a, align 8</i></div><div><i>  %7 = getelementptr inbounds double** %6, i64 5</i></div><div><i>  %8 = load double** %7, align 8</i></div><div><i>  %9 = getelementptr inbounds double* %8, i64 20</i></div><div><i>  store double 5.000000e-01, double* %9, align 8</i></div><div><i>  ret i32 0</i></div><div><i>}</i></div><div>***************************************************************************<br></div><div><br></div><div>I hope GVN can get rid of redundant 'load' and 'getelementptr' instructions such as '<i>%2 = load double*** @a, align 8</i>' and '<i>%6 = load double*** @a, align 8</i>'. So I use 'opt input.ll -basicaa -gvn -S -o output.ll ' , I still get :</div><div>***************************************************************************<br></div><div><div><i>  %2 = load double*** @a, align 8</i></div><div><i>  %3 = getelementptr inbounds double** %2, i64 5</i></div><div><i>  %4 = load double** %3, align 8</i></div><div><i>  %5 = getelementptr inbounds double* %4, i64 10</i></div><div><i>  store double 1.000000e-01, double* %5, align 8</i></div><div><i>  %6 = load double*** @a, align 8</i></div><div><i>  %7 = getelementptr inbounds double** %6, i64 5</i></div><div><i>  %8 = load double** %7, align 8</i></div><div><i>  %9 = getelementptr inbounds double* %8, i64 20</i></div><div><i>  store double 5.000000e-01, double* %9, align 8</i></div></div><div>***************************************************************************<i><br></i></div><div><br></div><div>It seems GVN doesn't work. Then I use '-aa-eval', it seems LLVM thinks that is "<b>may alias</b>". But '%2' and '%6' are alias, right?</div><div>***************************************************************************<br></div><div><div><i>===== Alias Analysis Evaluator Report =====</i></div><div><i>  45 Total Alias Queries Performed</i></div><div><i>  13 no alias responses (28.8%)</i></div><div><i>  32 may alias responses (71.1%)</i></div><div><i>  0 partial alias responses (0.0%)</i></div><div><i>  0 must alias responses (0.0%)</i></div><div><i>  Alias Analysis Evaluator Pointer Alias Summary: 28%/71%/0%/0%</i></div><div><i>  Alias Analysis Mod/Ref Evaluator Summary: no mod/ref!</i></div></div><div>***************************************************************************<br></div><div><br></div><div>Can anyone help me to use GVN in this situation? Thanks</div><div><br></div><div>Regards,</div><div><br></div><div>Xiangyang</div></div>