Add support for code generation of the one register with immediate form of vorr.
[oota-llvm.git] / test / Transforms / GVN / rle.ll
index 46fc818daa3d60125852025bd89d04b20897d5b4..2e433217507061246f185bb91ca21a2e155259ae 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: opt < %s -gvn -S | FileCheck %s
+; RUN: opt < %s -basicaa -gvn -S | FileCheck %s
 
 ; 32-bit little endian target.
 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"
@@ -469,6 +469,9 @@ exit:
 define i8 @phi_trans4(i8* %p) {
 ; CHECK: @phi_trans4
 entry:
+  %X3 = getelementptr i8* %p, i32 192
+  store i8 192, i8* %X3
+  
   %X = getelementptr i8* %p, i32 4
   %Y = load i8* %X
   br label %loop
@@ -476,11 +479,15 @@ entry:
 loop:
   %i = phi i32 [4, %entry], [192, %loop]
   %X2 = getelementptr i8* %p, i32 %i
-  %Y2 = load i8* %X
+  %Y2 = load i8* %X2
+  
+; CHECK: loop:
+; CHECK-NEXT: %Y2 = phi i8 [ %Y, %entry ], [ 0, %loop ]
+; CHECK-NOT: load i8
   
   %cond = call i1 @cond2()
 
-  %Z = bitcast i8 *%X2 to i32*
+  %Z = bitcast i8 *%X3 to i32*
   store i32 0, i32* %Z
   br i1 %cond, label %loop, label %out
   
@@ -492,6 +499,7 @@ out:
 define i8 @phi_trans5(i8* %p) {
 ; CHECK: @phi_trans5
 entry:
+  
   %X4 = getelementptr i8* %p, i32 2
   store i8 19, i8* %X4
   
@@ -502,8 +510,7 @@ entry:
 loop:
   %i = phi i32 [4, %entry], [3, %cont]
   %X2 = getelementptr i8* %p, i32 %i
-  %Y2 = load i8* %X2
-  ;; FIXME: This load is being incorrectly replaced!
+  %Y2 = load i8* %X2  ; Ensure this load is not being incorrectly replaced.
   %cond = call i1 @cond2()
   br i1 %cond, label %cont, label %out
 
@@ -511,6 +518,11 @@ cont:
   %Z = getelementptr i8* %X2, i32 -1
   %Z2 = bitcast i8 *%Z to i32*
   store i32 50462976, i32* %Z2  ;; (1 << 8) | (2 << 16) | (3 << 24)
+
+
+; CHECK: store i32
+; CHECK-NEXT: getelementptr i8* %p, i32 3
+; CHECK-NEXT: load i8*
   br label %loop
   
 out:
@@ -519,4 +531,16 @@ out:
 }
 
 
+; PR6642
+define i32 @memset_to_load() nounwind readnone {
+entry:
+  %x = alloca [256 x i32], align 4                ; <[256 x i32]*> [#uses=2]
+  %tmp = bitcast [256 x i32]* %x to i8*           ; <i8*> [#uses=1]
+  call void @llvm.memset.i64(i8* %tmp, i8 0, i64 1024, i32 4)
+  %arraydecay = getelementptr inbounds [256 x i32]* %x, i32 0, i32 0 ; <i32*>
+  %tmp1 = load i32* %arraydecay                   ; <i32> [#uses=1]
+  ret i32 %tmp1
+; CHECK: @memset_to_load
+; CHECK: ret i32 0
+}