test: Prefer CHECK-LABEL to CHECK in branchweight tests
[oota-llvm.git] / test / Transforms / ScalarRepl / phi-select.ll
index 06ee2081513b03243c47de90b93f8420b795e517..a5da2dcf49d11b86833ac2ef233e4c380a6f15be 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: opt %s -scalarrepl -S | FileCheck %s
+; RUN: opt -scalarrepl -S < %s | FileCheck %s
 ; Test promotion of allocas that have phis and select users.
 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
 target triple = "x86_64-apple-darwin10.2"
@@ -6,7 +6,7 @@ target triple = "x86_64-apple-darwin10.2"
 %struct.X = type { i32 }
 %PairTy = type {i32, i32}
 
-; CHECK: @test1
+; CHECK-LABEL: @test1(
 ; CHECK: %a.0 = alloca i32
 ; CHECK: %b.0 = alloca i32
 define i32 @test1(i32 %x) nounwind readnone ssp {
@@ -24,9 +24,9 @@ entry:
   ret i32 %4
 }
 
-; CHECK: @test2
-; CHECK: %A.0 = alloca i32
-; CHECK: %A.1 = alloca i32
+; CHECK-LABEL: @test2(
+; CHECK: %X.ld = phi i32 [ 1, %entry ], [ 2, %T ]
+; CHECK-NEXT: ret i32 %X.ld
 define i32 @test2(i1 %c) {
 entry:
   %A = alloca {i32, i32}
@@ -35,7 +35,7 @@ entry:
   br i1 %c, label %T, label %F
 T:
   %C = getelementptr {i32, i32}* %A, i32 0, i32 1
-  store i32 2, i32* %B
+  store i32 2, i32* %C
   br label %F
 F:
   %X = phi i32* [%B, %entry], [%C, %T]
@@ -43,17 +43,16 @@ F:
   ret i32 %Q
 }
 
-; CHECK: @test3
-; CHECK: %A.0 = alloca i32
-; CHECK: %A.1 = alloca i32
+; CHECK-LABEL: @test3(
+; CHECK-NEXT: %Q = select i1 %c, i32 1, i32 2
+; CHECK-NEXT: ret i32 %Q
 ; rdar://8904039
 define i32 @test3(i1 %c) {
-entry:
   %A = alloca {i32, i32}
   %B = getelementptr {i32, i32}* %A, i32 0, i32 0
   store i32 1, i32* %B
   %C = getelementptr {i32, i32}* %A, i32 0, i32 1
-  store i32 2, i32* %B
+  store i32 2, i32* %C
   
   %X = select i1 %c, i32* %B, i32* %C
   %Q = load i32* %X
@@ -64,11 +63,11 @@ entry:
 define i64 @test4(i1 %c) {
 entry:
   %A = alloca %PairTy
-  ; CHECK: @test4
+  ; CHECK-LABEL: @test4(
   ; CHECK: %A = alloca %PairTy
-  %B = getelementptr {i32, i32}* %A, i32 0, i32 0
+  %B = getelementptr %PairTy* %A, i32 0, i32 0
   store i32 1, i32* %B
-  %C = getelementptr {i32, i32}* %A, i32 0, i32 1
+  %C = getelementptr %PairTy* %A, i32 0, i32 1
   store i32 2, i32* %B
   
   %X = select i1 %c, i32* %B, i32* %C
@@ -76,3 +75,79 @@ entry:
   %Q = load i64* %Y
   ret i64 %Q
 }
+
+
+;;
+;; Tests for promoting allocas used by selects.
+;; rdar://7339113
+;;
+
+define i32 @test5(i32 *%P) nounwind readnone ssp {
+entry:
+  %b = alloca i32, align 8 
+  store i32 2, i32* %b, align 8
+  
+  ;; Select on constant condition should be folded.
+  %p.0 = select i1 false, i32* %b, i32* %P
+  store i32 123, i32* %p.0
+  
+  %r = load i32* %b, align 8
+  ret i32 %r
+  
+; CHECK-LABEL: @test5(
+; CHECK: store i32 123, i32* %P
+; CHECK: ret i32 2
+}
+
+define i32 @test6(i32 %x, i1 %c) nounwind readnone ssp {
+  %a = alloca i32, align 8
+  %b = alloca i32, align 8
+  store i32 1, i32* %a, align 8
+  store i32 2, i32* %b, align 8
+  %p.0 = select i1 %c, i32* %b, i32* %a
+  %r = load i32* %p.0, align 8
+  ret i32 %r
+; CHECK-LABEL: @test6(
+; CHECK-NEXT: %r = select i1 %c, i32 2, i32 1
+; CHECK-NEXT: ret i32 %r
+}
+
+; Verify that the loads happen where the loads are, not where the select is.
+define i32 @test7(i32 %x, i1 %c) nounwind readnone ssp {
+  %a = alloca i32, align 8
+  %b = alloca i32, align 8
+  store i32 1, i32* %a
+  store i32 2, i32* %b
+  %p.0 = select i1 %c, i32* %b, i32* %a
+  
+  store i32 0, i32* %a
+  
+  %r = load i32* %p.0, align 8
+  ret i32 %r
+; CHECK-LABEL: @test7(
+; CHECK-NOT: alloca i32
+; CHECK: %r = select i1 %c, i32 2, i32 0
+; CHECK: ret i32 %r
+}
+
+;; Promote allocs that are PHI'd together by moving the loads.
+define i32 @test8(i32 %x) nounwind readnone ssp {
+; CHECK-LABEL: @test8(
+; CHECK-NOT: load i32
+; CHECK-NOT: store i32
+; CHECK: %p.0.ld = phi i32 [ 2, %entry ], [ 1, %T ]
+; CHECK-NEXT: ret i32 %p.0.ld
+entry:
+  %a = alloca i32, align 8
+  %b = alloca i32, align 8
+  store i32 1, i32* %a, align 8
+  store i32 2, i32* %b, align 8
+  %c = icmp eq i32 %x, 0 
+  br i1 %c, label %T, label %Cont
+T:
+  br label %Cont
+Cont:
+  %p.0 = phi i32* [%b, %entry],[%a, %T]
+  %r = load i32* %p.0, align 8
+  ret i32 %r
+}