187 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=aggressive-instcombine -mtriple x86_64-none-eabi -mattr=avx2 -S | FileCheck %s3 4define i64 @f32_i32(float %in) {5; CHECK-LABEL: @f32_i32(6; CHECK-NEXT: [[CONV:%.*]] = fptosi float [[IN:%.*]] to i647; CHECK-NEXT: [[MIN:%.*]] = call i64 @llvm.smin.i64(i64 [[CONV]], i64 2147483647)8; CHECK-NEXT: [[MAX:%.*]] = call i64 @llvm.smax.i64(i64 [[MIN]], i64 -2147483648)9; CHECK-NEXT: ret i64 [[MAX]]10;11 %conv = fptosi float %in to i6412 %min = call i64 @llvm.smin.i64(i64 %conv, i64 2147483647)13 %max = call i64 @llvm.smax.i64(i64 %min, i64 -2147483648)14 ret i64 %max15}16 17define i64 @f32_i31(float %in) {18; CHECK-LABEL: @f32_i31(19; CHECK-NEXT: [[CONV:%.*]] = fptosi float [[IN:%.*]] to i6420; CHECK-NEXT: [[MIN:%.*]] = call i64 @llvm.smin.i64(i64 [[CONV]], i64 1073741823)21; CHECK-NEXT: [[MAX:%.*]] = call i64 @llvm.smax.i64(i64 [[MIN]], i64 -1073741824)22; CHECK-NEXT: ret i64 [[MAX]]23;24 %conv = fptosi float %in to i6425 %min = call i64 @llvm.smin.i64(i64 %conv, i64 1073741823)26 %max = call i64 @llvm.smax.i64(i64 %min, i64 -1073741824)27 ret i64 %max28}29 30define i32 @f32_i16(float %in) {31; CHECK-LABEL: @f32_i16(32; CHECK-NEXT: [[CONV:%.*]] = fptosi float [[IN:%.*]] to i3233; CHECK-NEXT: [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[CONV]], i32 32767)34; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[MIN]], i32 -32768)35; CHECK-NEXT: ret i32 [[MAX]]36;37 %conv = fptosi float %in to i3238 %min = call i32 @llvm.smin.i32(i32 %conv, i32 32767)39 %max = call i32 @llvm.smax.i32(i32 %min, i32 -32768)40 ret i32 %max41}42 43define i32 @f32_i8(float %in) {44; CHECK-LABEL: @f32_i8(45; CHECK-NEXT: [[CONV:%.*]] = fptosi float [[IN:%.*]] to i3246; CHECK-NEXT: [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[CONV]], i32 127)47; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[MIN]], i32 -128)48; CHECK-NEXT: ret i32 [[MAX]]49;50 %conv = fptosi float %in to i3251 %min = call i32 @llvm.smin.i32(i32 %conv, i32 127)52 %max = call i32 @llvm.smax.i32(i32 %min, i32 -128)53 ret i32 %max54}55 56define i64 @f64_i32(double %in) {57; CHECK-LABEL: @f64_i32(58; CHECK-NEXT: [[CONV:%.*]] = fptosi double [[IN:%.*]] to i6459; CHECK-NEXT: [[MIN:%.*]] = call i64 @llvm.smin.i64(i64 [[CONV]], i64 2147483647)60; CHECK-NEXT: [[MAX:%.*]] = call i64 @llvm.smax.i64(i64 [[MIN]], i64 -2147483648)61; CHECK-NEXT: ret i64 [[MAX]]62;63 %conv = fptosi double %in to i6464 %min = call i64 @llvm.smin.i64(i64 %conv, i64 2147483647)65 %max = call i64 @llvm.smax.i64(i64 %min, i64 -2147483648)66 ret i64 %max67}68 69define i64 @f64_i31(double %in) {70; CHECK-LABEL: @f64_i31(71; CHECK-NEXT: [[CONV:%.*]] = fptosi double [[IN:%.*]] to i6472; CHECK-NEXT: [[MIN:%.*]] = call i64 @llvm.smin.i64(i64 [[CONV]], i64 1073741823)73; CHECK-NEXT: [[MAX:%.*]] = call i64 @llvm.smax.i64(i64 [[MIN]], i64 -1073741824)74; CHECK-NEXT: ret i64 [[MAX]]75;76 %conv = fptosi double %in to i6477 %min = call i64 @llvm.smin.i64(i64 %conv, i64 1073741823)78 %max = call i64 @llvm.smax.i64(i64 %min, i64 -1073741824)79 ret i64 %max80}81 82define i32 @f64_i16(double %in) {83; CHECK-LABEL: @f64_i16(84; CHECK-NEXT: [[CONV:%.*]] = fptosi double [[IN:%.*]] to i3285; CHECK-NEXT: [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[CONV]], i32 32767)86; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[MIN]], i32 -32768)87; CHECK-NEXT: ret i32 [[MAX]]88;89 %conv = fptosi double %in to i3290 %min = call i32 @llvm.smin.i32(i32 %conv, i32 32767)91 %max = call i32 @llvm.smax.i32(i32 %min, i32 -32768)92 ret i32 %max93}94 95define i64 @f16_i32(half %in) {96; CHECK-LABEL: @f16_i32(97; CHECK-NEXT: [[CONV:%.*]] = fptosi half [[IN:%.*]] to i6498; CHECK-NEXT: [[MIN:%.*]] = call i64 @llvm.smin.i64(i64 [[CONV]], i64 2147483647)99; CHECK-NEXT: [[MAX:%.*]] = call i64 @llvm.smax.i64(i64 [[MIN]], i64 -2147483648)100; CHECK-NEXT: ret i64 [[MAX]]101;102 %conv = fptosi half %in to i64103 %min = call i64 @llvm.smin.i64(i64 %conv, i64 2147483647)104 %max = call i64 @llvm.smax.i64(i64 %min, i64 -2147483648)105 ret i64 %max106}107 108define i64 @f16_i31(half %in) {109; CHECK-LABEL: @f16_i31(110; CHECK-NEXT: [[CONV:%.*]] = fptosi half [[IN:%.*]] to i64111; CHECK-NEXT: [[MIN:%.*]] = call i64 @llvm.smin.i64(i64 [[CONV]], i64 1073741823)112; CHECK-NEXT: [[MAX:%.*]] = call i64 @llvm.smax.i64(i64 [[MIN]], i64 -1073741824)113; CHECK-NEXT: ret i64 [[MAX]]114;115 %conv = fptosi half %in to i64116 %min = call i64 @llvm.smin.i64(i64 %conv, i64 1073741823)117 %max = call i64 @llvm.smax.i64(i64 %min, i64 -1073741824)118 ret i64 %max119}120 121define i32 @f16_i16(half %in) {122; CHECK-LABEL: @f16_i16(123; CHECK-NEXT: [[CONV:%.*]] = fptosi half [[IN:%.*]] to i32124; CHECK-NEXT: [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[CONV]], i32 32767)125; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[MIN]], i32 -32768)126; CHECK-NEXT: ret i32 [[MAX]]127;128 %conv = fptosi half %in to i32129 %min = call i32 @llvm.smin.i32(i32 %conv, i32 32767)130 %max = call i32 @llvm.smax.i32(i32 %min, i32 -32768)131 ret i32 %max132}133 134define i32 @f16_i8(half %in) {135; CHECK-LABEL: @f16_i8(136; CHECK-NEXT: [[CONV:%.*]] = fptosi half [[IN:%.*]] to i32137; CHECK-NEXT: [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[CONV]], i32 127)138; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[MIN]], i32 -128)139; CHECK-NEXT: ret i32 [[MAX]]140;141 %conv = fptosi half %in to i32142 %min = call i32 @llvm.smin.i32(i32 %conv, i32 127)143 %max = call i32 @llvm.smax.i32(i32 %min, i32 -128)144 ret i32 %max145}146 147define <4 x i64> @v4f32_i32(<4 x float> %in) {148; CHECK-LABEL: @v4f32_i32(149; CHECK-NEXT: [[TMP1:%.*]] = call <4 x i32> @llvm.fptosi.sat.v4i32.v4f32(<4 x float> [[IN:%.*]])150; CHECK-NEXT: [[TMP2:%.*]] = sext <4 x i32> [[TMP1]] to <4 x i64>151; CHECK-NEXT: ret <4 x i64> [[TMP2]]152;153 %conv = fptosi <4 x float> %in to <4 x i64>154 %min = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %conv, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>)155 %max = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %min, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>)156 ret <4 x i64> %max157}158 159define <8 x i32> @v8f16_i16(<8 x half> %in) {160; CHECK-LABEL: @v8f16_i16(161; CHECK-NEXT: [[CONV:%.*]] = fptosi <8 x half> [[IN:%.*]] to <8 x i32>162; CHECK-NEXT: [[MIN:%.*]] = call <8 x i32> @llvm.smin.v8i32(<8 x i32> [[CONV]], <8 x i32> splat (i32 32767))163; CHECK-NEXT: [[MAX:%.*]] = call <8 x i32> @llvm.smax.v8i32(<8 x i32> [[MIN]], <8 x i32> splat (i32 -32768))164; CHECK-NEXT: ret <8 x i32> [[MAX]]165;166 %conv = fptosi <8 x half> %in to <8 x i32>167 %min = call <8 x i32> @llvm.smin.v8i32(<8 x i32> %conv, <8 x i32> <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>)168 %max = call <8 x i32> @llvm.smax.v8i32(<8 x i32> %min, <8 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>)169 ret <8 x i32> %max170}171 172 173declare i64 @llvm.smin.i64(i64, i64)174declare i64 @llvm.smax.i64(i64, i64)175declare i32 @llvm.smin.i32(i32, i32)176declare i32 @llvm.smax.i32(i32, i32)177declare <2 x i64> @llvm.smin.v2i64(<2 x i64>, <2 x i64>)178declare <2 x i64> @llvm.smax.v2i64(<2 x i64>, <2 x i64>)179declare <4 x i64> @llvm.smin.v4i64(<4 x i64>, <4 x i64>)180declare <4 x i64> @llvm.smax.v4i64(<4 x i64>, <4 x i64>)181declare <8 x i64> @llvm.smin.v8i64(<8 x i64>, <8 x i64>)182declare <8 x i64> @llvm.smax.v8i64(<8 x i64>, <8 x i64>)183declare <4 x i32> @llvm.smin.v4i32(<4 x i32>, <4 x i32>)184declare <4 x i32> @llvm.smax.v4i32(<4 x i32>, <4 x i32>)185declare <8 x i32> @llvm.smin.v8i32(<8 x i32>, <8 x i32>)186declare <8 x i32> @llvm.smax.v8i32(<8 x i32>, <8 x i32>)187