1f8f50a49SDavid Green; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2f8f50a49SDavid Green; RUN: opt < %s -passes=aggressive-instcombine -mtriple x86_64-none-eabi -mattr=avx2 -S | FileCheck %s 3f8f50a49SDavid Green 4f8f50a49SDavid Greendefine i64 @f32_i32(float %in) { 5f8f50a49SDavid Green; CHECK-LABEL: @f32_i32( 6f8f50a49SDavid Green; CHECK-NEXT: [[CONV:%.*]] = fptosi float [[IN:%.*]] to i64 7f8f50a49SDavid Green; CHECK-NEXT: [[MIN:%.*]] = call i64 @llvm.smin.i64(i64 [[CONV]], i64 2147483647) 8f8f50a49SDavid Green; CHECK-NEXT: [[MAX:%.*]] = call i64 @llvm.smax.i64(i64 [[MIN]], i64 -2147483648) 9f8f50a49SDavid Green; CHECK-NEXT: ret i64 [[MAX]] 10f8f50a49SDavid Green; 11f8f50a49SDavid Green %conv = fptosi float %in to i64 12f8f50a49SDavid Green %min = call i64 @llvm.smin.i64(i64 %conv, i64 2147483647) 13f8f50a49SDavid Green %max = call i64 @llvm.smax.i64(i64 %min, i64 -2147483648) 14f8f50a49SDavid Green ret i64 %max 15f8f50a49SDavid Green} 16f8f50a49SDavid Green 17f8f50a49SDavid Greendefine i64 @f32_i31(float %in) { 18f8f50a49SDavid Green; CHECK-LABEL: @f32_i31( 19f8f50a49SDavid Green; CHECK-NEXT: [[CONV:%.*]] = fptosi float [[IN:%.*]] to i64 20f8f50a49SDavid Green; CHECK-NEXT: [[MIN:%.*]] = call i64 @llvm.smin.i64(i64 [[CONV]], i64 1073741823) 21f8f50a49SDavid Green; CHECK-NEXT: [[MAX:%.*]] = call i64 @llvm.smax.i64(i64 [[MIN]], i64 -1073741824) 22f8f50a49SDavid Green; CHECK-NEXT: ret i64 [[MAX]] 23f8f50a49SDavid Green; 24f8f50a49SDavid Green %conv = fptosi float %in to i64 25f8f50a49SDavid Green %min = call i64 @llvm.smin.i64(i64 %conv, i64 1073741823) 26f8f50a49SDavid Green %max = call i64 @llvm.smax.i64(i64 %min, i64 -1073741824) 27f8f50a49SDavid Green ret i64 %max 28f8f50a49SDavid Green} 29f8f50a49SDavid Green 30f8f50a49SDavid Greendefine i32 @f32_i16(float %in) { 31f8f50a49SDavid Green; CHECK-LABEL: @f32_i16( 32f8f50a49SDavid Green; CHECK-NEXT: [[CONV:%.*]] = fptosi float [[IN:%.*]] to i32 33f8f50a49SDavid Green; CHECK-NEXT: [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[CONV]], i32 32767) 34f8f50a49SDavid Green; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[MIN]], i32 -32768) 35f8f50a49SDavid Green; CHECK-NEXT: ret i32 [[MAX]] 36f8f50a49SDavid Green; 37f8f50a49SDavid Green %conv = fptosi float %in to i32 38f8f50a49SDavid Green %min = call i32 @llvm.smin.i32(i32 %conv, i32 32767) 39f8f50a49SDavid Green %max = call i32 @llvm.smax.i32(i32 %min, i32 -32768) 40f8f50a49SDavid Green ret i32 %max 41f8f50a49SDavid Green} 42f8f50a49SDavid Green 43f8f50a49SDavid Greendefine i32 @f32_i8(float %in) { 44f8f50a49SDavid Green; CHECK-LABEL: @f32_i8( 45f8f50a49SDavid Green; CHECK-NEXT: [[CONV:%.*]] = fptosi float [[IN:%.*]] to i32 46f8f50a49SDavid Green; CHECK-NEXT: [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[CONV]], i32 127) 47f8f50a49SDavid Green; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[MIN]], i32 -128) 48f8f50a49SDavid Green; CHECK-NEXT: ret i32 [[MAX]] 49f8f50a49SDavid Green; 50f8f50a49SDavid Green %conv = fptosi float %in to i32 51f8f50a49SDavid Green %min = call i32 @llvm.smin.i32(i32 %conv, i32 127) 52f8f50a49SDavid Green %max = call i32 @llvm.smax.i32(i32 %min, i32 -128) 53f8f50a49SDavid Green ret i32 %max 54f8f50a49SDavid Green} 55f8f50a49SDavid Green 56f8f50a49SDavid Greendefine i64 @f64_i32(double %in) { 57f8f50a49SDavid Green; CHECK-LABEL: @f64_i32( 58f8f50a49SDavid Green; CHECK-NEXT: [[CONV:%.*]] = fptosi double [[IN:%.*]] to i64 59f8f50a49SDavid Green; CHECK-NEXT: [[MIN:%.*]] = call i64 @llvm.smin.i64(i64 [[CONV]], i64 2147483647) 60f8f50a49SDavid Green; CHECK-NEXT: [[MAX:%.*]] = call i64 @llvm.smax.i64(i64 [[MIN]], i64 -2147483648) 61f8f50a49SDavid Green; CHECK-NEXT: ret i64 [[MAX]] 62f8f50a49SDavid Green; 63f8f50a49SDavid Green %conv = fptosi double %in to i64 64f8f50a49SDavid Green %min = call i64 @llvm.smin.i64(i64 %conv, i64 2147483647) 65f8f50a49SDavid Green %max = call i64 @llvm.smax.i64(i64 %min, i64 -2147483648) 66f8f50a49SDavid Green ret i64 %max 67f8f50a49SDavid Green} 68f8f50a49SDavid Green 69f8f50a49SDavid Greendefine i64 @f64_i31(double %in) { 70f8f50a49SDavid Green; CHECK-LABEL: @f64_i31( 71f8f50a49SDavid Green; CHECK-NEXT: [[CONV:%.*]] = fptosi double [[IN:%.*]] to i64 72f8f50a49SDavid Green; CHECK-NEXT: [[MIN:%.*]] = call i64 @llvm.smin.i64(i64 [[CONV]], i64 1073741823) 73f8f50a49SDavid Green; CHECK-NEXT: [[MAX:%.*]] = call i64 @llvm.smax.i64(i64 [[MIN]], i64 -1073741824) 74f8f50a49SDavid Green; CHECK-NEXT: ret i64 [[MAX]] 75f8f50a49SDavid Green; 76f8f50a49SDavid Green %conv = fptosi double %in to i64 77f8f50a49SDavid Green %min = call i64 @llvm.smin.i64(i64 %conv, i64 1073741823) 78f8f50a49SDavid Green %max = call i64 @llvm.smax.i64(i64 %min, i64 -1073741824) 79f8f50a49SDavid Green ret i64 %max 80f8f50a49SDavid Green} 81f8f50a49SDavid Green 82f8f50a49SDavid Greendefine i32 @f64_i16(double %in) { 83f8f50a49SDavid Green; CHECK-LABEL: @f64_i16( 84f8f50a49SDavid Green; CHECK-NEXT: [[CONV:%.*]] = fptosi double [[IN:%.*]] to i32 85f8f50a49SDavid Green; CHECK-NEXT: [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[CONV]], i32 32767) 86f8f50a49SDavid Green; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[MIN]], i32 -32768) 87f8f50a49SDavid Green; CHECK-NEXT: ret i32 [[MAX]] 88f8f50a49SDavid Green; 89f8f50a49SDavid Green %conv = fptosi double %in to i32 90f8f50a49SDavid Green %min = call i32 @llvm.smin.i32(i32 %conv, i32 32767) 91f8f50a49SDavid Green %max = call i32 @llvm.smax.i32(i32 %min, i32 -32768) 92f8f50a49SDavid Green ret i32 %max 93f8f50a49SDavid Green} 94f8f50a49SDavid Green 95f8f50a49SDavid Greendefine i64 @f16_i32(half %in) { 96f8f50a49SDavid Green; CHECK-LABEL: @f16_i32( 97f8f50a49SDavid Green; CHECK-NEXT: [[CONV:%.*]] = fptosi half [[IN:%.*]] to i64 98f8f50a49SDavid Green; CHECK-NEXT: [[MIN:%.*]] = call i64 @llvm.smin.i64(i64 [[CONV]], i64 2147483647) 99f8f50a49SDavid Green; CHECK-NEXT: [[MAX:%.*]] = call i64 @llvm.smax.i64(i64 [[MIN]], i64 -2147483648) 100f8f50a49SDavid Green; CHECK-NEXT: ret i64 [[MAX]] 101f8f50a49SDavid Green; 102f8f50a49SDavid Green %conv = fptosi half %in to i64 103f8f50a49SDavid Green %min = call i64 @llvm.smin.i64(i64 %conv, i64 2147483647) 104f8f50a49SDavid Green %max = call i64 @llvm.smax.i64(i64 %min, i64 -2147483648) 105f8f50a49SDavid Green ret i64 %max 106f8f50a49SDavid Green} 107f8f50a49SDavid Green 108f8f50a49SDavid Greendefine i64 @f16_i31(half %in) { 109f8f50a49SDavid Green; CHECK-LABEL: @f16_i31( 110f8f50a49SDavid Green; CHECK-NEXT: [[CONV:%.*]] = fptosi half [[IN:%.*]] to i64 111f8f50a49SDavid Green; CHECK-NEXT: [[MIN:%.*]] = call i64 @llvm.smin.i64(i64 [[CONV]], i64 1073741823) 112f8f50a49SDavid Green; CHECK-NEXT: [[MAX:%.*]] = call i64 @llvm.smax.i64(i64 [[MIN]], i64 -1073741824) 113f8f50a49SDavid Green; CHECK-NEXT: ret i64 [[MAX]] 114f8f50a49SDavid Green; 115f8f50a49SDavid Green %conv = fptosi half %in to i64 116f8f50a49SDavid Green %min = call i64 @llvm.smin.i64(i64 %conv, i64 1073741823) 117f8f50a49SDavid Green %max = call i64 @llvm.smax.i64(i64 %min, i64 -1073741824) 118f8f50a49SDavid Green ret i64 %max 119f8f50a49SDavid Green} 120f8f50a49SDavid Green 121f8f50a49SDavid Greendefine i32 @f16_i16(half %in) { 122f8f50a49SDavid Green; CHECK-LABEL: @f16_i16( 123f8f50a49SDavid Green; CHECK-NEXT: [[CONV:%.*]] = fptosi half [[IN:%.*]] to i32 124f8f50a49SDavid Green; CHECK-NEXT: [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[CONV]], i32 32767) 125f8f50a49SDavid Green; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[MIN]], i32 -32768) 126f8f50a49SDavid Green; CHECK-NEXT: ret i32 [[MAX]] 127f8f50a49SDavid Green; 128f8f50a49SDavid Green %conv = fptosi half %in to i32 129f8f50a49SDavid Green %min = call i32 @llvm.smin.i32(i32 %conv, i32 32767) 130f8f50a49SDavid Green %max = call i32 @llvm.smax.i32(i32 %min, i32 -32768) 131f8f50a49SDavid Green ret i32 %max 132f8f50a49SDavid Green} 133f8f50a49SDavid Green 134f8f50a49SDavid Greendefine i32 @f16_i8(half %in) { 135f8f50a49SDavid Green; CHECK-LABEL: @f16_i8( 136f8f50a49SDavid Green; CHECK-NEXT: [[CONV:%.*]] = fptosi half [[IN:%.*]] to i32 137f8f50a49SDavid Green; CHECK-NEXT: [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[CONV]], i32 127) 138f8f50a49SDavid Green; CHECK-NEXT: [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[MIN]], i32 -128) 139f8f50a49SDavid Green; CHECK-NEXT: ret i32 [[MAX]] 140f8f50a49SDavid Green; 141f8f50a49SDavid Green %conv = fptosi half %in to i32 142f8f50a49SDavid Green %min = call i32 @llvm.smin.i32(i32 %conv, i32 127) 143f8f50a49SDavid Green %max = call i32 @llvm.smax.i32(i32 %min, i32 -128) 144f8f50a49SDavid Green ret i32 %max 145f8f50a49SDavid Green} 146f8f50a49SDavid Green 147f8f50a49SDavid Greendefine <4 x i64> @v4f32_i32(<4 x float> %in) { 148f8f50a49SDavid Green; CHECK-LABEL: @v4f32_i32( 149aa97f6b4SDavid Green; CHECK-NEXT: [[TMP1:%.*]] = call <4 x i32> @llvm.fptosi.sat.v4i32.v4f32(<4 x float> [[IN:%.*]]) 150aa97f6b4SDavid Green; CHECK-NEXT: [[TMP2:%.*]] = sext <4 x i32> [[TMP1]] to <4 x i64> 151aa97f6b4SDavid Green; CHECK-NEXT: ret <4 x i64> [[TMP2]] 152f8f50a49SDavid Green; 153f8f50a49SDavid Green %conv = fptosi <4 x float> %in to <4 x i64> 154f8f50a49SDavid Green %min = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %conv, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>) 155f8f50a49SDavid Green %max = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %min, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>) 156f8f50a49SDavid Green ret <4 x i64> %max 157f8f50a49SDavid Green} 158f8f50a49SDavid Green 159f8f50a49SDavid Greendefine <8 x i32> @v8f16_i16(<8 x half> %in) { 160f8f50a49SDavid Green; CHECK-LABEL: @v8f16_i16( 161f8f50a49SDavid Green; CHECK-NEXT: [[CONV:%.*]] = fptosi <8 x half> [[IN:%.*]] to <8 x i32> 162*38fffa63SPaul Walker; CHECK-NEXT: [[MIN:%.*]] = call <8 x i32> @llvm.smin.v8i32(<8 x i32> [[CONV]], <8 x i32> splat (i32 32767)) 163*38fffa63SPaul Walker; CHECK-NEXT: [[MAX:%.*]] = call <8 x i32> @llvm.smax.v8i32(<8 x i32> [[MIN]], <8 x i32> splat (i32 -32768)) 164f8f50a49SDavid Green; CHECK-NEXT: ret <8 x i32> [[MAX]] 165f8f50a49SDavid Green; 166f8f50a49SDavid Green %conv = fptosi <8 x half> %in to <8 x i32> 167f8f50a49SDavid Green %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>) 168f8f50a49SDavid Green %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>) 169f8f50a49SDavid Green ret <8 x i32> %max 170f8f50a49SDavid Green} 171f8f50a49SDavid Green 172f8f50a49SDavid Green 173f8f50a49SDavid Greendeclare i64 @llvm.smin.i64(i64, i64) 174f8f50a49SDavid Greendeclare i64 @llvm.smax.i64(i64, i64) 175f8f50a49SDavid Greendeclare i32 @llvm.smin.i32(i32, i32) 176f8f50a49SDavid Greendeclare i32 @llvm.smax.i32(i32, i32) 177f8f50a49SDavid Greendeclare <2 x i64> @llvm.smin.v2i64(<2 x i64>, <2 x i64>) 178f8f50a49SDavid Greendeclare <2 x i64> @llvm.smax.v2i64(<2 x i64>, <2 x i64>) 179f8f50a49SDavid Greendeclare <4 x i64> @llvm.smin.v4i64(<4 x i64>, <4 x i64>) 180f8f50a49SDavid Greendeclare <4 x i64> @llvm.smax.v4i64(<4 x i64>, <4 x i64>) 181f8f50a49SDavid Greendeclare <8 x i64> @llvm.smin.v8i64(<8 x i64>, <8 x i64>) 182f8f50a49SDavid Greendeclare <8 x i64> @llvm.smax.v8i64(<8 x i64>, <8 x i64>) 183f8f50a49SDavid Greendeclare <4 x i32> @llvm.smin.v4i32(<4 x i32>, <4 x i32>) 184f8f50a49SDavid Greendeclare <4 x i32> @llvm.smax.v4i32(<4 x i32>, <4 x i32>) 185f8f50a49SDavid Greendeclare <8 x i32> @llvm.smin.v8i32(<8 x i32>, <8 x i32>) 186f8f50a49SDavid Greendeclare <8 x i32> @llvm.smax.v8i32(<8 x i32>, <8 x i32>) 187