; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt < %s -passes=instcombine -mtriple=x86_64-unknown-unknown -S | FileCheck %s ; ; UNDEF Elts ; define <8 x i16> @undef_pmulh_128(<8 x i16> %a0) { ; CHECK-LABEL: @undef_pmulh_128( ; CHECK-NEXT: ret <8 x i16> zeroinitializer ; %1 = call <8 x i16> @llvm.x86.ssse3.pmul.hr.sw.128(<8 x i16> %a0, <8 x i16> undef) ret <8 x i16> %1 } define <8 x i16> @undef_pmulh_128_commute(<8 x i16> %a0) { ; CHECK-LABEL: @undef_pmulh_128_commute( ; CHECK-NEXT: ret <8 x i16> zeroinitializer ; %1 = call <8 x i16> @llvm.x86.ssse3.pmul.hr.sw.128(<8 x i16> undef, <8 x i16> %a0) ret <8 x i16> %1 } define <16 x i16> @undef_pmulh_256(<16 x i16> %a0) { ; CHECK-LABEL: @undef_pmulh_256( ; CHECK-NEXT: ret <16 x i16> zeroinitializer ; %1 = call <16 x i16> @llvm.x86.avx2.pmul.hr.sw(<16 x i16> %a0, <16 x i16> undef) ret <16 x i16> %1 } define <16 x i16> @undef_pmulh_256_commute(<16 x i16> %a0) { ; CHECK-LABEL: @undef_pmulh_256_commute( ; CHECK-NEXT: ret <16 x i16> zeroinitializer ; %1 = call <16 x i16> @llvm.x86.avx2.pmul.hr.sw(<16 x i16> undef, <16 x i16> %a0) ret <16 x i16> %1 } define <32 x i16> @undef_pmulh_512(<32 x i16> %a0) { ; CHECK-LABEL: @undef_pmulh_512( ; CHECK-NEXT: ret <32 x i16> zeroinitializer ; %1 = call <32 x i16> @llvm.x86.avx512.pmul.hr.sw.512(<32 x i16> %a0, <32 x i16> undef) ret <32 x i16> %1 } define <32 x i16> @undef_pmulh_512_commute(<32 x i16> %a0) { ; CHECK-LABEL: @undef_pmulh_512_commute( ; CHECK-NEXT: ret <32 x i16> zeroinitializer ; %1 = call <32 x i16> @llvm.x86.avx512.pmul.hr.sw.512(<32 x i16> undef, <32 x i16> %a0) ret <32 x i16> %1 } ; ; Zero Elts ; define <8 x i16> @zero_pmulh_128(<8 x i16> %a0) { ; CHECK-LABEL: @zero_pmulh_128( ; CHECK-NEXT: ret <8 x i16> zeroinitializer ; %1 = call <8 x i16> @llvm.x86.ssse3.pmul.hr.sw.128(<8 x i16> %a0, <8 x i16> zeroinitializer) ret <8 x i16> %1 } define <8 x i16> @zero_pmulh_128_commute(<8 x i16> %a0) { ; CHECK-LABEL: @zero_pmulh_128_commute( ; CHECK-NEXT: ret <8 x i16> zeroinitializer ; %1 = call <8 x i16> @llvm.x86.ssse3.pmul.hr.sw.128(<8 x i16> zeroinitializer, <8 x i16> %a0) ret <8 x i16> %1 } define <16 x i16> @zero_pmulh_256(<16 x i16> %a0) { ; CHECK-LABEL: @zero_pmulh_256( ; CHECK-NEXT: ret <16 x i16> zeroinitializer ; %1 = call <16 x i16> @llvm.x86.avx2.pmul.hr.sw(<16 x i16> %a0, <16 x i16> zeroinitializer) ret <16 x i16> %1 } define <16 x i16> @zero_pmulh_256_commute(<16 x i16> %a0) { ; CHECK-LABEL: @zero_pmulh_256_commute( ; CHECK-NEXT: ret <16 x i16> zeroinitializer ; %1 = call <16 x i16> @llvm.x86.avx2.pmul.hr.sw(<16 x i16> zeroinitializer, <16 x i16> %a0) ret <16 x i16> %1 } define <32 x i16> @zero_pmulh_512(<32 x i16> %a0) { ; CHECK-LABEL: @zero_pmulh_512( ; CHECK-NEXT: ret <32 x i16> zeroinitializer ; %1 = call <32 x i16> @llvm.x86.avx512.pmul.hr.sw.512(<32 x i16> %a0, <32 x i16> zeroinitializer) ret <32 x i16> %1 } define <32 x i16> @zero_pmulh_512_commute(<32 x i16> %a0) { ; CHECK-LABEL: @zero_pmulh_512_commute( ; CHECK-NEXT: ret <32 x i16> zeroinitializer ; %1 = call <32 x i16> @llvm.x86.avx512.pmul.hr.sw.512(<32 x i16> zeroinitializer, <32 x i16> %a0) ret <32 x i16> %1 } ; ; Multiply by One ; define <8 x i16> @one_pmulh_128(<8 x i16> %a0) { ; CHECK-LABEL: @one_pmulh_128( ; CHECK-NEXT: [[TMP1:%.*]] = call <8 x i16> @llvm.x86.ssse3.pmul.hr.sw.128(<8 x i16> [[A0:%.*]], <8 x i16> splat (i16 1)) ; CHECK-NEXT: ret <8 x i16> [[TMP1]] ; %1 = call <8 x i16> @llvm.x86.ssse3.pmul.hr.sw.128(<8 x i16> %a0, <8 x i16> ) ret <8 x i16> %1 } define <8 x i16> @one_pmulh_128_commute(<8 x i16> %a0) { ; CHECK-LABEL: @one_pmulh_128_commute( ; CHECK-NEXT: [[TMP1:%.*]] = call <8 x i16> @llvm.x86.ssse3.pmul.hr.sw.128(<8 x i16> splat (i16 1), <8 x i16> [[A0:%.*]]) ; CHECK-NEXT: ret <8 x i16> [[TMP1]] ; %1 = call <8 x i16> @llvm.x86.ssse3.pmul.hr.sw.128(<8 x i16> , <8 x i16> %a0) ret <8 x i16> %1 } define <16 x i16> @one_pmulh_256(<16 x i16> %a0) { ; CHECK-LABEL: @one_pmulh_256( ; CHECK-NEXT: [[TMP1:%.*]] = call <16 x i16> @llvm.x86.avx2.pmul.hr.sw(<16 x i16> [[A0:%.*]], <16 x i16> splat (i16 1)) ; CHECK-NEXT: ret <16 x i16> [[TMP1]] ; %1 = call <16 x i16> @llvm.x86.avx2.pmul.hr.sw(<16 x i16> %a0, <16 x i16> ) ret <16 x i16> %1 } define <16 x i16> @one_pmulh_256_commute(<16 x i16> %a0) { ; CHECK-LABEL: @one_pmulh_256_commute( ; CHECK-NEXT: [[TMP1:%.*]] = call <16 x i16> @llvm.x86.avx2.pmul.hr.sw(<16 x i16> splat (i16 1), <16 x i16> [[A0:%.*]]) ; CHECK-NEXT: ret <16 x i16> [[TMP1]] ; %1 = call <16 x i16> @llvm.x86.avx2.pmul.hr.sw(<16 x i16> , <16 x i16> %a0) ret <16 x i16> %1 } define <32 x i16> @one_pmulh_512(<32 x i16> %a0) { ; CHECK-LABEL: @one_pmulh_512( ; CHECK-NEXT: [[TMP1:%.*]] = call <32 x i16> @llvm.x86.avx512.pmul.hr.sw.512(<32 x i16> [[A0:%.*]], <32 x i16> splat (i16 1)) ; CHECK-NEXT: ret <32 x i16> [[TMP1]] ; %1 = call <32 x i16> @llvm.x86.avx512.pmul.hr.sw.512(<32 x i16> %a0, <32 x i16> ) ret <32 x i16> %1 } define <32 x i16> @one_pmulh_512_commute(<32 x i16> %a0) { ; CHECK-LABEL: @one_pmulh_512_commute( ; CHECK-NEXT: [[TMP1:%.*]] = call <32 x i16> @llvm.x86.avx512.pmul.hr.sw.512(<32 x i16> splat (i16 1), <32 x i16> [[A0:%.*]]) ; CHECK-NEXT: ret <32 x i16> [[TMP1]] ; %1 = call <32 x i16> @llvm.x86.avx512.pmul.hr.sw.512(<32 x i16> , <32 x i16> %a0) ret <32 x i16> %1 } ; ; Constant Folding ; define <8 x i16> @fold_pmulh_128() { ; CHECK-LABEL: @fold_pmulh_128( ; CHECK-NEXT: ret <8 x i16> ; %1 = call <8 x i16> @llvm.x86.ssse3.pmul.hr.sw.128(<8 x i16> , <8 x i16> ) ret <8 x i16> %1 } define <16 x i16> @fold_pmulh_256() { ; CHECK-LABEL: @fold_pmulh_256( ; CHECK-NEXT: ret <16 x i16> ; %1 = call <16 x i16> @llvm.x86.avx2.pmul.hr.sw(<16 x i16> , <16 x i16> ) ret <16 x i16> %1 } define <32 x i16> @fold_pmulh_512() { ; CHECK-LABEL: @fold_pmulh_512( ; CHECK-NEXT: ret <32 x i16> ; %1 = call <32 x i16> @llvm.x86.avx512.pmul.hr.sw.512(<32 x i16> , <32 x i16> ) ret <32 x i16> %1 } ; ; Demanded Elts ; define <8 x i16> @elts_pmulh_128(<8 x i16> %a0, <8 x i16> %a1) { ; CHECK-LABEL: @elts_pmulh_128( ; CHECK-NEXT: [[TMP1:%.*]] = call <8 x i16> @llvm.x86.ssse3.pmul.hr.sw.128(<8 x i16> [[A0:%.*]], <8 x i16> [[A1:%.*]]) ; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <8 x i16> [[TMP1]], <8 x i16> poison, <8 x i32> zeroinitializer ; CHECK-NEXT: ret <8 x i16> [[TMP2]] ; %1 = shufflevector <8 x i16> %a0, <8 x i16> undef, <8 x i32> %2 = shufflevector <8 x i16> %a1, <8 x i16> undef, <8 x i32> %3 = call <8 x i16> @llvm.x86.ssse3.pmul.hr.sw.128(<8 x i16> %1, <8 x i16> %2) %4 = shufflevector <8 x i16> %3, <8 x i16> poison, <8 x i32> zeroinitializer ret <8 x i16> %4 } define <16 x i16> @elts_pmulh_256(<16 x i16> %a0, <16 x i16> %a1) { ; CHECK-LABEL: @elts_pmulh_256( ; CHECK-NEXT: [[TMP1:%.*]] = call <16 x i16> @llvm.x86.avx2.pmul.hr.sw(<16 x i16> [[A0:%.*]], <16 x i16> [[A1:%.*]]) ; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <16 x i16> [[TMP1]], <16 x i16> poison, <16 x i32> zeroinitializer ; CHECK-NEXT: ret <16 x i16> [[TMP2]] ; %1 = shufflevector <16 x i16> %a0, <16 x i16> undef, <16 x i32> %2 = shufflevector <16 x i16> %a1, <16 x i16> undef, <16 x i32> %3 = call <16 x i16> @llvm.x86.avx2.pmul.hr.sw(<16 x i16> %1, <16 x i16> %2) %4 = shufflevector <16 x i16> %3, <16 x i16> poison, <16 x i32> zeroinitializer ret <16 x i16> %4 } define <32 x i16> @elts_pmulh_512(<32 x i16> %a0, <32 x i16> %a1) { ; CHECK-LABEL: @elts_pmulh_512( ; CHECK-NEXT: [[TMP1:%.*]] = call <32 x i16> @llvm.x86.avx512.pmul.hr.sw.512(<32 x i16> [[A0:%.*]], <32 x i16> [[A1:%.*]]) ; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <32 x i16> [[TMP1]], <32 x i16> poison, <32 x i32> zeroinitializer ; CHECK-NEXT: ret <32 x i16> [[TMP2]] ; %1 = shufflevector <32 x i16> %a0, <32 x i16> undef, <32 x i32> %2 = shufflevector <32 x i16> %a1, <32 x i16> undef, <32 x i32> %3 = call <32 x i16> @llvm.x86.avx512.pmul.hr.sw.512(<32 x i16> %1, <32 x i16> %2) %4 = shufflevector <32 x i16> %3, <32 x i16> poison, <32 x i32> zeroinitializer ret <32 x i16> %4 }