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
|
;=========================== begin_copyright_notice ============================
;
; Copyright (C) 2022 Intel Corporation
;
; SPDX-License-Identifier: MIT
;
;============================ end_copyright_notice =============================
;
; RUN: igc_opt -igc-early-out-patterns-pass -S -inputcs < %s | FileCheck %s
; ------------------------------------------------
; EarlyOutPatterns
; ------------------------------------------------
define spir_kernel void @test_earlyout(i32 %a, i32 %b, i32 %c, float* %d) {
; CHECK-LABEL: @test_earlyout(
; CHECK: entry:
; CHECK: [[BT1:%.*]] = uitofp i32 [[A:%.*]] to float
; CHECK: [[FMUL1:%.*]] = fmul float [[BT1]], [[BT1]]
; CHECK: [[BT2:%.*]] = uitofp i32 [[B:%.*]] to float
; CHECK: [[FMUL2:%.*]] = fmul float [[BT2]], [[BT2]]
; CHECK: [[BT3:%.*]] = uitofp i32 [[C:%.*]] to float
; CHECK: [[FMUL3:%.*]] = fmul float [[BT3]], [[BT3]]
; CHECK: [[FADD1:%.*]] = fadd float [[FMUL2]], [[FMUL3]]
; CHECK: [[TMP0:%.*]] = fadd float [[FMUL1]], [[FADD1]]
; CHECK: [[TMP1:%.*]] = fcmp fast ogt float [[TMP0]], 0.000000e+00
; CHECK: [[TMP2:%.*]] = icmp eq i1 [[TMP1]], false
; CHECK: br i1 [[TMP2]], label %[[EO_IF:[A-z0-9_]*]], label %[[EO_ELSE:[A-z0-9_]*]]
; CHECK; [[EO_ELSE]]:
; CHECK: [[TMP3:%.*]] = sext i1 [[TMP1]] to i32
; CHECK: [[TMP4:%.*]] = and i32 [[A]], [[TMP3]]
; CHECK: [[TMP5:%.*]] = and i32 [[B]], [[TMP3]]
; CHECK: [[TMP6:%.*]] = and i32 [[C]], [[TMP3]]
; CHECK: [[TMP7:%.*]] = bitcast i32 [[TMP4]] to float
; CHECK: [[TMP8:%.*]] = bitcast i32 [[TMP5]] to float
; CHECK: [[TMP9:%.*]] = bitcast i32 [[TMP6]] to float
; CHECK: [[TMP10:%.*]] = fmul fast float [[BT3]], [[TMP7]]
; CHECK: [[TMP11:%.*]] = fmul fast float [[BT2]], [[TMP8]]
; CHECK: [[TMP12:%.*]] = fmul fast float [[BT1]], [[TMP9]]
; CHECK: [[TMP13:%.*]] = call fast float @llvm.maxnum.f32(float [[TMP10]], float 0.000000e+00)
; CHECK: [[TMP14:%.*]] = call fast float @llvm.maxnum.f32(float [[TMP11]], float 0.000000e+00)
; CHECK: [[TMP15:%.*]] = call fast float @llvm.maxnum.f32(float [[TMP12]], float 0.000000e+00)
; CHECK: br label %[[EO_ENDIF:[A-z0-9_]*]]
; CHECK; [[EO_IF]]:
; CHECK: [[TMP16:%.*]] = sext i1 [[TMP1]] to i32
; CHECK: [[TMP17:%.*]] = and i32 [[A]], 0
; CHECK: [[TMP18:%.*]] = and i32 [[B]], 0
; CHECK: [[TMP19:%.*]] = and i32 [[C]], 0
; CHECK: [[TMP20:%.*]] = bitcast i32 0 to float
; CHECK: [[TMP21:%.*]] = bitcast i32 0 to float
; CHECK: [[TMP22:%.*]] = bitcast i32 0 to float
; CHECK: [[TMP23:%.*]] = fmul fast float [[BT3]], 0.000000e+00
; CHECK: [[TMP24:%.*]] = fmul fast float [[BT2]], 0.000000e+00
; CHECK: [[TMP25:%.*]] = fmul fast float [[BT1]], 0.000000e+00
; CHECK: [[TMP26:%.*]] = call fast float @llvm.maxnum.f32(float 0.000000e+00, float 0.000000e+00)
; CHECK: [[TMP27:%.*]] = call fast float @llvm.maxnum.f32(float 0.000000e+00, float 0.000000e+00)
; CHECK: [[TMP28:%.*]] = call fast float @llvm.maxnum.f32(float 0.000000e+00, float 0.000000e+00)
; CHECK: br label %[[EO_ENDIF]]
; CHECK: [[EO_ENDIF]]:
; CHECK: [[TMP29:%.*]] = phi float [ [[TMP15]], %[[EO_ELSE]] ], [ 0.000000e+00, %[[EO_IF]] ]
; CHECK: [[TMP30:%.*]] = phi float [ [[TMP14]], %[[EO_ELSE]] ], [ 0.000000e+00, %[[EO_IF]] ]
; CHECK: [[TMP31:%.*]] = phi float [ [[TMP13]], %[[EO_ELSE]] ], [ 0.000000e+00, %[[EO_IF]] ]
; CHECK: [[TMP32:%.*]] = fadd float [[TMP31]], [[TMP30]]
; CHECK: [[TMP33:%.*]] = fadd float [[TMP32]], [[TMP29]]
; CHECK: store float [[TMP33]], float* [[D:%.*]], align 4
; CHECK: ret void
;
entry:
%bt1 = uitofp i32 %a to float
%bt2 = uitofp i32 %b to float
%bt3 = uitofp i32 %c to float
%fmul1 = fmul float %bt1, %bt1
%fmul2 = fmul float %bt2, %bt2
%fmul3 = fmul float %bt3, %bt3
%fadd1 = fadd float %fmul2, %fmul3
%0 = fadd float %fmul1, %fadd1
%1 = fcmp fast ogt float %0, 0.000000e+00
%2 = sext i1 %1 to i32
%3 = and i32 %a, %2
%4 = and i32 %b, %2
%5 = and i32 %c, %2
%6 = bitcast i32 %3 to float
%7 = bitcast i32 %4 to float
%8 = bitcast i32 %5 to float
%9 = fmul fast float %bt3, %6
%10 = fmul fast float %bt2, %7
%11 = fmul fast float %bt1, %8
%12 = call fast float @llvm.maxnum.f32(float %9, float 0.000000e+00)
%13 = call fast float @llvm.maxnum.f32(float %10, float 0.000000e+00)
%14 = call fast float @llvm.maxnum.f32(float %11, float 0.000000e+00)
%15 = fadd float %12, %13
%16 = fadd float %15, %14
store float %16, float* %d, align 4
ret void
}
declare float @llvm.maxnum.f32(float, float)
|