<div dir="ltr">When I compile two different modules using<div><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace">clang -O -S -emit-llvm</font></div></blockquote><div><br></div><div>I get different .ll files, no surprise.</div><div><br></div><div>The first looks like</div><div><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div><font face="monospace, monospace">double *v;</font></div></div><div><div><font face="monospace, monospace"><br></font></div></div><div><div><font face="monospace, monospace">double zap(long n) {</font></div></div><div><div><font face="monospace, monospace">  double sum = 0;</font></div></div><div><div><font face="monospace, monospace">  for (long i = 0; i < n; i++)</font></div></div><div><div><font face="monospace, monospace">    sum += v[i];</font></div></div><div><div><font face="monospace, monospace">  return sum;</font></div></div><div><div><font face="monospace, monospace">}</font></div></div></blockquote><div><br></div><div>yielding</div><div><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div><font face="monospace, monospace">@v = common global double* null, align 8</font></div></div><div><div><font face="monospace, monospace"><br></font></div></div><div><div><font face="monospace, monospace">; Function Attrs: nounwind readonly uwtable</font></div></div><div><div><font face="monospace, monospace">define double @zap(i64 %n) #0 {</font></div></div><div><div><font face="monospace, monospace">entry:</font></div></div><div><div><font face="monospace, monospace">  %cmp4 = icmp sgt i64 %n, 0</font></div></div><div><div><font face="monospace, monospace">  br i1 %cmp4, label %<a href="http://for.body.lr.ph">for.body.lr.ph</a>, label %for.end</font></div></div><div><div><font face="monospace, monospace"><br></font></div></div><div><div><font face="monospace, monospace"><a href="http://for.body.lr.ph">for.body.lr.ph</a>:                                   ; preds = %entry</font></div></div><div><div><font face="monospace, monospace">  %0 = load double** @v, align 8, !tbaa !1</font></div></div><div><div><font face="monospace, monospace">  br label %for.body</font></div></div><div><div><font face="monospace, monospace"><br></font></div></div><div><div><font face="monospace, monospace">for.body:                                         ; preds = %for.body, %<a href="http://for.body.lr.ph">for.body.lr.ph</a></font></div></div><div><div><font face="monospace, monospace">  %i.06 = phi i64 [ 0, %<a href="http://for.body.lr.ph">for.body.lr.ph</a> ], [ %inc, %for.body ]</font></div></div><div><div><font face="monospace, monospace">  %sum.05 = phi double [ 0.000000e+00, %<a href="http://for.body.lr.ph">for.body.lr.ph</a> ], [ %add, %for.body ]</font></div></div><div><div><font face="monospace, monospace">  %arrayidx = getelementptr inbounds double* %0, i64 %i.06</font></div></div><div><div><font face="monospace, monospace">  %1 = load double* %arrayidx, align 8, !tbaa !5</font></div></div><div><div><font face="monospace, monospace">  %add = fadd double %sum.05, %1</font></div></div><div><div><font face="monospace, monospace">  %inc = add nsw i64 %i.06, 1</font></div></div><div><div><font face="monospace, monospace">  </font></div></div><div><div><font face="monospace, monospace">%exitcond = icmp eq i64 %inc, %n</font></div></div><div><div><font face="monospace, monospace">  br i1 %exitcond, label %for.end, label %for.body</font></div></div><div><div><font face="monospace, monospace"><br></font></div></div><div><div><font face="monospace, monospace">for.end:                                          ; preds = %for.body, %entry</font></div></div><div><div><font face="monospace, monospace">  %sum.0.lcssa = phi double [ 0.000000e+00, %entry ], [ %add, %for.body ]</font></div></div><div><div><font face="monospace, monospace">  ret double %sum.0.lcssa</font></div></div><div><div><font face="monospace, monospace">}</font></div></div></blockquote><div><br></div><div>and the second looks like</div><div><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div><font face="monospace, monospace">double v[10000];</font></div></div><div><div><br></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div><font face="monospace, monospace">double zap(long n) {</font></div></div><div><div><font face="monospace, monospace">  double sum = 0;</font></div></div><div><div><font face="monospace, monospace">  for (long i = 0; i < n; i++)</font></div></div><div><div><font face="monospace, monospace">    sum += v[i];</font></div></div><div><div><font face="monospace, monospace">  return sum;</font></div></div><div><div><font face="monospace, monospace">}</font></div></div></blockquote><div><br></div><div>yielding</div><div><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div><font face="monospace, monospace">; ModuleID = 'z.c'</font></div></div><div><div><font face="monospace, monospace">target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-f128:128:128-n8:16:32:64-S128"</font></div></div><div><div><font face="monospace, monospace">target triple = "x86_64-unknown-linux-gnu"</font></div></div><div><div><font face="monospace, monospace"><br></font></div></div><div><div><font face="monospace, monospace">@v = common global [10000 x double] zeroinitializer, align 16</font></div></div><div><div><font face="monospace, monospace"><br></font></div></div><div><div><font face="monospace, monospace">; Function Attrs: nounwind readonly uwtable</font></div></div><div><div><font face="monospace, monospace">define double @zap(i64 %n) #0 {</font></div></div><div><div><font face="monospace, monospace">entry:</font></div></div><div><div><font face="monospace, monospace">  %cmp4 = icmp sgt i64 %n, 0</font></div></div><div><div><font face="monospace, monospace">  br i1 %cmp4, label %for.body, label %for.end</font></div></div><div><div><font face="monospace, monospace"><br></font></div></div><div><div><font face="monospace, monospace">for.body:                                         ; preds = %entry, %for.body</font></div></div><div><div><font face="monospace, monospace">  %i.06 = phi i64 [ %inc, %for.body ], [ 0, %entry ]</font></div></div><div><div><font face="monospace, monospace">  %sum.05 = phi double [ %add, %for.body ], [ 0.000000e+00, %entry ]</font></div></div><div><div><font face="monospace, monospace">  %arrayidx = getelementptr inbounds [10000 x double]* @v, i64 0, i64 %i.06</font></div></div><div><div><font face="monospace, monospace">  %0 = load double* %arrayidx, align 8, !tbaa !1</font></div></div><div><div><font face="monospace, monospace">  %add = fadd double %sum.05, %0</font></div></div><div><div><font face="monospace, monospace">  %inc = add nsw i64 %i.06, 1</font></div></div><div><div><font face="monospace, monospace">  %exitcond = icmp eq i64 %inc, %n</font></div></div><div><div><font face="monospace, monospace">  br i1 %exitcond, label %for.end, label %for.body</font></div></div><div><div><font face="monospace, monospace"><br></font></div></div><div><div><font face="monospace, monospace">for.end:                                          ; preds = %for.body, %entry</font></div></div><div><div><font face="monospace, monospace">  %sum.0.lcssa = phi double [ 0.000000e+00, %entry ], [ %add, %for.body ]</font></div></div><div><div><font face="monospace, monospace">  ret double %sum.0.lcssa</font></div></div><div><div><font face="monospace, monospace">}</font></div></div><div><div><font face="monospace, monospace"><br></font></div></div><div><div><font face="monospace, monospace">attributes #0 = { nounwind readonly uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }</font></div></div><div><div><font face="monospace, monospace"><br></font></div></div><div><div><font face="monospace, monospace">!llvm.ident = !{!0}</font></div></div><div><div><font face="monospace, monospace"><br></font></div></div><div><div><font face="monospace, monospace">!0 = metadata !{metadata !"Clang Front-End version 3.4.1 (tags/RELEASE_34/final)"}</font></div></div><div><div><font face="monospace, monospace">!1 = metadata !{metadata !2, metadata !2, i64 0}</font></div></div><div><div><font face="monospace, monospace">!2 = metadata !{metadata !"double", metadata !3, i64 0}</font></div></div><div><div><font face="monospace, monospace">!3 = metadata !{metadata !"omnipotent char", metadata !4, i64 0}</font></div></div><div><div><font face="monospace, monospace">!4 = metadata !{metadata !"Simple C/C++ TBAA"}</font></div></div></blockquote><div><br></div><div>(I included all the metadata and such for the 2nd case, on the off chance it matters.)</div><div><br></div><div>Is there any way I can convince licm (or something) to rip open the GEP and hoist the reference to @v outside the loop, similar to the first example?</div><div><br></div><div>Thanks,</div><div>Preston</div><div><br></div><div><br></div><div><br></div></div>