<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, May 26, 2017 at 5:54 PM, Wei Mi via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: wmi<br>
Date: Fri May 26 19:54:19 2017<br>
New Revision: 304050<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=304050&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=304050&view=rev</a><br>
Log:<br>
[GVN] Recommit the patch "Add phi-translate support in scalarpre".<br>
<br>
The recommit is to fix a bug about ExtractValue and InsertValue ops. For those<br>
ops, some varargs inside GVN::Expression are not value numbers but raw index<br>
numbers. It is wrong to do phi-translate for raw index numbers, and the fix is<br>
to stop doing that.<br>
<br>
Right now scalarpre doesn't have phi-translate support, so it will miss some<br>
simple pre opportunities. Like the following testcase, current scalarpre cannot<br>
recognize the last "a * b" is fully redundent because a and b used by the last<br>
"a * b" expr are both defined by phis.<br>
<br>
long a[100], b[100], g1, g2, g3;<br>
__attribute__((pure)) long goo();<br>
<br>
void foo(long a, long b, long c, long d) {<br>
  g1 = a * b;<br>
  if (__builtin_expect(g2 > 3, 0)) {<br>
    a = c;<br>
    b = d;<br>
    g2 = a * b;<br>
  }<br>
  g3 = a * b;      // fully redundant.<br>
}<br>
The patch adds phi-translate support in scalarpre. This is only a temporary<br>
solution before the newpre based on newgvn is available.<br></blockquote><div><br></div><div>Just to mention:<br>NewGVN does not require PRE to get the case above.</div><div>It already gets it :)</div><div><br></div><div>In general, any full redundancy that exists in the program will be caught by newgvn, as it is complete.</div><div>(those where it doesn't are deliberate decisions we could change :P)</div><div><br></div><div>before -newgvn:<br><div>target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"</div><div>target triple = "x86_64-apple-macosx10.12.0"</div><div><br></div><div>@g1 = common global i64 0, align 8</div><div>@g2 = common global i64 0, align 8</div><div>@g3 = common global i64 0, align 8</div><div>@a = common global [100 x i64] zeroinitializer, align 16</div><div>@b = common global [100 x i64] zeroinitializer, align 16</div><div><br></div><div>; Function Attrs: nounwind ssp uwtable</div><div>define void @foo(i64, i64, i64, i64) #0 {</div><div>  %5 = mul nsw i64 %0, %1</div><div>  store i64 %5, i64* @g1, align 8, !tbaa !2</div><div>  %6 = load i64, i64* @g2, align 8, !tbaa !2</div><div>  %7 = icmp sgt i64 %6, 3</div><div>  %8 = zext i1 %7 to i32</div><div>  %9 = sext i32 %8 to i64</div><div>  %10 = call i64 @llvm.expect.i64(i64 %9, i64 0)</div><div>  %11 = icmp ne i64 %10, 0</div><div>  br i1 %11, label %12, label %14</div><div><br></div><div>; <label>:12:                                     ; preds = %4</div><div>  %13 = mul nsw i64 %2, %3</div><div>  store i64 %13, i64* @g2, align 8, !tbaa !2</div><div>  br label %14</div><div><br></div><div>; <label>:14:                                     ; preds = %12, %4</div><div>  %.08 = phi i64 [ %3, %12 ], [ %1, %4 ]</div><div>  %.0 = phi i64 [ %2, %12 ], [ %0, %4 ]</div><div>  %15 = mul nsw i64 %.0, %.08</div><div>  store i64 %15, i64* @g3, align 8, !tbaa !2</div><div>  ret void</div><div>}</div></div><div><br></div><div>after -newgvn:</div><div><div>target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"</div><div>target triple = "x86_64-apple-macosx10.12.0"</div><div><br></div><div>@g1 = common global i64 0, align 8</div><div>@g2 = common global i64 0, align 8</div><div>@g3 = common global i64 0, align 8</div><div>@a = common global [100 x i64] zeroinitializer, align 16</div><div>@b = common global [100 x i64] zeroinitializer, align 16</div><div><br></div><div>; Function Attrs: nounwind ssp uwtable</div><div>define void @foo(i64, i64, i64, i64) #0 {</div><div>  %5 = mul nsw i64 %0, %1</div><div>  store i64 %5, i64* @g1, align 8, !tbaa !2</div><div>  %6 = load i64, i64* @g2, align 8, !tbaa !2</div><div>  %7 = icmp sgt i64 %6, 3</div><div>  %8 = zext i1 %7 to i32</div><div>  %9 = sext i32 %8 to i64</div><div>  %10 = call i64 @llvm.expect.i64(i64 %9, i64 0)</div><div>  %11 = icmp ne i64 %10, 0</div><div>  br i1 %11, label %12, label %14</div><div><br></div><div>; <label>:12:                                     ; preds = %4</div><div>  %13 = mul nsw i64 %2, %3</div><div>  store i64 %13, i64* @g2, align 8, !tbaa !2</div><div>  br label %14</div><div><br></div><div>; <label>:14:                                     ; preds = %12, %4</div><div>  %15 = phi i64 [ %13, %12 ], [ %5, %4 ]</div><div>  %.08 = phi i64 [ %3, %12 ], [ %1, %4 ]</div><div>  %.0 = phi i64 [ %2, %12 ], [ %0, %4 ]</div><div>  store i64 %15, i64* @g3, align 8, !tbaa !2</div><div>  ret void</div><div>}</div></div><div><br></div><div>(note that %15 has been transformed into a phi of the existing values)</div><div><br></div><div><br></div></div></div></div>