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 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233
|
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
;=========================== begin_copyright_notice ============================
;
; Copyright (C) 2024 Intel Corporation
;
; SPDX-License-Identifier: MIT
;
;============================ end_copyright_notice =============================
;
; RUN: igc_opt --igc-scalarize -S < %s | FileCheck %s
; ------------------------------------------------
; ScalarizeFunction
; ------------------------------------------------
; The pass should break vector operation into many scalar operations
; ------------------------------------------------
define <2 x i1> @basic(<2 x i32> %src1, <2 x i32> %src2) {
; CHECK-LABEL: define <2 x i1> @basic(
; CHECK-SAME: <2 x i32> [[SRC1:%.*]], <2 x i32> [[SRC2:%.*]]) {
; CHECK-NEXT: [[SRC2_SCALAR:%.*]] = extractelement <2 x i32> [[SRC2]], i32 0
; CHECK-NEXT: [[SRC2_SCALAR2:%.*]] = extractelement <2 x i32> [[SRC2]], i32 1
; CHECK-NEXT: [[SRC1_SCALAR:%.*]] = extractelement <2 x i32> [[SRC1]], i32 0
; CHECK-NEXT: [[SRC1_SCALAR1:%.*]] = extractelement <2 x i32> [[SRC1]], i32 1
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[SRC1_SCALAR]], [[SRC2_SCALAR]]
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[SRC1_SCALAR1]], [[SRC2_SCALAR2]]
; CHECK-NEXT: [[DOTASSEMBLED_VECT:%.*]] = insertelement <2 x i1> undef, i1 [[TMP1]], i32 0
; CHECK-NEXT: [[DOTASSEMBLED_VECT3:%.*]] = insertelement <2 x i1> [[DOTASSEMBLED_VECT]], i1 [[TMP2]], i32 1
; CHECK-NEXT: ret <2 x i1> [[DOTASSEMBLED_VECT3]]
;
%1 = icmp eq <2 x i32> %src1, %src2
ret <2 x i1> %1
}
define <2 x i1> @should_preserve_metadata(<2 x i32> %src1, <2 x i32> %src2) {
; CHECK-LABEL: define <2 x i1> @should_preserve_metadata(
; CHECK-SAME: <2 x i32> [[SRC1:%.*]], <2 x i32> [[SRC2:%.*]]) {
; CHECK-NEXT: [[SRC2_SCALAR:%.*]] = extractelement <2 x i32> [[SRC2]], i32 0
; CHECK-NEXT: [[SRC2_SCALAR2:%.*]] = extractelement <2 x i32> [[SRC2]], i32 1
; CHECK-NEXT: [[SRC1_SCALAR:%.*]] = extractelement <2 x i32> [[SRC1]], i32 0
; CHECK-NEXT: [[SRC1_SCALAR1:%.*]] = extractelement <2 x i32> [[SRC1]], i32 1
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[SRC1_SCALAR]], [[SRC2_SCALAR]], !any_metadata [[META0:![0-9]+]]
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[SRC1_SCALAR1]], [[SRC2_SCALAR2]], !any_metadata [[META0]]
; CHECK-NEXT: [[DOTASSEMBLED_VECT:%.*]] = insertelement <2 x i1> undef, i1 [[TMP1]], i32 0
; CHECK-NEXT: [[DOTASSEMBLED_VECT3:%.*]] = insertelement <2 x i1> [[DOTASSEMBLED_VECT]], i1 [[TMP2]], i32 1
; CHECK-NEXT: ret <2 x i1> [[DOTASSEMBLED_VECT3]]
;
%1 = icmp eq <2 x i32> %src1, %src2, !any_metadata !{i32 0}
ret <2 x i1> %1
}
define <2 x i1> @should_work_with_different_instruction_type(<2 x float> %src1, <2 x float> %src2) {
; CHECK-LABEL: define <2 x i1> @should_work_with_different_instruction_type(
; CHECK-SAME: <2 x float> [[SRC1:%.*]], <2 x float> [[SRC2:%.*]]) {
; CHECK-NEXT: [[SRC2_SCALAR:%.*]] = extractelement <2 x float> [[SRC2]], i32 0
; CHECK-NEXT: [[SRC2_SCALAR2:%.*]] = extractelement <2 x float> [[SRC2]], i32 1
; CHECK-NEXT: [[SRC1_SCALAR:%.*]] = extractelement <2 x float> [[SRC1]], i32 0
; CHECK-NEXT: [[SRC1_SCALAR1:%.*]] = extractelement <2 x float> [[SRC1]], i32 1
; CHECK-NEXT: [[TMP1:%.*]] = fcmp ueq float [[SRC1_SCALAR]], [[SRC2_SCALAR]]
; CHECK-NEXT: [[TMP2:%.*]] = fcmp ueq float [[SRC1_SCALAR1]], [[SRC2_SCALAR2]]
; CHECK-NEXT: [[DOTASSEMBLED_VECT:%.*]] = insertelement <2 x i1> undef, i1 [[TMP1]], i32 0
; CHECK-NEXT: [[DOTASSEMBLED_VECT3:%.*]] = insertelement <2 x i1> [[DOTASSEMBLED_VECT]], i1 [[TMP2]], i32 1
; CHECK-NEXT: ret <2 x i1> [[DOTASSEMBLED_VECT3]]
;
%1 = fcmp ueq <2 x float> %src1, %src2
ret <2 x i1> %1
}
define <2 x i1> @should_work_with_fast_math_flags(<2 x float> %src1, <2 x float> %src2) {
; CHECK-LABEL: define <2 x i1> @should_work_with_fast_math_flags(
; CHECK-SAME: <2 x float> [[SRC1:%.*]], <2 x float> [[SRC2:%.*]]) {
; CHECK-NEXT: [[SRC2_SCALAR:%.*]] = extractelement <2 x float> [[SRC2]], i32 0
; CHECK-NEXT: [[SRC2_SCALAR2:%.*]] = extractelement <2 x float> [[SRC2]], i32 1
; CHECK-NEXT: [[SRC1_SCALAR:%.*]] = extractelement <2 x float> [[SRC1]], i32 0
; CHECK-NEXT: [[SRC1_SCALAR1:%.*]] = extractelement <2 x float> [[SRC1]], i32 1
; CHECK-NEXT: [[TMP1:%.*]] = fcmp fast ueq float [[SRC1_SCALAR]], [[SRC2_SCALAR]]
; CHECK-NEXT: [[TMP2:%.*]] = fcmp fast ueq float [[SRC1_SCALAR1]], [[SRC2_SCALAR2]]
; CHECK-NEXT: [[DOTASSEMBLED_VECT:%.*]] = insertelement <2 x i1> undef, i1 [[TMP1]], i32 0
; CHECK-NEXT: [[DOTASSEMBLED_VECT3:%.*]] = insertelement <2 x i1> [[DOTASSEMBLED_VECT]], i1 [[TMP2]], i32 1
; CHECK-NEXT: ret <2 x i1> [[DOTASSEMBLED_VECT3]]
;
%1 = fcmp fast ueq <2 x float> %src1, %src2
ret <2 x i1> %1
}
define <2 x i1> @should_work_with_different_value_type(<2 x i64> %src1, <2 x i64> %src2) {
; CHECK-LABEL: define <2 x i1> @should_work_with_different_value_type(
; CHECK-SAME: <2 x i64> [[SRC1:%.*]], <2 x i64> [[SRC2:%.*]]) {
; CHECK-NEXT: [[SRC2_SCALAR:%.*]] = extractelement <2 x i64> [[SRC2]], i32 0
; CHECK-NEXT: [[SRC2_SCALAR2:%.*]] = extractelement <2 x i64> [[SRC2]], i32 1
; CHECK-NEXT: [[SRC1_SCALAR:%.*]] = extractelement <2 x i64> [[SRC1]], i32 0
; CHECK-NEXT: [[SRC1_SCALAR1:%.*]] = extractelement <2 x i64> [[SRC1]], i32 1
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[SRC1_SCALAR]], [[SRC2_SCALAR]]
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[SRC1_SCALAR1]], [[SRC2_SCALAR2]]
; CHECK-NEXT: [[DOTASSEMBLED_VECT:%.*]] = insertelement <2 x i1> undef, i1 [[TMP1]], i32 0
; CHECK-NEXT: [[DOTASSEMBLED_VECT3:%.*]] = insertelement <2 x i1> [[DOTASSEMBLED_VECT]], i1 [[TMP2]], i32 1
; CHECK-NEXT: ret <2 x i1> [[DOTASSEMBLED_VECT3]]
;
%1 = icmp eq <2 x i64> %src1, %src2
ret <2 x i1> %1
}
define <16 x i1> @should_work_with_larger_vector_size(<16 x i32> %src1, <16 x i32> %src2) {
; CHECK-LABEL: define <16 x i1> @should_work_with_larger_vector_size(
; CHECK-SAME: <16 x i32> [[SRC1:%.*]], <16 x i32> [[SRC2:%.*]]) {
; CHECK-NEXT: [[SRC2_SCALAR:%.*]] = extractelement <16 x i32> [[SRC2]], i32 0
; CHECK-NEXT: [[SRC2_SCALAR16:%.*]] = extractelement <16 x i32> [[SRC2]], i32 1
; CHECK-NEXT: [[SRC2_SCALAR17:%.*]] = extractelement <16 x i32> [[SRC2]], i32 2
; CHECK-NEXT: [[SRC2_SCALAR18:%.*]] = extractelement <16 x i32> [[SRC2]], i32 3
; CHECK-NEXT: [[SRC2_SCALAR19:%.*]] = extractelement <16 x i32> [[SRC2]], i32 4
; CHECK-NEXT: [[SRC2_SCALAR20:%.*]] = extractelement <16 x i32> [[SRC2]], i32 5
; CHECK-NEXT: [[SRC2_SCALAR21:%.*]] = extractelement <16 x i32> [[SRC2]], i32 6
; CHECK-NEXT: [[SRC2_SCALAR22:%.*]] = extractelement <16 x i32> [[SRC2]], i32 7
; CHECK-NEXT: [[SRC2_SCALAR23:%.*]] = extractelement <16 x i32> [[SRC2]], i32 8
; CHECK-NEXT: [[SRC2_SCALAR24:%.*]] = extractelement <16 x i32> [[SRC2]], i32 9
; CHECK-NEXT: [[SRC2_SCALAR25:%.*]] = extractelement <16 x i32> [[SRC2]], i32 10
; CHECK-NEXT: [[SRC2_SCALAR26:%.*]] = extractelement <16 x i32> [[SRC2]], i32 11
; CHECK-NEXT: [[SRC2_SCALAR27:%.*]] = extractelement <16 x i32> [[SRC2]], i32 12
; CHECK-NEXT: [[SRC2_SCALAR28:%.*]] = extractelement <16 x i32> [[SRC2]], i32 13
; CHECK-NEXT: [[SRC2_SCALAR29:%.*]] = extractelement <16 x i32> [[SRC2]], i32 14
; CHECK-NEXT: [[SRC2_SCALAR30:%.*]] = extractelement <16 x i32> [[SRC2]], i32 15
; CHECK-NEXT: [[SRC1_SCALAR:%.*]] = extractelement <16 x i32> [[SRC1]], i32 0
; CHECK-NEXT: [[SRC1_SCALAR1:%.*]] = extractelement <16 x i32> [[SRC1]], i32 1
; CHECK-NEXT: [[SRC1_SCALAR2:%.*]] = extractelement <16 x i32> [[SRC1]], i32 2
; CHECK-NEXT: [[SRC1_SCALAR3:%.*]] = extractelement <16 x i32> [[SRC1]], i32 3
; CHECK-NEXT: [[SRC1_SCALAR4:%.*]] = extractelement <16 x i32> [[SRC1]], i32 4
; CHECK-NEXT: [[SRC1_SCALAR5:%.*]] = extractelement <16 x i32> [[SRC1]], i32 5
; CHECK-NEXT: [[SRC1_SCALAR6:%.*]] = extractelement <16 x i32> [[SRC1]], i32 6
; CHECK-NEXT: [[SRC1_SCALAR7:%.*]] = extractelement <16 x i32> [[SRC1]], i32 7
; CHECK-NEXT: [[SRC1_SCALAR8:%.*]] = extractelement <16 x i32> [[SRC1]], i32 8
; CHECK-NEXT: [[SRC1_SCALAR9:%.*]] = extractelement <16 x i32> [[SRC1]], i32 9
; CHECK-NEXT: [[SRC1_SCALAR10:%.*]] = extractelement <16 x i32> [[SRC1]], i32 10
; CHECK-NEXT: [[SRC1_SCALAR11:%.*]] = extractelement <16 x i32> [[SRC1]], i32 11
; CHECK-NEXT: [[SRC1_SCALAR12:%.*]] = extractelement <16 x i32> [[SRC1]], i32 12
; CHECK-NEXT: [[SRC1_SCALAR13:%.*]] = extractelement <16 x i32> [[SRC1]], i32 13
; CHECK-NEXT: [[SRC1_SCALAR14:%.*]] = extractelement <16 x i32> [[SRC1]], i32 14
; CHECK-NEXT: [[SRC1_SCALAR15:%.*]] = extractelement <16 x i32> [[SRC1]], i32 15
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[SRC1_SCALAR]], [[SRC2_SCALAR]]
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[SRC1_SCALAR1]], [[SRC2_SCALAR16]]
; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i32 [[SRC1_SCALAR2]], [[SRC2_SCALAR17]]
; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i32 [[SRC1_SCALAR3]], [[SRC2_SCALAR18]]
; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i32 [[SRC1_SCALAR4]], [[SRC2_SCALAR19]]
; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i32 [[SRC1_SCALAR5]], [[SRC2_SCALAR20]]
; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i32 [[SRC1_SCALAR6]], [[SRC2_SCALAR21]]
; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i32 [[SRC1_SCALAR7]], [[SRC2_SCALAR22]]
; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i32 [[SRC1_SCALAR8]], [[SRC2_SCALAR23]]
; CHECK-NEXT: [[TMP10:%.*]] = icmp eq i32 [[SRC1_SCALAR9]], [[SRC2_SCALAR24]]
; CHECK-NEXT: [[TMP11:%.*]] = icmp eq i32 [[SRC1_SCALAR10]], [[SRC2_SCALAR25]]
; CHECK-NEXT: [[TMP12:%.*]] = icmp eq i32 [[SRC1_SCALAR11]], [[SRC2_SCALAR26]]
; CHECK-NEXT: [[TMP13:%.*]] = icmp eq i32 [[SRC1_SCALAR12]], [[SRC2_SCALAR27]]
; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i32 [[SRC1_SCALAR13]], [[SRC2_SCALAR28]]
; CHECK-NEXT: [[TMP15:%.*]] = icmp eq i32 [[SRC1_SCALAR14]], [[SRC2_SCALAR29]]
; CHECK-NEXT: [[TMP16:%.*]] = icmp eq i32 [[SRC1_SCALAR15]], [[SRC2_SCALAR30]]
; CHECK-NEXT: [[DOTASSEMBLED_VECT:%.*]] = insertelement <16 x i1> undef, i1 [[TMP1]], i32 0
; CHECK-NEXT: [[DOTASSEMBLED_VECT31:%.*]] = insertelement <16 x i1> [[DOTASSEMBLED_VECT]], i1 [[TMP2]], i32 1
; CHECK-NEXT: [[DOTASSEMBLED_VECT32:%.*]] = insertelement <16 x i1> [[DOTASSEMBLED_VECT31]], i1 [[TMP3]], i32 2
; CHECK-NEXT: [[DOTASSEMBLED_VECT33:%.*]] = insertelement <16 x i1> [[DOTASSEMBLED_VECT32]], i1 [[TMP4]], i32 3
; CHECK-NEXT: [[DOTASSEMBLED_VECT34:%.*]] = insertelement <16 x i1> [[DOTASSEMBLED_VECT33]], i1 [[TMP5]], i32 4
; CHECK-NEXT: [[DOTASSEMBLED_VECT35:%.*]] = insertelement <16 x i1> [[DOTASSEMBLED_VECT34]], i1 [[TMP6]], i32 5
; CHECK-NEXT: [[DOTASSEMBLED_VECT36:%.*]] = insertelement <16 x i1> [[DOTASSEMBLED_VECT35]], i1 [[TMP7]], i32 6
; CHECK-NEXT: [[DOTASSEMBLED_VECT37:%.*]] = insertelement <16 x i1> [[DOTASSEMBLED_VECT36]], i1 [[TMP8]], i32 7
; CHECK-NEXT: [[DOTASSEMBLED_VECT38:%.*]] = insertelement <16 x i1> [[DOTASSEMBLED_VECT37]], i1 [[TMP9]], i32 8
; CHECK-NEXT: [[DOTASSEMBLED_VECT39:%.*]] = insertelement <16 x i1> [[DOTASSEMBLED_VECT38]], i1 [[TMP10]], i32 9
; CHECK-NEXT: [[DOTASSEMBLED_VECT40:%.*]] = insertelement <16 x i1> [[DOTASSEMBLED_VECT39]], i1 [[TMP11]], i32 10
; CHECK-NEXT: [[DOTASSEMBLED_VECT41:%.*]] = insertelement <16 x i1> [[DOTASSEMBLED_VECT40]], i1 [[TMP12]], i32 11
; CHECK-NEXT: [[DOTASSEMBLED_VECT42:%.*]] = insertelement <16 x i1> [[DOTASSEMBLED_VECT41]], i1 [[TMP13]], i32 12
; CHECK-NEXT: [[DOTASSEMBLED_VECT43:%.*]] = insertelement <16 x i1> [[DOTASSEMBLED_VECT42]], i1 [[TMP14]], i32 13
; CHECK-NEXT: [[DOTASSEMBLED_VECT44:%.*]] = insertelement <16 x i1> [[DOTASSEMBLED_VECT43]], i1 [[TMP15]], i32 14
; CHECK-NEXT: [[DOTASSEMBLED_VECT45:%.*]] = insertelement <16 x i1> [[DOTASSEMBLED_VECT44]], i1 [[TMP16]], i32 15
; CHECK-NEXT: ret <16 x i1> [[DOTASSEMBLED_VECT45]]
;
%1 = icmp eq <16 x i32> %src1, %src2
ret <16 x i1> %1
}
define <2 x i1> @should_work_with_constant_value(<2 x i32> %src1) {
; CHECK-LABEL: define <2 x i1> @should_work_with_constant_value(
; CHECK-SAME: <2 x i32> [[SRC1:%.*]]) {
; CHECK-NEXT: [[SRC1_SCALAR:%.*]] = extractelement <2 x i32> [[SRC1]], i32 0
; CHECK-NEXT: [[SRC1_SCALAR1:%.*]] = extractelement <2 x i32> [[SRC1]], i32 1
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[SRC1_SCALAR]], 4
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[SRC1_SCALAR1]], 8
; CHECK-NEXT: [[DOTASSEMBLED_VECT:%.*]] = insertelement <2 x i1> undef, i1 [[TMP1]], i32 0
; CHECK-NEXT: [[DOTASSEMBLED_VECT2:%.*]] = insertelement <2 x i1> [[DOTASSEMBLED_VECT]], i1 [[TMP2]], i32 1
; CHECK-NEXT: ret <2 x i1> [[DOTASSEMBLED_VECT2]]
;
%1 = icmp eq <2 x i32> %src1, <i32 4, i32 8>
ret <2 x i1> %1
}
define <2 x i1> @should_work_with_different_coparison_type(<2 x i32> %src1, <2 x i32> %src2) {
; CHECK-LABEL: define <2 x i1> @should_work_with_different_coparison_type(
; CHECK-SAME: <2 x i32> [[SRC1:%.*]], <2 x i32> [[SRC2:%.*]]) {
; CHECK-NEXT: [[SRC2_SCALAR:%.*]] = extractelement <2 x i32> [[SRC2]], i32 0
; CHECK-NEXT: [[SRC2_SCALAR2:%.*]] = extractelement <2 x i32> [[SRC2]], i32 1
; CHECK-NEXT: [[SRC1_SCALAR:%.*]] = extractelement <2 x i32> [[SRC1]], i32 0
; CHECK-NEXT: [[SRC1_SCALAR1:%.*]] = extractelement <2 x i32> [[SRC1]], i32 1
; CHECK-NEXT: [[TMP1:%.*]] = icmp uge i32 [[SRC1_SCALAR]], [[SRC2_SCALAR]]
; CHECK-NEXT: [[TMP2:%.*]] = icmp uge i32 [[SRC1_SCALAR1]], [[SRC2_SCALAR2]]
; CHECK-NEXT: [[DOTASSEMBLED_VECT:%.*]] = insertelement <2 x i1> undef, i1 [[TMP1]], i32 0
; CHECK-NEXT: [[DOTASSEMBLED_VECT3:%.*]] = insertelement <2 x i1> [[DOTASSEMBLED_VECT]], i1 [[TMP2]], i32 1
; CHECK-NEXT: ret <2 x i1> [[DOTASSEMBLED_VECT3]]
;
%1 = icmp uge <2 x i32> %src1, %src2
ret <2 x i1> %1
}
define <2 x i1> @should_work_with_different_coparison_type_2(<2 x float> %src1, <2 x float> %src2) {
; CHECK-LABEL: define <2 x i1> @should_work_with_different_coparison_type_2(
; CHECK-SAME: <2 x float> [[SRC1:%.*]], <2 x float> [[SRC2:%.*]]) {
; CHECK-NEXT: [[SRC2_SCALAR:%.*]] = extractelement <2 x float> [[SRC2]], i32 0
; CHECK-NEXT: [[SRC2_SCALAR2:%.*]] = extractelement <2 x float> [[SRC2]], i32 1
; CHECK-NEXT: [[SRC1_SCALAR:%.*]] = extractelement <2 x float> [[SRC1]], i32 0
; CHECK-NEXT: [[SRC1_SCALAR1:%.*]] = extractelement <2 x float> [[SRC1]], i32 1
; CHECK-NEXT: [[TMP1:%.*]] = fcmp false float [[SRC1_SCALAR]], [[SRC2_SCALAR]]
; CHECK-NEXT: [[TMP2:%.*]] = fcmp false float [[SRC1_SCALAR1]], [[SRC2_SCALAR2]]
; CHECK-NEXT: [[DOTASSEMBLED_VECT:%.*]] = insertelement <2 x i1> undef, i1 [[TMP1]], i32 0
; CHECK-NEXT: [[DOTASSEMBLED_VECT3:%.*]] = insertelement <2 x i1> [[DOTASSEMBLED_VECT]], i1 [[TMP2]], i32 1
; CHECK-NEXT: ret <2 x i1> [[DOTASSEMBLED_VECT3]]
;
%1 = fcmp false <2 x float> %src1, %src2
ret <2 x i1> %1
}
define <2 x i1> @should_not_scalarize_two_constants() {
; CHECK-LABEL: define <2 x i1> @should_not_scalarize_two_constants() {
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq <2 x i32> <i32 4, i32 4>, <i32 4, i32 8>
; CHECK-NEXT: ret <2 x i1> [[TMP1]]
;
%1 = icmp eq <2 x i32> <i32 4, i32 4>, <i32 4, i32 8>
ret <2 x i1> %1
}
; CHECK: [[META0]] = !{i32 0}
|