When removing a function from the function set and adding it to deferred, we
[llvm.git] / test / Transforms / GVN / lpre-call-wrap-2.ll
blobe39f3ed87d1c3b2ef118977db8c22c5c676e42d9
1 ; RUN: opt -S -basicaa -gvn -enable-load-pre %s | FileCheck %s
3 ; The partially redundant load in bb1 should be hoisted to "bb".  This comes
4 ; from this C code (GCC PR 23455):
5 ;   unsigned outcnt;  extern void flush_outbuf(void);
6 ;   void bi_windup(unsigned char *outbuf, unsigned char bi_buf) {
7 ;     outbuf[outcnt] = bi_buf;
8 ;     if (outcnt == 16384)
9 ;       flush_outbuf();
10 ;     outbuf[outcnt] = bi_buf;
11 ;   }
12 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"
13 target triple = "i386-apple-darwin7"
14 @outcnt = common global i32 0           ; <i32*> [#uses=3]
16 define void @bi_windup(i8* %outbuf, i8 zeroext %bi_buf) nounwind {
17 entry:
18         %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
19         %0 = load i32* @outcnt, align 4         ; <i32> [#uses=1]
20         %1 = getelementptr i8* %outbuf, i32 %0          ; <i8*> [#uses=1]
21         store i8 %bi_buf, i8* %1, align 1
22         %2 = load i32* @outcnt, align 4         ; <i32> [#uses=1]
23         %3 = icmp eq i32 %2, 16384              ; <i1> [#uses=1]
24         br i1 %3, label %bb, label %bb1
26 bb:             ; preds = %entry
27         call void @flush_outbuf() nounwind
28         br label %bb1
30 bb1:            ; preds = %bb, %entry
31 ; CHECK: bb1:
32 ; CHECK-NEXT: phi
33 ; CHECK-NEXT: getelementptr
34         %4 = load i32* @outcnt, align 4         ; <i32> [#uses=1]
35         %5 = getelementptr i8* %outbuf, i32 %4          ; <i8*> [#uses=1]
36         store i8 %bi_buf, i8* %5, align 1
37         ret void
40 declare void @flush_outbuf()