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