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
|
;=========================== begin_copyright_notice ============================
;
; Copyright (C) 2022-2024 Intel Corporation
;
; SPDX-License-Identifier: MIT
;
;============================ end_copyright_notice =============================
; REQUIRES: llvm-14-plus
; RUN: igc_opt --opaque-pointers -igc-freeze-int-div-pass -S %s | FileCheck %s --check-prefixes=CHECK,%LLVM_DEPENDENT_CHECK_PREFIX%
; ------------------------------------------------
; FreezeIntDiv
; ------------------------------------------------
; CHECK-LABEL: @div_by_zero
define void @div_by_zero(i32 %idx) #0 {
entry:
%0 = udiv i32 %idx, 0
call void @foo(i32 %0)
; CHECK-PRE-LLVM-14: [[RESULT_UDIV:%[a-zA-Z0-9_.%-]+]] = udiv i32 %idx, 0
; CHECK-LLVM-14-PLUS: [[VALUE_UDIV:%[a-zA-Z0-9_.%-]+]] = udiv i32 %idx, 0
; CHECK-LLVM-14-PLUS: [[RESULT_UDIV:%[a-zA-Z0-9_.%-]+]] = freeze i32 [[VALUE_UDIV]]
; CHECK-NEXT: call void @foo(i32 [[RESULT_UDIV]])
%1 = urem i32 %idx, 0
call void @foo(i32 %1)
; CHECK-PRE-LLVM-14: [[RESULT_UREM:%[a-zA-Z0-9_.%-]+]] = urem i32 %idx, 0
; CHECK-LLVM-14-PLUS: [[VALUE_UREM:%[a-zA-Z0-9_.%-]+]] = urem i32 %idx, 0
; CHECK-LLVM-14-PLUS: [[RESULT_UREM:%[a-zA-Z0-9_.%-]+]] = freeze i32 [[VALUE_UREM]]
; CHECK-NEXT: call void @foo(i32 [[RESULT_UREM]])
%2 = sdiv i32 %idx, 0
call void @foo(i32 %2)
; CHECK-PRE-LLVM-14: [[RESULT_SDIV:%[a-zA-Z0-9_.%-]+]] = sdiv i32 %idx, 0
; CHECK-LLVM-14-PLUS: [[VALUE_SDIV:%[a-zA-Z0-9_.%-]+]] = sdiv i32 %idx, 0
; CHECK-LLVM-14-PLUS: [[RESULT_SDIV:%[a-zA-Z0-9_.%-]+]] = freeze i32 [[VALUE_SDIV]]
; CHECK-NEXT: call void @foo(i32 [[RESULT_SDIV]])
%3 = srem i32 %idx, 0
call void @foo(i32 %3)
; CHECK-PRE-LLVM-14: [[RESULT_SREM:%[a-zA-Z0-9_.%-]+]] = srem i32 %idx, 0
; CHECK-LLVM-14-PLUS: [[VALUE_SREM:%[a-zA-Z0-9_.%-]+]] = srem i32 %idx, 0
; CHECK-LLVM-14-PLUS: [[RESULT_SREM:%[a-zA-Z0-9_.%-]+]] = freeze i32 [[VALUE_SREM]]
; CHECK-NEXT: call void @foo(i32 [[RESULT_SREM]])
ret void
}
; CHECK-LABEL: @div_by_non_const
define void @div_by_non_const(i32 %idx, i32 %div_arg) #0 {
entry:
%0 = udiv i32 %idx, %div_arg
call void @foo(i32 %0)
; CHECK-PRE-LLVM-14: [[RESULT_UDIV:%[a-zA-Z0-9_.%-]+]] = udiv i32 %idx, %div_arg
; CHECK-LLVM-14-PLUS: [[VALUE_UDIV:%[a-zA-Z0-9_.%-]+]] = udiv i32 %idx, %div_arg
; CHECK-LLVM-14-PLUS: [[RESULT_UDIV:%[a-zA-Z0-9_.%-]+]] = freeze i32 [[VALUE_UDIV]]
; CHECK-NEXT: call void @foo(i32 [[RESULT_UDIV]])
%1 = urem i32 %idx, %div_arg
call void @foo(i32 %1)
; CHECK-PRE-LLVM-14: [[RESULT_UREM:%[a-zA-Z0-9_.%-]+]] = urem i32 %idx, %div_arg
; CHECK-LLVM-14-PLUS: [[VALUE_UREM:%[a-zA-Z0-9_.%-]+]] = urem i32 %idx, %div_arg
; CHECK-LLVM-14-PLUS: [[RESULT_UREM:%[a-zA-Z0-9_.%-]+]] = freeze i32 [[VALUE_UREM]]
; CHECK-NEXT: call void @foo(i32 [[RESULT_UREM]])
%2 = sdiv i32 %idx, %div_arg
call void @foo(i32 %2)
; CHECK-PRE-LLVM-14: [[RESULT_SDIV:%[a-zA-Z0-9_.%-]+]] = sdiv i32 %idx, %div_arg
; CHECK-LLVM-14-PLUS: [[VALUE_SDIV:%[a-zA-Z0-9_.%-]+]] = sdiv i32 %idx, %div_arg
; CHECK-LLVM-14-PLUS: [[RESULT_SDIV:%[a-zA-Z0-9_.%-]+]] = freeze i32 [[VALUE_SDIV]]
; CHECK-NEXT: call void @foo(i32 [[RESULT_SDIV]])
%3 = srem i32 %idx, %div_arg
call void @foo(i32 %3)
; CHECK-PRE-LLVM-14: [[RESULT_SREM:%[a-zA-Z0-9_.%-]+]] = srem i32 %idx, %div_arg
; CHECK-LLVM-14-PLUS: [[VALUE_SREM:%[a-zA-Z0-9_.%-]+]] = srem i32 %idx, %div_arg
; CHECK-LLVM-14-PLUS: [[RESULT_SREM:%[a-zA-Z0-9_.%-]+]] = freeze i32 [[VALUE_SREM]]
; CHECK-NEXT: call void @foo(i32 [[RESULT_SREM]])
ret void
}
; CHECK-LABEL: @div_by_const_non_zero
define void @div_by_const_non_zero(i32 %idx) #0 {
entry:
; CHECK-NOT: freeze
%0 = udiv i32 %idx, 1
call void @foo(i32 %0)
%1 = urem i32 %idx, 2
call void @foo(i32 %1)
%2 = sdiv i32 %idx, 3
call void @foo(i32 %2)
%3 = srem i32 %idx, 4
call void @foo(i32 %3)
ret void
}
; Function Attrs: noduplicate nounwind
declare void @foo(i32) #1
attributes #0 = { "null-pointer-is-valid"="true" }
attributes #1 = { noduplicate nounwind }
|