mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Add a testcase for GCC PR 23455, which lpre handles now. Add some
comments about why we're not getting other cases. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@61032 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
fd7eb7252f
commit
8f416f3afd
@ -1323,8 +1323,13 @@ for () {
|
||||
}
|
||||
*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 @@ There are many load PRE testcases in testsuite/gcc.dg/tree-ssa/loadpre* in the
|
||||
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
|
||||
|
||||
//===---------------------------------------------------------------------===//
|
||||
|
39
test/Transforms/GVN/lpre-call-wrap-2.ll
Normal file
39
test/Transforms/GVN/lpre-call-wrap-2.ll
Normal file
@ -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"
|
||||
@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()
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user