| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- ; 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"
- %struct.X = type { i32 }
- %PairTy = type {i32, i32}
- ; CHECK-LABEL: @test1(
- ; CHECK: %a.0 = alloca i32
- ; CHECK: %b.0 = alloca i32
- define i32 @test1(i32 %x) nounwind readnone ssp {
- entry:
- %a = alloca %struct.X, align 8 ; <%struct.X*> [#uses=2]
- %b = alloca %struct.X, align 8 ; <%struct.X*> [#uses=2]
- %0 = getelementptr inbounds %struct.X, %struct.X* %a, i64 0, i32 0 ; <i32*> [#uses=1]
- store i32 1, i32* %0, align 8
- %1 = getelementptr inbounds %struct.X, %struct.X* %b, i64 0, i32 0 ; <i32*> [#uses=1]
- store i32 2, i32* %1, align 8
- %2 = icmp eq i32 %x, 0 ; <i1> [#uses=1]
- %p.0 = select i1 %2, %struct.X* %b, %struct.X* %a ; <%struct.X*> [#uses=1]
- %3 = getelementptr inbounds %struct.X, %struct.X* %p.0, i64 0, i32 0 ; <i32*> [#uses=1]
- %4 = load i32, i32* %3, align 8 ; <i32> [#uses=1]
- ret i32 %4
- }
- ; 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}
- %B = getelementptr {i32, i32}, {i32, i32}* %A, i32 0, i32 0
- store i32 1, i32* %B
- br i1 %c, label %T, label %F
- T:
- %C = getelementptr {i32, i32}, {i32, i32}* %A, i32 0, i32 1
- store i32 2, i32* %C
- br label %F
- F:
- %X = phi i32* [%B, %entry], [%C, %T]
- %Q = load i32, i32* %X
- ret i32 %Q
- }
- ; 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) {
- %A = alloca {i32, i32}
- %B = getelementptr {i32, i32}, {i32, i32}* %A, i32 0, i32 0
- store i32 1, i32* %B
- %C = getelementptr {i32, i32}, {i32, i32}* %A, i32 0, i32 1
- store i32 2, i32* %C
-
- %X = select i1 %c, i32* %B, i32* %C
- %Q = load i32, i32* %X
- ret i32 %Q
- }
- ;; We can't scalarize this, a use of the select is not an element access.
- define i64 @test4(i1 %c) {
- entry:
- %A = alloca %PairTy
- ; CHECK-LABEL: @test4(
- ; CHECK: %A = alloca %PairTy
- %B = getelementptr %PairTy, %PairTy* %A, i32 0, i32 0
- store i32 1, i32* %B
- %C = getelementptr %PairTy, %PairTy* %A, i32 0, i32 1
- store i32 2, i32* %B
-
- %X = select i1 %c, i32* %B, i32* %C
- %Y = bitcast i32* %X to i64*
- %Q = load i64, 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, 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, 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, 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, i32* %p.0, align 8
- ret i32 %r
- }
|