diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -11314,16 +11314,6 @@ return EmitX86Select(CGF, Ops[2], Res, Ops[1]); } -static Value *EmitX86Abs(CodeGenFunction &CGF, ArrayRef Ops) { - - llvm::Type *Ty = Ops[0]->getType(); - Value *Zero = llvm::Constant::getNullValue(Ty); - Value *Sub = CGF.Builder.CreateSub(Zero, Ops[0]); - Value *Cmp = CGF.Builder.CreateICmp(ICmpInst::ICMP_SGT, Ops[0], Zero); - Value *Res = CGF.Builder.CreateSelect(Cmp, Ops[0], Sub); - return Res; -} - static Value *EmitX86MinMax(CodeGenFunction &CGF, ICmpInst::Predicate Pred, ArrayRef Ops) { Value *Cmp = CGF.Builder.CreateICmp(Pred, Ops[0], Ops[1]); @@ -13300,9 +13290,10 @@ case X86::BI__builtin_ia32_pabsb512: case X86::BI__builtin_ia32_pabsw512: case X86::BI__builtin_ia32_pabsd512: - case X86::BI__builtin_ia32_pabsq512: - return EmitX86Abs(*this, Ops); - + case X86::BI__builtin_ia32_pabsq512: { + Function *F = CGM.getIntrinsic(Intrinsic::abs, Ops[0]->getType()); + return Builder.CreateCall(F, {Ops[0], Builder.getInt1(false)}); + } case X86::BI__builtin_ia32_pmaxsb128: case X86::BI__builtin_ia32_pmaxsw128: case X86::BI__builtin_ia32_pmaxsd128: diff --git a/clang/test/CodeGen/avx2-builtins.c b/clang/test/CodeGen/avx2-builtins.c --- a/clang/test/CodeGen/avx2-builtins.c +++ b/clang/test/CodeGen/avx2-builtins.c @@ -8,25 +8,19 @@ __m256i test_mm256_abs_epi8(__m256i a) { // CHECK-LABEL: test_mm256_abs_epi8 - // CHECK: [[SUB:%.*]] = sub <32 x i8> zeroinitializer, %{{.*}} - // CHECK: [[CMP:%.*]] = icmp sgt <32 x i8> %{{.*}}, zeroinitializer - // CHECK: select <32 x i1> [[CMP]], <32 x i8> %{{.*}}, <32 x i8> [[SUB]] + // CHECK: [[ABS:%.*]] = call <32 x i8> @llvm.abs.v32i8(<32 x i8> %{{.*}}, i1 false) return _mm256_abs_epi8(a); } __m256i test_mm256_abs_epi16(__m256i a) { // CHECK-LABEL: test_mm256_abs_epi16 - // CHECK: [[SUB:%.*]] = sub <16 x i16> zeroinitializer, %{{.*}} - // CHECK: [[CMP:%.*]] = icmp sgt <16 x i16> %{{.*}}, zeroinitializer - // CHECK: select <16 x i1> [[CMP]], <16 x i16> %{{.*}}, <16 x i16> [[SUB]] + // CHECK: [[ABS:%.*]] = call <16 x i16> @llvm.abs.v16i16(<16 x i16> %{{.*}}, i1 false) return _mm256_abs_epi16(a); } __m256i test_mm256_abs_epi32(__m256i a) { // CHECK-LABEL: test_mm256_abs_epi32 - // CHECK: [[SUB:%.*]] = sub <8 x i32> zeroinitializer, %{{.*}} - // CHECK: [[CMP:%.*]] = icmp sgt <8 x i32> %{{.*}}, zeroinitializer - // CHECK: select <8 x i1> [[CMP]], <8 x i32> %{{.*}}, <8 x i32> [[SUB]] + // CHECK: [[ABS:%.*]] = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %{{.*}}, i1 false) return _mm256_abs_epi32(a); } diff --git a/clang/test/CodeGen/avx512bw-builtins.c b/clang/test/CodeGen/avx512bw-builtins.c --- a/clang/test/CodeGen/avx512bw-builtins.c +++ b/clang/test/CodeGen/avx512bw-builtins.c @@ -878,48 +878,36 @@ } __m512i test_mm512_abs_epi8(__m512i __A) { // CHECK-LABEL: @test_mm512_abs_epi8 - // CHECK: [[SUB:%.*]] = sub <64 x i8> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <64 x i8> [[A]], zeroinitializer - // CHECK: select <64 x i1> [[CMP]], <64 x i8> [[A]], <64 x i8> [[SUB]] + // CHECK: [[ABS:%.*]] = call <64 x i8> @llvm.abs.v64i8(<64 x i8> %{{.*}}, i1 false) return _mm512_abs_epi8(__A); } __m512i test_mm512_mask_abs_epi8(__m512i __W, __mmask64 __U, __m512i __A) { // CHECK-LABEL: @test_mm512_mask_abs_epi8 - // CHECK: [[SUB:%.*]] = sub <64 x i8> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <64 x i8> [[A]], zeroinitializer - // CHECK: [[SEL:%.*]] = select <64 x i1> [[CMP]], <64 x i8> [[A]], <64 x i8> [[SUB]] - // CHECK: select <64 x i1> %{{.*}}, <64 x i8> [[SEL]], <64 x i8> %{{.*}} + // CHECK: [[ABS:%.*]] = call <64 x i8> @llvm.abs.v64i8(<64 x i8> %{{.*}}, i1 false) + // CHECK: select <64 x i1> %{{.*}}, <64 x i8> [[ABS]], <64 x i8> %{{.*}} return _mm512_mask_abs_epi8(__W,__U,__A); } __m512i test_mm512_maskz_abs_epi8(__mmask64 __U, __m512i __A) { // CHECK-LABEL: @test_mm512_maskz_abs_epi8 - // CHECK: [[SUB:%.*]] = sub <64 x i8> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <64 x i8> [[A]], zeroinitializer - // CHECK: [[SEL:%.*]] = select <64 x i1> [[CMP]], <64 x i8> [[A]], <64 x i8> [[SUB]] - // CHECK: select <64 x i1> %{{.*}}, <64 x i8> [[SEL]], <64 x i8> %{{.*}} + // CHECK: [[ABS:%.*]] = call <64 x i8> @llvm.abs.v64i8(<64 x i8> %{{.*}}, i1 false) + // CHECK: select <64 x i1> %{{.*}}, <64 x i8> [[ABS]], <64 x i8> %{{.*}} return _mm512_maskz_abs_epi8(__U,__A); } __m512i test_mm512_abs_epi16(__m512i __A) { // CHECK-LABEL: @test_mm512_abs_epi16 - // CHECK: [[SUB:%.*]] = sub <32 x i16> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <32 x i16> [[A]], zeroinitializer - // CHECK: select <32 x i1> [[CMP]], <32 x i16> [[A]], <32 x i16> [[SUB]] + // CHECK: [[ABS:%.*]] = call <32 x i16> @llvm.abs.v32i16(<32 x i16> %{{.*}}, i1 false) return _mm512_abs_epi16(__A); } __m512i test_mm512_mask_abs_epi16(__m512i __W, __mmask32 __U, __m512i __A) { // CHECK-LABEL: @test_mm512_mask_abs_epi16 - // CHECK: [[SUB:%.*]] = sub <32 x i16> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <32 x i16> [[A]], zeroinitializer - // CHECK: [[SEL:%.*]] = select <32 x i1> [[CMP]], <32 x i16> [[A]], <32 x i16> [[SUB]] - // CHECK: select <32 x i1> %{{.*}}, <32 x i16> [[SEL]], <32 x i16> %{{.*}} + // CHECK: [[ABS:%.*]] = call <32 x i16> @llvm.abs.v32i16(<32 x i16> %{{.*}}, i1 false) + // CHECK: select <32 x i1> %{{.*}}, <32 x i16> [[ABS]], <32 x i16> %{{.*}} return _mm512_mask_abs_epi16(__W,__U,__A); } __m512i test_mm512_maskz_abs_epi16(__mmask32 __U, __m512i __A) { // CHECK-LABEL: @test_mm512_maskz_abs_epi16 - // CHECK: [[SUB:%.*]] = sub <32 x i16> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <32 x i16> [[A]], zeroinitializer - // CHECK: [[SEL:%.*]] = select <32 x i1> [[CMP]], <32 x i16> [[A]], <32 x i16> [[SUB]] - // CHECK: select <32 x i1> %{{.*}}, <32 x i16> [[SEL]], <32 x i16> %{{.*}} + // CHECK: [[ABS:%.*]] = call <32 x i16> @llvm.abs.v32i16(<32 x i16> %{{.*}}, i1 false) + // CHECK: select <32 x i1> %{{.*}}, <32 x i16> [[ABS]], <32 x i16> %{{.*}} return _mm512_maskz_abs_epi16(__U,__A); } __m512i test_mm512_packs_epi32(__m512i __A, __m512i __B) { diff --git a/clang/test/CodeGen/avx512f-builtins.c b/clang/test/CodeGen/avx512f-builtins.c --- a/clang/test/CodeGen/avx512f-builtins.c +++ b/clang/test/CodeGen/avx512f-builtins.c @@ -10467,44 +10467,36 @@ __m512i test_mm512_mask_abs_epi64 (__m512i __W, __mmask8 __U, __m512i __A) { // CHECK-LABEL: @test_mm512_mask_abs_epi64 - // CHECK: [[SUB:%.*]] = sub <8 x i64> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <8 x i64> [[A]], zeroinitializer - // CHECK: [[SEL:%.*]] = select <8 x i1> [[CMP]], <8 x i64> [[A]], <8 x i64> [[SUB]] - // CHECK: select <8 x i1> %{{.*}}, <8 x i64> [[SEL]], <8 x i64> %{{.*}} + // CHECK: [[ABS:%.*]] = call <8 x i64> @llvm.abs.v8i64(<8 x i64> %{{.*}}, i1 false) + // CHECK: select <8 x i1> %{{.*}}, <8 x i64> [[ABS]], <8 x i64> %{{.*}} return _mm512_mask_abs_epi64 (__W,__U,__A); } __m512i test_mm512_maskz_abs_epi64 (__mmask8 __U, __m512i __A) { // CHECK-LABEL: @test_mm512_maskz_abs_epi64 - // CHECK: [[SUB:%.*]] = sub <8 x i64> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <8 x i64> [[A]], zeroinitializer - // CHECK: [[SEL:%.*]] = select <8 x i1> [[CMP]], <8 x i64> [[A]], <8 x i64> [[SUB]] - // CHECK: select <8 x i1> %{{.*}}, <8 x i64> [[SEL]], <8 x i64> %{{.*}} + // CHECK: [[ABS:%.*]] = call <8 x i64> @llvm.abs.v8i64(<8 x i64> %{{.*}}, i1 false) + // CHECK: select <8 x i1> %{{.*}}, <8 x i64> [[ABS]], <8 x i64> %{{.*}} return _mm512_maskz_abs_epi64 (__U,__A); } __m512i test_mm512_mask_abs_epi32 (__m512i __W, __mmask16 __U, __m512i __A) { // CHECK-LABEL: @test_mm512_mask_abs_epi32 - // CHECK: [[SUB:%.*]] = sub <16 x i32> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <16 x i32> [[A]], zeroinitializer - // CHECK: [[SEL:%.*]] = select <16 x i1> [[CMP]], <16 x i32> [[A]], <16 x i32> [[SUB]] - // CHECK: [[TMP:%.*]] = bitcast <16 x i32> [[SEL]] to <8 x i64> - // CHECK: [[SEL:%.*]] = bitcast <8 x i64> [[TMP]] to <16 x i32> - // CHECK: select <16 x i1> %{{.*}}, <16 x i32> [[SEL]], <16 x i32> %{{.*}} + // CHECK: [[ABS:%.*]] = call <16 x i32> @llvm.abs.v16i32(<16 x i32> %{{.*}}, i1 false) + // CHECK: [[TMP:%.*]] = bitcast <16 x i32> [[ABS]] to <8 x i64> + // CHECK: [[ABS:%.*]] = bitcast <8 x i64> [[TMP]] to <16 x i32> + // CHECK: select <16 x i1> %{{.*}}, <16 x i32> [[ABS]], <16 x i32> %{{.*}} return _mm512_mask_abs_epi32 (__W,__U,__A); } __m512i test_mm512_maskz_abs_epi32 (__mmask16 __U, __m512i __A) { // CHECK-LABEL: @test_mm512_maskz_abs_epi32 - // CHECK: [[SUB:%.*]] = sub <16 x i32> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <16 x i32> [[A]], zeroinitializer - // CHECK: [[SEL:%.*]] = select <16 x i1> [[CMP]], <16 x i32> [[A]], <16 x i32> [[SUB]] - // CHECK: [[TMP:%.*]] = bitcast <16 x i32> [[SEL]] to <8 x i64> - // CHECK: [[SEL:%.*]] = bitcast <8 x i64> [[TMP]] to <16 x i32> - // CHECK: select <16 x i1> %{{.*}}, <16 x i32> [[SEL]], <16 x i32> %{{.*}} + // CHECK: [[ABS:%.*]] = call <16 x i32> @llvm.abs.v16i32(<16 x i32> %{{.*}}, i1 false) + // CHECK: [[TMP:%.*]] = bitcast <16 x i32> [[ABS]] to <8 x i64> + // CHECK: [[ABS:%.*]] = bitcast <8 x i64> [[TMP]] to <16 x i32> + // CHECK: select <16 x i1> %{{.*}}, <16 x i32> [[ABS]], <16 x i32> %{{.*}} return _mm512_maskz_abs_epi32 (__U,__A); } diff --git a/clang/test/CodeGen/avx512vl-builtins.c b/clang/test/CodeGen/avx512vl-builtins.c --- a/clang/test/CodeGen/avx512vl-builtins.c +++ b/clang/test/CodeGen/avx512vl-builtins.c @@ -4537,90 +4537,68 @@ } __m128i test_mm_mask_abs_epi32(__m128i __W, __mmask8 __U, __m128i __A) { // CHECK-LABEL: @test_mm_mask_abs_epi32 - // CHECK: [[SUB:%.*]] = sub <4 x i32> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <4 x i32> [[A]], zeroinitializer - // CHECK: [[SEL:%.*]] = select <4 x i1> [[CMP]], <4 x i32> [[A]], <4 x i32> [[SUB]] - // CHECK: [[TMP:%.*]] = bitcast <4 x i32> [[SEL]] to <2 x i64> - // CHECK: [[SEL:%.*]] = bitcast <2 x i64> [[TMP]] to <4 x i32> - // CHECK: select <4 x i1> %{{.*}}, <4 x i32> [[SEL]], <4 x i32> %{{.*}} + // CHECK: [[ABS:%.*]] = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %{{.*}}, i1 false) + // CHECK: [[TMP:%.*]] = bitcast <4 x i32> [[ABS]] to <2 x i64> + // CHECK: [[ABS:%.*]] = bitcast <2 x i64> [[TMP]] to <4 x i32> + // CHECK: select <4 x i1> %{{.*}}, <4 x i32> [[ABS]], <4 x i32> %{{.*}} return _mm_mask_abs_epi32(__W,__U,__A); } __m128i test_mm_maskz_abs_epi32(__mmask8 __U, __m128i __A) { // CHECK-LABEL: @test_mm_maskz_abs_epi32 - // CHECK: [[SUB:%.*]] = sub <4 x i32> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <4 x i32> [[A]], zeroinitializer - // CHECK: [[SEL:%.*]] = select <4 x i1> [[CMP]], <4 x i32> [[A]], <4 x i32> [[SUB]] - // CHECK: [[TMP:%.*]] = bitcast <4 x i32> [[SEL]] to <2 x i64> - // CHECK: [[SEL:%.*]] = bitcast <2 x i64> [[TMP]] to <4 x i32> - // CHECK: select <4 x i1> %{{.*}}, <4 x i32> [[SEL]], <4 x i32> %{{.*}} + // CHECK: [[ABS:%.*]] = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %{{.*}}, i1 false) + // CHECK: [[TMP:%.*]] = bitcast <4 x i32> [[ABS]] to <2 x i64> + // CHECK: [[ABS:%.*]] = bitcast <2 x i64> [[TMP]] to <4 x i32> + // CHECK: select <4 x i1> %{{.*}}, <4 x i32> [[ABS]], <4 x i32> %{{.*}} return _mm_maskz_abs_epi32(__U,__A); } __m256i test_mm256_mask_abs_epi32(__m256i __W, __mmask8 __U, __m256i __A) { // CHECK-LABEL: @test_mm256_mask_abs_epi32 - // CHECK: [[SUB:%.*]] = sub <8 x i32> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <8 x i32> [[A]], zeroinitializer - // CHECK: [[SEL:%.*]] = select <8 x i1> [[CMP]], <8 x i32> [[A]], <8 x i32> [[SUB]] - // CHECK: [[TMP:%.*]] = bitcast <8 x i32> [[SEL]] to <4 x i64> - // CHECK: [[SEL:%.*]] = bitcast <4 x i64> [[TMP]] to <8 x i32> - // CHECK: select <8 x i1> %{{.*}}, <8 x i32> [[SEL]], <8 x i32> %{{.*}} + // CHECK: [[ABS:%.*]] = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %{{.*}}, i1 false) + // CHECK: [[TMP:%.*]] = bitcast <8 x i32> [[ABS]] to <4 x i64> + // CHECK: [[ABS:%.*]] = bitcast <4 x i64> [[TMP]] to <8 x i32> + // CHECK: select <8 x i1> %{{.*}}, <8 x i32> [[ABS]], <8 x i32> %{{.*}} return _mm256_mask_abs_epi32(__W,__U,__A); } __m256i test_mm256_maskz_abs_epi32(__mmask8 __U, __m256i __A) { // CHECK-LABEL: @test_mm256_maskz_abs_epi32 - // CHECK: [[SUB:%.*]] = sub <8 x i32> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <8 x i32> [[A]], zeroinitializer - // CHECK: [[SEL:%.*]] = select <8 x i1> [[CMP]], <8 x i32> [[A]], <8 x i32> [[SUB]] - // CHECK: [[TMP:%.*]] = bitcast <8 x i32> [[SEL]] to <4 x i64> - // CHECK: [[SEL:%.*]] = bitcast <4 x i64> [[TMP]] to <8 x i32> - // CHECK: select <8 x i1> %{{.*}}, <8 x i32> [[SEL]], <8 x i32> %{{.*}} + // CHECK: [[ABS:%.*]] = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %{{.*}}, i1 false) + // CHECK: [[TMP:%.*]] = bitcast <8 x i32> [[ABS]] to <4 x i64> + // CHECK: [[ABS:%.*]] = bitcast <4 x i64> [[TMP]] to <8 x i32> + // CHECK: select <8 x i1> %{{.*}}, <8 x i32> [[ABS]], <8 x i32> %{{.*}} return _mm256_maskz_abs_epi32(__U,__A); } __m128i test_mm_abs_epi64(__m128i __A) { // CHECK-LABEL: @test_mm_abs_epi64 - // CHECK: [[SUB:%.*]] = sub <2 x i64> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <2 x i64> [[A]], zeroinitializer - // CHECK: select <2 x i1> [[CMP]], <2 x i64> [[A]], <2 x i64> [[SUB]] - + // CHECK: [[ABS:%.*]] = call <2 x i64> @llvm.abs.v2i64(<2 x i64> %{{.*}}, i1 false) return _mm_abs_epi64(__A); } __m128i test_mm_mask_abs_epi64(__m128i __W, __mmask8 __U, __m128i __A) { // CHECK-LABEL: @test_mm_mask_abs_epi64 - // CHECK: [[SUB:%.*]] = sub <2 x i64> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <2 x i64> [[A]], zeroinitializer - // CHECK: [[SEL:%.*]] = select <2 x i1> [[CMP]], <2 x i64> [[A]], <2 x i64> [[SUB]] - // CHECK: select <2 x i1> %{{.*}}, <2 x i64> [[SEL]], <2 x i64> %{{.*}} - + // CHECK: [[ABS:%.*]] = call <2 x i64> @llvm.abs.v2i64(<2 x i64> %{{.*}}, i1 false) + // CHECK: select <2 x i1> %{{.*}}, <2 x i64> [[ABS]], <2 x i64> %{{.*}} return _mm_mask_abs_epi64(__W,__U,__A); } __m128i test_mm_maskz_abs_epi64(__mmask8 __U, __m128i __A) { // CHECK-LABEL: @test_mm_maskz_abs_epi64 - // CHECK: [[SUB:%.*]] = sub <2 x i64> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <2 x i64> [[A]], zeroinitializer - // CHECK: [[SEL:%.*]] = select <2 x i1> [[CMP]], <2 x i64> [[A]], <2 x i64> [[SUB]] - // CHECK: select <2 x i1> %{{.*}}, <2 x i64> [[SEL]], <2 x i64> %{{.*}} + // CHECK: [[ABS:%.*]] = call <2 x i64> @llvm.abs.v2i64(<2 x i64> %{{.*}}, i1 false) + // CHECK: select <2 x i1> %{{.*}}, <2 x i64> [[ABS]], <2 x i64> %{{.*}} return _mm_maskz_abs_epi64(__U,__A); } __m256i test_mm256_abs_epi64(__m256i __A) { // CHECK-LABEL: @test_mm256_abs_epi64 - // CHECK: [[SUB:%.*]] = sub <4 x i64> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <4 x i64> [[A]], zeroinitializer - // CHECK: select <4 x i1> [[CMP]], <4 x i64> [[A]], <4 x i64> [[SUB]] + // CHECK: [[ABS:%.*]] = call <4 x i64> @llvm.abs.v4i64(<4 x i64> %{{.*}}, i1 false) return _mm256_abs_epi64(__A); } __m256i test_mm256_mask_abs_epi64(__m256i __W, __mmask8 __U, __m256i __A) { // CHECK-LABEL: @test_mm256_mask_abs_epi64 - // CHECK: [[SUB:%.*]] = sub <4 x i64> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <4 x i64> [[A]], zeroinitializer - // CHECK: [[SEL:%.*]] = select <4 x i1> [[CMP]], <4 x i64> [[A]], <4 x i64> [[SUB]] - // CHECK: select <4 x i1> %{{.*}}, <4 x i64> [[SEL]], <4 x i64> %{{.*}} + // CHECK: [[ABS:%.*]] = call <4 x i64> @llvm.abs.v4i64(<4 x i64> %{{.*}}, i1 false) + // CHECK: select <4 x i1> %{{.*}}, <4 x i64> [[ABS]], <4 x i64> %{{.*}} return _mm256_mask_abs_epi64(__W,__U,__A); } __m256i test_mm256_maskz_abs_epi64(__mmask8 __U, __m256i __A) { // CHECK-LABEL: @test_mm256_maskz_abs_epi64 - // CHECK: [[SUB:%.*]] = sub <4 x i64> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <4 x i64> [[A]], zeroinitializer - // CHECK: [[SEL:%.*]] = select <4 x i1> [[CMP]], <4 x i64> [[A]], <4 x i64> [[SUB]] - // CHECK: select <4 x i1> %{{.*}}, <4 x i64> [[SEL]], <4 x i64> %{{.*}} + // CHECK: [[ABS:%.*]] = call <4 x i64> @llvm.abs.v4i64(<4 x i64> %{{.*}}, i1 false) + // CHECK: select <4 x i1> %{{.*}}, <4 x i64> [[ABS]], <4 x i64> %{{.*}} return _mm256_maskz_abs_epi64(__U,__A); } __m128i test_mm_maskz_max_epi32(__mmask8 __M, __m128i __A, __m128i __B) { diff --git a/clang/test/CodeGen/avx512vlbw-builtins.c b/clang/test/CodeGen/avx512vlbw-builtins.c --- a/clang/test/CodeGen/avx512vlbw-builtins.c +++ b/clang/test/CodeGen/avx512vlbw-builtins.c @@ -897,89 +897,73 @@ __m128i test_mm_mask_abs_epi8(__m128i __W, __mmask16 __U, __m128i __A) { // CHECK-LABEL: @test_mm_mask_abs_epi8 - // CHECK: [[SUB:%.*]] = sub <16 x i8> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <16 x i8> [[A]], zeroinitializer - // CHECK: [[SEL:%.*]] = select <16 x i1> [[CMP]], <16 x i8> [[A]], <16 x i8> [[SUB]] - // CHECK: [[TMP:%.*]] = bitcast [[SRCTY:<16 x i8>]] [[SEL]] to [[DSTTY:<2 x i64>]] - // CHECK: [[SEL:%.*]] = bitcast [[DSTTY]] [[TMP]] to [[SRCTY]] - // CHECK: select <16 x i1> %{{.*}}, <16 x i8> [[SEL]], <16 x i8> %{{.*}} + // CHECK: [[ABS:%.*]] = call <16 x i8> @llvm.abs.v16i8(<16 x i8> %{{.*}}, i1 false) + // CHECK: [[TMP:%.*]] = bitcast <16 x i8> [[ABS]] to <2 x i64> + // CHECK: [[ABS:%.*]] = bitcast <2 x i64> [[TMP]] to <16 x i8> + // CHECK: select <16 x i1> %{{.*}}, <16 x i8> [[ABS]], <16 x i8> %{{.*}} return _mm_mask_abs_epi8(__W,__U,__A); } __m128i test_mm_maskz_abs_epi8(__mmask16 __U, __m128i __A) { // CHECK-LABEL: @test_mm_maskz_abs_epi8 - // CHECK: [[SUB:%.*]] = sub <16 x i8> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <16 x i8> [[A]], zeroinitializer - // CHECK: [[SEL:%.*]] = select <16 x i1> [[CMP]], <16 x i8> [[A]], <16 x i8> [[SUB]] - // CHECK: [[TMP:%.*]] = bitcast [[SRCTY:<16 x i8>]] [[SEL]] to [[DSTTY:<2 x i64>]] - // CHECK: [[SEL:%.*]] = bitcast [[DSTTY]] [[TMP]] to [[SRCTY]] - // CHECK: select <16 x i1> %{{.*}}, <16 x i8> [[SEL]], <16 x i8> %{{.*}} + // CHECK: [[ABS:%.*]] = call <16 x i8> @llvm.abs.v16i8(<16 x i8> %{{.*}}, i1 false) + // CHECK: [[TMP:%.*]] = bitcast <16 x i8> [[ABS]] to <2 x i64> + // CHECK: [[ABS:%.*]] = bitcast <2 x i64> [[TMP]] to <16 x i8> + // CHECK: select <16 x i1> %{{.*}}, <16 x i8> [[ABS]], <16 x i8> %{{.*}} return _mm_maskz_abs_epi8(__U,__A); } __m256i test_mm256_mask_abs_epi8(__m256i __W, __mmask32 __U, __m256i __A) { // CHECK-LABEL: @test_mm256_mask_abs_epi8 - // CHECK: [[SUB:%.*]] = sub <32 x i8> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <32 x i8> [[A]], zeroinitializer - // CHECK: [[SEL:%.*]] = select <32 x i1> [[CMP]], <32 x i8> [[A]], <32 x i8> [[SUB]] - // CHECK: [[TMP:%.*]] = bitcast [[SRCTY:<32 x i8>]] [[SEL]] to [[DSTTY:<4 x i64>]] - // CHECK: [[SEL:%.*]] = bitcast [[DSTTY]] [[TMP]] to [[SRCTY]] - // CHECK: select <32 x i1> %{{.*}}, <32 x i8> [[SEL]], <32 x i8> %{{.*}} + // CHECK: [[ABS:%.*]] = call <32 x i8> @llvm.abs.v32i8(<32 x i8> %{{.*}}, i1 false) + // CHECK: [[TMP:%.*]] = bitcast <32 x i8> [[ABS]] to <4 x i64> + // CHECK: [[ABS:%.*]] = bitcast <4 x i64> [[TMP]] to <32 x i8> + // CHECK: select <32 x i1> %{{.*}}, <32 x i8> [[ABS]], <32 x i8> %{{.*}} return _mm256_mask_abs_epi8(__W,__U,__A); } __m256i test_mm256_maskz_abs_epi8(__mmask32 __U, __m256i __A) { // CHECK-LABEL: @test_mm256_maskz_abs_epi8 - // CHECK: [[SUB:%.*]] = sub <32 x i8> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <32 x i8> [[A]], zeroinitializer - // CHECK: [[SEL:%.*]] = select <32 x i1> [[CMP]], <32 x i8> [[A]], <32 x i8> [[SUB]] - // CHECK: [[TMP:%.*]] = bitcast [[SRCTY:<32 x i8>]] [[SEL]] to [[DSTTY:<4 x i64>]] - // CHECK: [[SEL:%.*]] = bitcast [[DSTTY]] [[TMP]] to [[SRCTY]] - // CHECK: select <32 x i1> %{{.*}}, <32 x i8> [[SEL]], <32 x i8> %{{.*}} + // CHECK: [[ABS:%.*]] = call <32 x i8> @llvm.abs.v32i8(<32 x i8> %{{.*}}, i1 false) + // CHECK: [[TMP:%.*]] = bitcast <32 x i8> [[ABS]] to <4 x i64> + // CHECK: [[ABS:%.*]] = bitcast <4 x i64> [[TMP]] to <32 x i8> + // CHECK: select <32 x i1> %{{.*}}, <32 x i8> [[ABS]], <32 x i8> %{{.*}} return _mm256_maskz_abs_epi8(__U,__A); } __m128i test_mm_mask_abs_epi16(__m128i __W, __mmask8 __U, __m128i __A) { // CHECK-LABEL: @test_mm_mask_abs_epi16 - // CHECK: [[SUB:%.*]] = sub <8 x i16> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <8 x i16> [[A]], zeroinitializer - // CHECK: [[SEL:%.*]] = select <8 x i1> [[CMP]], <8 x i16> [[A]], <8 x i16> [[SUB]] - // CHECK: [[TMP:%.*]] = bitcast [[SRCTY:<8 x i16>]] [[SEL]] to [[DSTTY:<2 x i64>]] - // CHECK: [[SEL:%.*]] = bitcast [[DSTTY]] [[TMP]] to [[SRCTY]] - // CHECK: select <8 x i1> %{{.*}}, <8 x i16> [[SEL]], <8 x i16> %{{.*}} + // CHECK: [[ABS:%.*]] = call <8 x i16> @llvm.abs.v8i16(<8 x i16> %{{.*}}, i1 false) + // CHECK: [[TMP:%.*]] = bitcast <8 x i16> [[ABS]] to <2 x i64> + // CHECK: [[ABS:%.*]] = bitcast <2 x i64> [[TMP]] to <8 x i16> + // CHECK: select <8 x i1> %{{.*}}, <8 x i16> [[ABS]], <8 x i16> %{{.*}} return _mm_mask_abs_epi16(__W,__U,__A); } __m128i test_mm_maskz_abs_epi16(__mmask8 __U, __m128i __A) { // CHECK-LABEL: @test_mm_maskz_abs_epi16 - // CHECK: [[SUB:%.*]] = sub <8 x i16> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <8 x i16> [[A]], zeroinitializer - // CHECK: [[SEL:%.*]] = select <8 x i1> [[CMP]], <8 x i16> [[A]], <8 x i16> [[SUB]] - // CHECK: [[TMP:%.*]] = bitcast [[SRCTY:<8 x i16>]] [[SEL]] to [[DSTTY:<2 x i64>]] - // CHECK: [[SEL:%.*]] = bitcast [[DSTTY]] [[TMP]] to [[SRCTY]] - // CHECK: select <8 x i1> %{{.*}}, <8 x i16> [[SEL]], <8 x i16> %{{.*}} + // CHECK: [[ABS:%.*]] = call <8 x i16> @llvm.abs.v8i16(<8 x i16> %{{.*}}, i1 false) + // CHECK: [[TMP:%.*]] = bitcast <8 x i16> [[ABS]] to <2 x i64> + // CHECK: [[ABS:%.*]] = bitcast <2 x i64> [[TMP]] to <8 x i16> + // CHECK: select <8 x i1> %{{.*}}, <8 x i16> [[ABS]], <8 x i16> %{{.*}} return _mm_maskz_abs_epi16(__U,__A); } __m256i test_mm256_mask_abs_epi16(__m256i __W, __mmask16 __U, __m256i __A) { // CHECK-LABEL: @test_mm256_mask_abs_epi16 - // CHECK: [[SUB:%.*]] = sub <16 x i16> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <16 x i16> [[A]], zeroinitializer - // CHECK: [[SEL:%.*]] = select <16 x i1> [[CMP]], <16 x i16> [[A]], <16 x i16> [[SUB]] - // CHECK: [[TMP:%.*]] = bitcast [[SRCTY:<16 x i16>]] [[SEL]] to [[DSTTY:<4 x i64>]] - // CHECK: [[SEL:%.*]] = bitcast [[DSTTY]] [[TMP]] to [[SRCTY]] - // CHECK: select <16 x i1> %{{.*}}, <16 x i16> [[SEL]], <16 x i16> %{{.*}} + // CHECK: [[ABS:%.*]] = call <16 x i16> @llvm.abs.v16i16(<16 x i16> %{{.*}}, i1 false) + // CHECK: [[TMP:%.*]] = bitcast <16 x i16> [[ABS]] to <4 x i64> + // CHECK: [[ABS:%.*]] = bitcast <4 x i64> [[TMP]] to <16 x i16> + // CHECK: select <16 x i1> %{{.*}}, <16 x i16> [[ABS]], <16 x i16> %{{.*}} return _mm256_mask_abs_epi16(__W,__U,__A); } __m256i test_mm256_maskz_abs_epi16(__mmask16 __U, __m256i __A) { // CHECK-LABEL: @test_mm256_maskz_abs_epi16 - // CHECK: [[SUB:%.*]] = sub <16 x i16> zeroinitializer, [[A:%.*]] - // CHECK: [[CMP:%.*]] = icmp sgt <16 x i16> [[A]], zeroinitializer - // CHECK: [[SEL:%.*]] = select <16 x i1> [[CMP]], <16 x i16> [[A]], <16 x i16> [[SUB]] - // CHECK: [[TMP:%.*]] = bitcast [[SRCTY:<16 x i16>]] [[SEL]] to [[DSTTY:<4 x i64>]] - // CHECK: [[SEL:%.*]] = bitcast [[DSTTY]] [[TMP]] to [[SRCTY]] - // CHECK: select <16 x i1> %{{.*}}, <16 x i16> [[SEL]], <16 x i16> %{{.*}} + // CHECK: [[ABS:%.*]] = call <16 x i16> @llvm.abs.v16i16(<16 x i16> %{{.*}}, i1 false) + // CHECK: [[TMP:%.*]] = bitcast <16 x i16> [[ABS]] to <4 x i64> + // CHECK: [[ABS:%.*]] = bitcast <4 x i64> [[TMP]] to <16 x i16> + // CHECK: select <16 x i1> %{{.*}}, <16 x i16> [[ABS]], <16 x i16> %{{.*}} return _mm256_maskz_abs_epi16(__U,__A); } diff --git a/clang/test/CodeGen/ssse3-builtins.c b/clang/test/CodeGen/ssse3-builtins.c --- a/clang/test/CodeGen/ssse3-builtins.c +++ b/clang/test/CodeGen/ssse3-builtins.c @@ -7,25 +7,19 @@ __m128i test_mm_abs_epi8(__m128i a) { // CHECK-LABEL: test_mm_abs_epi8 - // CHECK: [[SUB:%.+]] = sub <16 x i8> zeroinitializer, [[A:%.+]] - // CHECK: [[CMP:%.+]] = icmp sgt <16 x i8> [[A]], zeroinitializer - // CHECK: %{{.*}} = select <16 x i1> [[CMP]], <16 x i8> [[A]], <16 x i8> [[SUB]] + // CHECK: [[ABS:%.*]] = call <16 x i8> @llvm.abs.v16i8(<16 x i8> %{{.*}}, i1 false) return _mm_abs_epi8(a); } __m128i test_mm_abs_epi16(__m128i a) { // CHECK-LABEL: test_mm_abs_epi16 - // CHECK: [[SUB:%.+]] = sub <8 x i16> zeroinitializer, [[A:%.+]] - // CHECK: [[CMP:%.+]] = icmp sgt <8 x i16> [[A]], zeroinitializer - // CHECK: %{{.*}} = select <8 x i1> [[CMP]], <8 x i16> [[A]], <8 x i16> [[SUB]] + // CHECK: [[ABS:%.*]] = call <8 x i16> @llvm.abs.v8i16(<8 x i16> %{{.*}}, i1 false) return _mm_abs_epi16(a); } __m128i test_mm_abs_epi32(__m128i a) { // CHECK-LABEL: test_mm_abs_epi32 - // CHECK: [[SUB:%.+]] = sub <4 x i32> zeroinitializer, [[A:%.+]] - // CHECK: [[CMP:%.+]] = icmp sgt <4 x i32> [[A]], zeroinitializer - // CHECK: %{{.*}} = select <4 x i1> [[CMP]], <4 x i32> [[A]], <4 x i32> [[SUB]] + // CHECK: [[ABS:%.*]] = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %{{.*}}, i1 false) return _mm_abs_epi32(a); } diff --git a/llvm/test/CodeGen/X86/avx2-intrinsics-fast-isel.ll b/llvm/test/CodeGen/X86/avx2-intrinsics-fast-isel.ll --- a/llvm/test/CodeGen/X86/avx2-intrinsics-fast-isel.ll +++ b/llvm/test/CodeGen/X86/avx2-intrinsics-fast-isel.ll @@ -10,13 +10,11 @@ ; CHECK-NEXT: vpabsb %ymm0, %ymm0 ; CHECK-NEXT: ret{{[l|q]}} %arg = bitcast <4 x i64> %a0 to <32 x i8> - %sub = sub <32 x i8> zeroinitializer, %arg - %cmp = icmp sgt <32 x i8> %arg, zeroinitializer - %sel = select <32 x i1> %cmp, <32 x i8> %arg, <32 x i8> %sub - %res = bitcast <32 x i8> %sel to <4 x i64> + %abs = call <32 x i8> @llvm.abs.v32i8(<32 x i8> %arg, i1 false) + %res = bitcast <32 x i8> %abs to <4 x i64> ret <4 x i64> %res } -declare <32 x i8> @llvm.x86.avx2.pabs.b(<32 x i8>) nounwind readnone +declare <32 x i8> @llvm.abs.v32i8(<32 x i8>, i1) nounwind readnone define <4 x i64> @test_mm256_abs_epi16(<4 x i64> %a0) { ; CHECK-LABEL: test_mm256_abs_epi16: @@ -24,13 +22,11 @@ ; CHECK-NEXT: vpabsw %ymm0, %ymm0 ; CHECK-NEXT: ret{{[l|q]}} %arg = bitcast <4 x i64> %a0 to <16 x i16> - %sub = sub <16 x i16> zeroinitializer, %arg - %cmp = icmp sgt <16 x i16> %arg, zeroinitializer - %sel = select <16 x i1> %cmp, <16 x i16> %arg, <16 x i16> %sub - %res = bitcast <16 x i16> %sel to <4 x i64> + %abs = call <16 x i16> @llvm.abs.v16i16(<16 x i16> %arg, i1 false) + %res = bitcast <16 x i16> %abs to <4 x i64> ret <4 x i64> %res } -declare <16 x i16> @llvm.x86.avx2.pabs.w(<16 x i16>) nounwind readnone +declare <16 x i16> @llvm.abs.v16i16(<16 x i16>, i1) nounwind readnone define <4 x i64> @test_mm256_abs_epi32(<4 x i64> %a0) { ; CHECK-LABEL: test_mm256_abs_epi32: @@ -38,13 +34,11 @@ ; CHECK-NEXT: vpabsd %ymm0, %ymm0 ; CHECK-NEXT: ret{{[l|q]}} %arg = bitcast <4 x i64> %a0 to <8 x i32> - %sub = sub <8 x i32> zeroinitializer, %arg - %cmp = icmp sgt <8 x i32> %arg, zeroinitializer - %sel = select <8 x i1> %cmp, <8 x i32> %arg, <8 x i32> %sub - %res = bitcast <8 x i32> %sel to <4 x i64> + %abs = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %arg, i1 false) + %res = bitcast <8 x i32> %abs to <4 x i64> ret <4 x i64> %res } -declare <8 x i32> @llvm.x86.avx2.pabs.d(<8 x i32>) nounwind readnone +declare <8 x i32> @llvm.abs.v8i32(<8 x i32>, i1) nounwind readnone define <4 x i64> @test_mm256_add_epi8(<4 x i64> %a0, <4 x i64> %a1) nounwind { ; CHECK-LABEL: test_mm256_add_epi8: diff --git a/llvm/test/CodeGen/X86/ssse3-intrinsics-fast-isel.ll b/llvm/test/CodeGen/X86/ssse3-intrinsics-fast-isel.ll --- a/llvm/test/CodeGen/X86/ssse3-intrinsics-fast-isel.ll +++ b/llvm/test/CodeGen/X86/ssse3-intrinsics-fast-isel.ll @@ -19,13 +19,11 @@ ; AVX-NEXT: vpabsb %xmm0, %xmm0 ; AVX-NEXT: ret{{[l|q]}} %arg = bitcast <2 x i64> %a0 to <16 x i8> - %sub = sub <16 x i8> zeroinitializer, %arg - %cmp = icmp sgt <16 x i8> %arg, zeroinitializer - %sel = select <16 x i1> %cmp, <16 x i8> %arg, <16 x i8> %sub - %res = bitcast <16 x i8> %sel to <2 x i64> + %abs = call <16 x i8> @llvm.abs.v16i8(<16 x i8> %arg, i1 false) + %res = bitcast <16 x i8> %abs to <2 x i64> ret <2 x i64> %res } -declare <16 x i8> @llvm.x86.ssse3.pabs.b.128(<16 x i8>) nounwind readnone +declare <16 x i8> @llvm.abs.v16i8(<16 x i8>, i1) nounwind readnone define <2 x i64> @test_mm_abs_epi16(<2 x i64> %a0) { ; SSE-LABEL: test_mm_abs_epi16: @@ -38,13 +36,11 @@ ; AVX-NEXT: vpabsw %xmm0, %xmm0 ; AVX-NEXT: ret{{[l|q]}} %arg = bitcast <2 x i64> %a0 to <8 x i16> - %sub = sub <8 x i16> zeroinitializer, %arg - %cmp = icmp sgt <8 x i16> %arg, zeroinitializer - %sel = select <8 x i1> %cmp, <8 x i16> %arg, <8 x i16> %sub - %res = bitcast <8 x i16> %sel to <2 x i64> + %abs = call <8 x i16> @llvm.abs.v8i16(<8 x i16> %arg, i1 false) + %res = bitcast <8 x i16> %abs to <2 x i64> ret <2 x i64> %res } -declare <8 x i16> @llvm.x86.ssse3.pabs.w.128(<8 x i16>) nounwind readnone +declare <8 x i16> @llvm.abs.v8i16(<8 x i16>, i1) nounwind readnone define <2 x i64> @test_mm_abs_epi32(<2 x i64> %a0) { ; SSE-LABEL: test_mm_abs_epi32: @@ -57,13 +53,11 @@ ; AVX-NEXT: vpabsd %xmm0, %xmm0 ; AVX-NEXT: ret{{[l|q]}} %arg = bitcast <2 x i64> %a0 to <4 x i32> - %sub = sub <4 x i32> zeroinitializer, %arg - %cmp = icmp sgt <4 x i32> %arg, zeroinitializer - %sel = select <4 x i1> %cmp, <4 x i32> %arg, <4 x i32> %sub - %res = bitcast <4 x i32> %sel to <2 x i64> + %abs = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %arg, i1 false) + %res = bitcast <4 x i32> %abs to <2 x i64> ret <2 x i64> %res } -declare <4 x i32> @llvm.x86.ssse3.pabs.d.128(<4 x i32>) nounwind readnone +declare <4 x i32> @llvm.abs.v4i32(<4 x i32>, i1) nounwind readnone define <2 x i64> @test_mm_alignr_epi8(<2 x i64> %a0, <2 x i64> %a1) { ; SSE-LABEL: test_mm_alignr_epi8: