[InstCombine] Signed saturation patterns
[llvm-core.git] / test / Transforms / InstCombine / cast_phi.ll
blob141ad186002d8c1facdd76d4a7de4a3ff1b2849c
1 ; RUN: opt < %s -instcombine -S | FileCheck %s
2 ; RUN: opt < %s -passes=instcombine -S | FileCheck %s
4 define void @MainKernel(i32 %iNumSteps, i32 %tid, i32 %base) {
5 ; CHECK-NOT: bitcast
7   %callA = alloca [258 x float], align 4
8   %callB = alloca [258 x float], align 4
9   %conv.i = uitofp i32 %iNumSteps to float
10   %1 = bitcast float %conv.i to i32
11   %conv.i12 = zext i32 %tid to i64
12   %arrayidx3 = getelementptr inbounds [258 x float], [258 x float]* %callA, i64 0, i64 %conv.i12
13   %2 = bitcast float* %arrayidx3 to i32*
14   store i32 %1, i32* %2, align 4
15   %arrayidx6 = getelementptr inbounds [258 x float], [258 x float]* %callB, i64 0, i64 %conv.i12
16   %3 = bitcast float* %arrayidx6 to i32*
17   store i32 %1, i32* %3, align 4
18   %cmp7 = icmp eq i32 %tid, 0
19   br i1 %cmp7, label %.bb1, label %.bb2
21 .bb1:
22   %arrayidx10 = getelementptr inbounds [258 x float], [258 x float]* %callA, i64 0, i64 256
23   store float %conv.i, float* %arrayidx10, align 4
24   %arrayidx11 = getelementptr inbounds [258 x float], [258 x float]* %callB, i64 0, i64 256
25   store float 0.000000e+00, float* %arrayidx11, align 4
26   br label %.bb2
28 .bb2:
29   %cmp135 = icmp sgt i32 %iNumSteps, 0
30   br i1 %cmp135, label %.bb3, label %.bb8
32 ; CHECK-LABEL: .bb3
33 ; CHECK: phi float
34 ; CHECK: phi float
35 ; CHECK: phi i32 {{.*}} [ %iNumSteps
36 ; CHECK-NOT: rA.sroa.[0-9].[0-9] = phi i32
37 ; CHECK-NOT: phi float
38 ; CHECK-NOT: phi i32
39 ; CHECK-LABEL: .bb4
41 .bb3:
42   %rA.sroa.8.0 = phi i32 [ %rA.sroa.8.2, %.bb12 ], [ %1, %.bb2 ]
43   %rA.sroa.0.0 = phi i32 [ %rA.sroa.0.2, %.bb12 ], [ %1, %.bb2 ]
44   %i12.06 = phi i32 [ %sub, %.bb12 ], [ %iNumSteps, %.bb2 ]
45   %4 = icmp ugt i32 %i12.06, %base
46   %add = add i32 %i12.06, 1
47   %conv.i9 = sext i32 %add to i64
48   %arrayidx20 = getelementptr inbounds [258 x float], [258 x float]* %callA, i64 0, i64 %conv.i9
49   %5 = bitcast float* %arrayidx20 to i32*
50   %arrayidx24 = getelementptr inbounds [258 x float], [258 x float]* %callB, i64 0, i64 %conv.i9
51   %6 = bitcast float* %arrayidx24 to i32*
52   %cmp40 = icmp ult i32 %i12.06, %base
53   br i1 %4, label %.bb4, label %.bb5
55 .bb4:
56   %7 = load i32, i32* %5, align 4
57   %8 = load i32, i32* %6, align 4
58   %9 = bitcast i32 %8 to float
59   %10 = bitcast i32 %7 to float
60   %add33 = fadd float %9, %10
61   %11 = bitcast i32 %rA.sroa.8.0 to float
62   %add33.1 = fadd float %add33, %11
63   %12 = bitcast float %add33.1 to i32
64   %13 = bitcast i32 %rA.sroa.0.0 to float
65   %add33.2 = fadd float %add33.1, %13
66   %14 = bitcast float %add33.2 to i32
67   br label %.bb5
69 ; CHECK-LABEL: .bb5
70 ; CHECK: phi float
71 ; CHECK: phi float
72 ; CHECK-NOT: rA.sroa.[0-9].[0-9] = phi i32
73 ; CHECK-NOT: phi float
74 ; CHECK-NOT: phi i32
75 ; CHECK-LABEL: .bb6
77 .bb5:
78   %rA.sroa.8.1 = phi i32 [ %12, %.bb4 ], [ %rA.sroa.8.0, %.bb3 ]
79   %rA.sroa.0.1 = phi i32 [ %14, %.bb4 ], [ %rA.sroa.0.0, %.bb3 ]
80   br i1 %cmp40, label %.bb6, label %.bb7
82 .bb6:
83   store i32 %rA.sroa.0.1, i32* %2, align 4
84   store i32 %rA.sroa.8.1, i32* %3, align 4
85   br label %.bb7
87 .bb7:
88   br i1 %4, label %.bb9, label %.bb10
90 .bb8:
91   ret void
93 .bb9:
94   %15 = load i32, i32* %5, align 4
95   %16 = load i32, i32* %6, align 4
96   %17 = bitcast i32 %16 to float
97   %18 = bitcast i32 %15 to float
98   %add33.112 = fadd float %17, %18
99   %19 = bitcast i32 %rA.sroa.8.1 to float
100   %add33.1.1 = fadd float %add33.112, %19
101   %20 = bitcast float %add33.1.1 to i32
102   %21 = bitcast i32 %rA.sroa.0.1 to float
103   %add33.2.1 = fadd float %add33.1.1, %21
104   %22 = bitcast float %add33.2.1 to i32
105   br label %.bb10
107 ; CHECK-LABEL: .bb10
108 ; CHECK: phi float
109 ; CHECK: phi float
110 ; CHECK-NOT: rA.sroa.[0-9].[0-9] = phi i32
111 ; CHECK-NOT: phi float
112 ; CHECK-NOT: phi i32
113 ; CHECK-LABEL: .bb11
115 .bb10:
116   %rA.sroa.8.2 = phi i32 [ %20, %.bb9 ], [ %rA.sroa.8.1, %.bb7 ]
117   %rA.sroa.0.2 = phi i32 [ %22, %.bb9 ], [ %rA.sroa.0.1, %.bb7 ]
118   br i1 %cmp40, label %.bb11, label %.bb12
120 ; CHECK-LABEL: .bb11
121 ; CHECK: store float
122 ; CHECK: store float
123 ; CHECK-NOT: store i32 %rA.sroa.[0-9].[0-9]
124 ; CHECK-LABEL: .bb12
126 .bb11:
127   store i32 %rA.sroa.0.2, i32* %2, align 4
128   store i32 %rA.sroa.8.2, i32* %3, align 4
129   br label %.bb12
131 .bb12:
132   %sub = add i32 %i12.06, -4
133   %cmp13 = icmp sgt i32 %sub, 0
134   br i1 %cmp13, label %.bb3, label %.bb8