[llvm-commits] [llvm] r61032 - in /llvm/trunk: lib/Target/README.txt test/Transforms/GVN/lpre-call-wrap-2.ll test/Transforms/GVN/lpre-call-wrap.ll

Chris Lattner sabre at nondot.org
Sun Dec 14 23:49:24 PST 2008


Author: lattner
Date: Mon Dec 15 01:49:24 2008
New Revision: 61032

URL: http://llvm.org/viewvc/llvm-project?rev=61032&view=rev
Log:
Add a testcase for GCC PR 23455, which lpre handles now.  Add some
comments about why we're not getting other cases.

Added:
    llvm/trunk/test/Transforms/GVN/lpre-call-wrap-2.ll
Modified:
    llvm/trunk/lib/Target/README.txt
    llvm/trunk/test/Transforms/GVN/lpre-call-wrap.ll

Modified: llvm/trunk/lib/Target/README.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/README.txt?rev=61032&r1=61031&r2=61032&view=diff

==============================================================================
--- llvm/trunk/lib/Target/README.txt (original)
+++ llvm/trunk/lib/Target/README.txt Mon Dec 15 01:49:24 2008
@@ -1323,8 +1323,13 @@
 }
 *P = tmp;
 
+We now hoist the reload after the call (Transforms/GVN/lpre-call-wrap.ll), but
+we don't sink the store.  We need partially dead store sinking.
+
 //===---------------------------------------------------------------------===//
 
+[PHI TRANSLATE GEPs]
+
 GCC PR37166: Sinking of loads prevents SROA'ing the "g" struct on the stack
 leading to excess stack traffic. This could be handled by GVN with some crazy
 symbolic phi translation.  The code we get looks like (g is on the stack):
@@ -1350,10 +1355,11 @@
 GCC testsuite.  There are many pre testcases as ssa-pre-*.c
 
 Other simple load PRE cases:
-http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35287
-http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34677 (licm does this)
-http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29789 (SPEC2K6)
-http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23455
+http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35287 [LPRE crit edge splitting]
+
+http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34677 (licm does this, LPRE crit edge)
+  llvm-gcc t2.c -S -o - -O0 -emit-llvm | llvm-as | opt -mem2reg -simplifycfg -gvn | llvm-dis
+
 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=14705
 
 //===---------------------------------------------------------------------===//

Added: llvm/trunk/test/Transforms/GVN/lpre-call-wrap-2.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVN/lpre-call-wrap-2.ll?rev=61032&view=auto

==============================================================================
--- llvm/trunk/test/Transforms/GVN/lpre-call-wrap-2.ll (added)
+++ llvm/trunk/test/Transforms/GVN/lpre-call-wrap-2.ll Mon Dec 15 01:49:24 2008
@@ -0,0 +1,39 @@
+; RUN: llvm-as < %s | opt -gvn -enable-load-pre | llvm-dis > %t
+; RUN: %prcontext bb1: 2 < %t | grep phi
+; RUN: %prcontext bb1: 2 < %t | not grep load
+;
+; The partially redundant load in bb1 should be hoisted to "bb".  This comes
+; from this C code (GCC PR 23455):
+;   unsigned outcnt;  extern void flush_outbuf(void);
+;   void bi_windup(unsigned char *outbuf, unsigned char bi_buf) {
+;     outbuf[outcnt] = bi_buf;
+;     if (outcnt == 16384)
+;       flush_outbuf();
+;     outbuf[outcnt] = bi_buf;
+;   }
+target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
+target triple = "i386-apple-darwin7"
+ at outcnt = common global i32 0		; <i32*> [#uses=3]
+
+define void @bi_windup(i8* %outbuf, i8 zeroext %bi_buf) nounwind {
+entry:
+	%"alloca point" = bitcast i32 0 to i32		; <i32> [#uses=0]
+	%0 = load i32* @outcnt, align 4		; <i32> [#uses=1]
+	%1 = getelementptr i8* %outbuf, i32 %0		; <i8*> [#uses=1]
+	store i8 %bi_buf, i8* %1, align 1
+	%2 = load i32* @outcnt, align 4		; <i32> [#uses=1]
+	%3 = icmp eq i32 %2, 16384		; <i1> [#uses=1]
+	br i1 %3, label %bb, label %bb1
+
+bb:		; preds = %entry
+	call void @flush_outbuf() nounwind
+	br label %bb1
+
+bb1:		; preds = %bb, %entry
+	%4 = load i32* @outcnt, align 4		; <i32> [#uses=1]
+	%5 = getelementptr i8* %outbuf, i32 %4		; <i8*> [#uses=1]
+	store i8 %bi_buf, i8* %5, align 1
+	ret void
+}
+
+declare void @flush_outbuf()

Modified: llvm/trunk/test/Transforms/GVN/lpre-call-wrap.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVN/lpre-call-wrap.ll?rev=61032&r1=61031&r2=61032&view=diff

==============================================================================
--- llvm/trunk/test/Transforms/GVN/lpre-call-wrap.ll (original)
+++ llvm/trunk/test/Transforms/GVN/lpre-call-wrap.ll Mon Dec 15 01:49:24 2008
@@ -5,7 +5,7 @@
 ; Make sure the load in bb3.backedge is removed and moved into bb1 after the 
 ; call.  This makes the non-call case faster. 
 ;
-; This test is derived from this C++ code:
+; This test is derived from this C++ code (GCC PR 37810):
 ; void g();
 ; struct A { 
 ;   int n; int m;





More information about the llvm-commits mailing list