1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -passes=instsimplify < %s | FileCheck %s 3 4define i1 @f16_si_max1(half %f) { 5; CHECK-LABEL: @f16_si_max1( 6; CHECK-NEXT: [[I:%.*]] = fptosi half [[F:%.*]] to i32 7; CHECK-NEXT: [[C:%.*]] = icmp sge i32 [[I]], 65504 8; CHECK-NEXT: ret i1 [[C]] 9; 10 %i = fptosi half %f to i32 11 %c = icmp sge i32 %i, 65504 12 ret i1 %c 13} 14 15define i1 @f16_si_max2(half %f) { 16; CHECK-LABEL: @f16_si_max2( 17; CHECK-NEXT: ret i1 false 18; 19 %i = fptosi half %f to i32 20 %c = icmp sgt i32 %i, 65504 21 ret i1 %c 22} 23 24define i1 @f16_si16_max2(half %f) { 25; CHECK-LABEL: @f16_si16_max2( 26; CHECK-NEXT: [[I:%.*]] = fptosi half [[F:%.*]] to i16 27; CHECK-NEXT: [[C:%.*]] = icmp sgt i16 [[I]], -32 28; CHECK-NEXT: ret i1 [[C]] 29; 30 %i = fptosi half %f to i16 31 %c = icmp sgt i16 %i, 65504 32 ret i1 %c 33} 34 35define i1 @f16_si128_max2(half %f) { 36; CHECK-LABEL: @f16_si128_max2( 37; CHECK-NEXT: ret i1 false 38; 39 %i = fptosi half %f to i128 40 %c = icmp sgt i128 %i, 65504 41 ret i1 %c 42} 43 44define i1 @f16_si_min1(half %f) { 45; CHECK-LABEL: @f16_si_min1( 46; CHECK-NEXT: ret i1 true 47; 48 %i = fptosi half %f to i32 49 %c = icmp sge i32 %i, -65504 50 ret i1 %c 51} 52 53define i1 @f16_si128_min1(half %f) { 54; CHECK-LABEL: @f16_si128_min1( 55; CHECK-NEXT: ret i1 true 56; 57 %i = fptosi half %f to i128 58 %c = icmp sge i128 %i, -65504 59 ret i1 %c 60} 61 62define i1 @f16_si16_min1(half %f) { 63; CHECK-LABEL: @f16_si16_min1( 64; CHECK-NEXT: [[I:%.*]] = fptosi half [[F:%.*]] to i16 65; CHECK-NEXT: [[C:%.*]] = icmp sge i16 [[I]], 32 66; CHECK-NEXT: ret i1 [[C]] 67; 68 %i = fptosi half %f to i16 69 %c = icmp sge i16 %i, -65504 70 ret i1 %c 71} 72 73define i1 @f16_si_min2(half %f) { 74; CHECK-LABEL: @f16_si_min2( 75; CHECK-NEXT: [[I:%.*]] = fptosi half [[F:%.*]] to i32 76; CHECK-NEXT: [[C:%.*]] = icmp sgt i32 [[I]], -65504 77; CHECK-NEXT: ret i1 [[C]] 78; 79 %i = fptosi half %f to i32 80 %c = icmp sgt i32 %i, -65504 81 ret i1 %c 82} 83 84define i1 @f16_ui_max1(half %f) { 85; CHECK-LABEL: @f16_ui_max1( 86; CHECK-NEXT: [[I:%.*]] = fptoui half [[F:%.*]] to i32 87; CHECK-NEXT: [[C:%.*]] = icmp sge i32 [[I]], 65504 88; CHECK-NEXT: ret i1 [[C]] 89; 90 %i = fptoui half %f to i32 91 %c = icmp sge i32 %i, 65504 92 ret i1 %c 93} 94 95define i1 @f16_ui_max2(half %f) { 96; CHECK-LABEL: @f16_ui_max2( 97; CHECK-NEXT: ret i1 false 98; 99 %i = fptoui half %f to i32 100 %c = icmp sgt i32 %i, 65504 101 ret i1 %c 102} 103 104define i1 @f16_ui16_max2(half %f) { 105; CHECK-LABEL: @f16_ui16_max2( 106; CHECK-NEXT: [[I:%.*]] = fptoui half [[F:%.*]] to i16 107; CHECK-NEXT: [[C:%.*]] = icmp sgt i16 [[I]], -32 108; CHECK-NEXT: ret i1 [[C]] 109; 110 %i = fptoui half %f to i16 111 %c = icmp sgt i16 %i, 65504 112 ret i1 %c 113} 114 115define i1 @f16_ui16_max3(half %f) { 116; CHECK-LABEL: @f16_ui16_max3( 117; CHECK-NEXT: ret i1 true 118; 119 %i = fptoui half %f to i16 120 %c = icmp ule i16 %i, 65504 121 ret i1 %c 122} 123 124define i1 @f16_ui_min1(half %f) { 125; CHECK-LABEL: @f16_ui_min1( 126; CHECK-NEXT: ret i1 true 127; 128 %i = fptoui half %f to i32 129 %c = icmp sge i32 %i, 0 130 ret i1 %c 131} 132 133define i1 @f16_ui16_min1(half %f) { 134; CHECK-LABEL: @f16_ui16_min1( 135; CHECK-NEXT: [[I:%.*]] = fptoui half [[F:%.*]] to i16 136; CHECK-NEXT: [[C:%.*]] = icmp sge i16 [[I]], 0 137; CHECK-NEXT: ret i1 [[C]] 138; 139 %i = fptoui half %f to i16 140 %c = icmp sge i16 %i, 0 141 ret i1 %c 142} 143 144define i1 @f16_ui_min2(half %f) { 145; CHECK-LABEL: @f16_ui_min2( 146; CHECK-NEXT: [[I:%.*]] = fptoui half [[F:%.*]] to i32 147; CHECK-NEXT: [[C:%.*]] = icmp sgt i32 [[I]], 0 148; CHECK-NEXT: ret i1 [[C]] 149; 150 %i = fptoui half %f to i32 151 %c = icmp sgt i32 %i, 0 152 ret i1 %c 153} 154 155 156 157define <2 x i1> @v2f16_si_max(<2 x half> %f) { 158; CHECK-LABEL: @v2f16_si_max( 159; CHECK-NEXT: [[I:%.*]] = fptosi <2 x half> [[F:%.*]] to <2 x i32> 160; CHECK-NEXT: [[C:%.*]] = icmp sge <2 x i32> [[I]], splat (i32 65504) 161; CHECK-NEXT: ret <2 x i1> [[C]] 162; 163 %i = fptosi <2 x half> %f to <2 x i32> 164 %c = icmp sge <2 x i32> %i, <i32 65504, i32 65504> 165 ret <2 x i1> %c 166} 167 168define <2 x i1> @v2f16_si_max2(<2 x half> %f) { 169; CHECK-LABEL: @v2f16_si_max2( 170; CHECK-NEXT: ret <2 x i1> zeroinitializer 171; 172 %i = fptosi <2 x half> %f to <2 x i32> 173 %c = icmp sgt <2 x i32> %i, <i32 65504, i32 65504> 174 ret <2 x i1> %c 175} 176 177define <2 x i1> @v2f16_si16_max2(<2 x half> %f) { 178; CHECK-LABEL: @v2f16_si16_max2( 179; CHECK-NEXT: [[I:%.*]] = fptosi <2 x half> [[F:%.*]] to <2 x i16> 180; CHECK-NEXT: [[C:%.*]] = icmp sgt <2 x i16> [[I]], splat (i16 -32) 181; CHECK-NEXT: ret <2 x i1> [[C]] 182; 183 %i = fptosi <2 x half> %f to <2 x i16> 184 %c = icmp sgt <2 x i16> %i, <i16 65504, i16 65504> 185 ret <2 x i1> %c 186} 187 188define <2 x i1> @v2f16_si_min1(<2 x half> %f) { 189; CHECK-LABEL: @v2f16_si_min1( 190; CHECK-NEXT: ret <2 x i1> splat (i1 true) 191; 192 %i = fptosi <2 x half> %f to <2 x i32> 193 %c = icmp sge <2 x i32> %i, <i32 -65504, i32 -65504> 194 ret <2 x i1> %c 195} 196 197define <2 x i1> @v2f16_si16_min1(<2 x half> %f) { 198; CHECK-LABEL: @v2f16_si16_min1( 199; CHECK-NEXT: [[I:%.*]] = fptosi <2 x half> [[F:%.*]] to <2 x i16> 200; CHECK-NEXT: [[C:%.*]] = icmp sge <2 x i16> [[I]], splat (i16 32) 201; CHECK-NEXT: ret <2 x i1> [[C]] 202; 203 %i = fptosi <2 x half> %f to <2 x i16> 204 %c = icmp sge <2 x i16> %i, <i16 -65504, i16 -65504> 205 ret <2 x i1> %c 206} 207 208define <2 x i1> @v2f16_si_min2(<2 x half> %f) { 209; CHECK-LABEL: @v2f16_si_min2( 210; CHECK-NEXT: [[I:%.*]] = fptosi <2 x half> [[F:%.*]] to <2 x i32> 211; CHECK-NEXT: [[C:%.*]] = icmp sgt <2 x i32> [[I]], splat (i32 -65504) 212; CHECK-NEXT: ret <2 x i1> [[C]] 213; 214 %i = fptosi <2 x half> %f to <2 x i32> 215 %c = icmp sgt <2 x i32> %i, <i32 -65504, i32 -65504> 216 ret <2 x i1> %c 217} 218 219define <2 x i1> @v2f16_ui_max1(<2 x half> %f) { 220; CHECK-LABEL: @v2f16_ui_max1( 221; CHECK-NEXT: [[I:%.*]] = fptoui <2 x half> [[F:%.*]] to <2 x i32> 222; CHECK-NEXT: [[C:%.*]] = icmp sge <2 x i32> [[I]], splat (i32 65504) 223; CHECK-NEXT: ret <2 x i1> [[C]] 224; 225 %i = fptoui <2 x half> %f to <2 x i32> 226 %c = icmp sge <2 x i32> %i, <i32 65504, i32 65504> 227 ret <2 x i1> %c 228} 229 230define <2 x i1> @v2f16_ui_max2(<2 x half> %f) { 231; CHECK-LABEL: @v2f16_ui_max2( 232; CHECK-NEXT: ret <2 x i1> zeroinitializer 233; 234 %i = fptoui <2 x half> %f to <2 x i32> 235 %c = icmp sgt <2 x i32> %i, <i32 65504, i32 65504> 236 ret <2 x i1> %c 237} 238 239define <2 x i1> @v2f16_ui16_max2(<2 x half> %f) { 240; CHECK-LABEL: @v2f16_ui16_max2( 241; CHECK-NEXT: [[I:%.*]] = fptoui <2 x half> [[F:%.*]] to <2 x i16> 242; CHECK-NEXT: [[C:%.*]] = icmp sgt <2 x i16> [[I]], splat (i16 -32) 243; CHECK-NEXT: ret <2 x i1> [[C]] 244; 245 %i = fptoui <2 x half> %f to <2 x i16> 246 %c = icmp sgt <2 x i16> %i, <i16 65504, i16 65504> 247 ret <2 x i1> %c 248} 249 250define <2 x i1> @v2f16_ui16_max3(<2 x half> %f) { 251; CHECK-LABEL: @v2f16_ui16_max3( 252; CHECK-NEXT: ret <2 x i1> splat (i1 true) 253; 254 %i = fptoui <2 x half> %f to <2 x i16> 255 %c = icmp ule <2 x i16> %i, <i16 65504, i16 65504> 256 ret <2 x i1> %c 257} 258 259define <2 x i1> @v2f16_ui_min1(<2 x half> %f) { 260; CHECK-LABEL: @v2f16_ui_min1( 261; CHECK-NEXT: ret <2 x i1> splat (i1 true) 262; 263 %i = fptoui <2 x half> %f to <2 x i32> 264 %c = icmp sge <2 x i32> %i, <i32 0, i32 0> 265 ret <2 x i1> %c 266} 267 268define <2 x i1> @v2f16_ui16_min1(<2 x half> %f) { 269; CHECK-LABEL: @v2f16_ui16_min1( 270; CHECK-NEXT: [[I:%.*]] = fptoui <2 x half> [[F:%.*]] to <2 x i16> 271; CHECK-NEXT: [[C:%.*]] = icmp sge <2 x i16> [[I]], zeroinitializer 272; CHECK-NEXT: ret <2 x i1> [[C]] 273; 274 %i = fptoui <2 x half> %f to <2 x i16> 275 %c = icmp sge <2 x i16> %i, <i16 0, i16 0> 276 ret <2 x i1> %c 277} 278 279define <2 x i1> @v2f16_ui_min2(<2 x half> %f) { 280; CHECK-LABEL: @v2f16_ui_min2( 281; CHECK-NEXT: [[I:%.*]] = fptoui <2 x half> [[F:%.*]] to <2 x i32> 282; CHECK-NEXT: [[C:%.*]] = icmp sgt <2 x i32> [[I]], zeroinitializer 283; CHECK-NEXT: ret <2 x i1> [[C]] 284; 285 %i = fptoui <2 x half> %f to <2 x i32> 286 %c = icmp sgt <2 x i32> %i, <i32 0, i32 0> 287 ret <2 x i1> %c 288} 289 290declare i32 @llvm.fptosi.sat.i32.f16(half) 291declare i32 @llvm.fptoui.sat.i32.f16(half) 292declare <2 x i32> @llvm.fptosi.sat.v2i32.v2f16(<2 x half>) 293declare <2 x i32> @llvm.fptoui.sat.v2i32.v2f16(<2 x half>) 294