1b22fa909Smskamp; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2b22fa909Smskamp; RUN: opt -S -passes=instcombine < %s | FileCheck %s 3b22fa909Smskamp 4b22fa909Smskampdefine <4 x i1> @hadd_and_eq_v4i32(<4 x i32> %x, <4 x i32> %y) { 5b22fa909Smskamp; CHECK-LABEL: define <4 x i1> @hadd_and_eq_v4i32( 6b22fa909Smskamp; CHECK-SAME: <4 x i32> [[X:%.*]], <4 x i32> [[Y:%.*]]) { 7b22fa909Smskamp; CHECK-NEXT: entry: 8b22fa909Smskamp; CHECK-NEXT: ret <4 x i1> zeroinitializer 9b22fa909Smskamp; 10b22fa909Smskampentry: 11b22fa909Smskamp %and1 = and <4 x i32> %x, <i32 3, i32 3, i32 3, i32 3> 12b22fa909Smskamp %and2 = and <4 x i32> %y, <i32 3, i32 3, i32 3, i32 3> 13b22fa909Smskamp %hadd = tail call <4 x i32> @llvm.x86.ssse3.phadd.d.128(<4 x i32> %and1, <4 x i32> %and2) 14b22fa909Smskamp %andr = and <4 x i32> %hadd, <i32 -8, i32 -8, i32 -8, i32 -8> 15b22fa909Smskamp %ret = icmp eq <4 x i32> %andr, <i32 3, i32 4, i32 5, i32 6> 16b22fa909Smskamp ret <4 x i1> %ret 17b22fa909Smskamp} 18b22fa909Smskamp 19b22fa909Smskampdefine <8 x i1> @hadd_and_eq_v8i16(<8 x i16> %x, <8 x i16> %y) { 20b22fa909Smskamp; CHECK-LABEL: define <8 x i1> @hadd_and_eq_v8i16( 21b22fa909Smskamp; CHECK-SAME: <8 x i16> [[X:%.*]], <8 x i16> [[Y:%.*]]) { 22b22fa909Smskamp; CHECK-NEXT: entry: 23b22fa909Smskamp; CHECK-NEXT: ret <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 true> 24b22fa909Smskamp; 25b22fa909Smskampentry: 26b22fa909Smskamp %and1 = and <8 x i16> %x, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3> 27b22fa909Smskamp %and2 = and <8 x i16> %y, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3> 28b22fa909Smskamp %hadd = tail call <8 x i16> @llvm.x86.ssse3.phadd.w.128(<8 x i16> %and1, <8 x i16> %and2) 29b22fa909Smskamp %andr = and <8 x i16> %hadd, <i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8> 30b22fa909Smskamp %ret = icmp eq <8 x i16> %andr, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 0> 31b22fa909Smskamp ret <8 x i1> %ret 32b22fa909Smskamp} 33b22fa909Smskamp 34b22fa909Smskampdefine <8 x i1> @hadd_and_eq_v8i16_sat(<8 x i16> %x, <8 x i16> %y) { 35b22fa909Smskamp; CHECK-LABEL: define <8 x i1> @hadd_and_eq_v8i16_sat( 36b22fa909Smskamp; CHECK-SAME: <8 x i16> [[X:%.*]], <8 x i16> [[Y:%.*]]) { 37b22fa909Smskamp; CHECK-NEXT: entry: 38b22fa909Smskamp; CHECK-NEXT: ret <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 true> 39b22fa909Smskamp; 40b22fa909Smskampentry: 41b22fa909Smskamp %and1 = and <8 x i16> %x, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3> 42b22fa909Smskamp %and2 = and <8 x i16> %y, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3> 43b22fa909Smskamp %hadd = tail call <8 x i16> @llvm.x86.ssse3.phadd.sw.128(<8 x i16> %and1, <8 x i16> %and2) 44b22fa909Smskamp %andr = and <8 x i16> %hadd, <i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8> 45b22fa909Smskamp %ret = icmp eq <8 x i16> %andr, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 0> 46b22fa909Smskamp ret <8 x i1> %ret 47b22fa909Smskamp} 48b22fa909Smskamp 49b22fa909Smskampdefine <8 x i1> @hadd_and_eq_v8i32(<8 x i32> %x, <8 x i32> %y) { 50b22fa909Smskamp; CHECK-LABEL: define <8 x i1> @hadd_and_eq_v8i32( 51b22fa909Smskamp; CHECK-SAME: <8 x i32> [[X:%.*]], <8 x i32> [[Y:%.*]]) { 52b22fa909Smskamp; CHECK-NEXT: entry: 53b22fa909Smskamp; CHECK-NEXT: ret <8 x i1> zeroinitializer 54b22fa909Smskamp; 55b22fa909Smskampentry: 56b22fa909Smskamp %and1 = and <8 x i32> %x, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3> 57b22fa909Smskamp %and2 = and <8 x i32> %y, <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3> 58b22fa909Smskamp %hadd = tail call <8 x i32> @llvm.x86.avx2.phadd.d(<8 x i32> %and1, <8 x i32> %and2) 59b22fa909Smskamp %andr = and <8 x i32> %hadd, <i32 -8, i32 -8, i32 -8, i32 -8, i32 -8, i32 -8, i32 -8, i32 -8> 60b22fa909Smskamp %ret = icmp eq <8 x i32> %andr, <i32 3, i32 4, i32 5, i32 6, i32 3, i32 4, i32 5, i32 6> 61b22fa909Smskamp ret <8 x i1> %ret 62b22fa909Smskamp} 63b22fa909Smskamp 64b22fa909Smskampdefine <16 x i1> @hadd_and_eq_v16i16(<16 x i16> %x, <16 x i16> %y) { 65b22fa909Smskamp; CHECK-LABEL: define <16 x i1> @hadd_and_eq_v16i16( 66b22fa909Smskamp; CHECK-SAME: <16 x i16> [[X:%.*]], <16 x i16> [[Y:%.*]]) { 67b22fa909Smskamp; CHECK-NEXT: entry: 68b22fa909Smskamp; CHECK-NEXT: ret <16 x i1> <i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 true, i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 true> 69b22fa909Smskamp; 70b22fa909Smskampentry: 71b22fa909Smskamp %and1 = and <16 x i16> %x, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3> 72b22fa909Smskamp %and2 = and <16 x i16> %y, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3> 73b22fa909Smskamp %hadd = tail call <16 x i16> @llvm.x86.avx2.phadd.w(<16 x i16> %and1, <16 x i16> %and2) 74b22fa909Smskamp %andr = and <16 x i16> %hadd, <i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8> 75b22fa909Smskamp %ret = icmp eq <16 x i16> %andr, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 0, i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 0> 76b22fa909Smskamp ret <16 x i1> %ret 77b22fa909Smskamp} 78b22fa909Smskamp 79b22fa909Smskampdefine <16 x i1> @hadd_and_eq_v16i16_sat(<16 x i16> %x, <16 x i16> %y) { 80b22fa909Smskamp; CHECK-LABEL: define <16 x i1> @hadd_and_eq_v16i16_sat( 81b22fa909Smskamp; CHECK-SAME: <16 x i16> [[X:%.*]], <16 x i16> [[Y:%.*]]) { 82b22fa909Smskamp; CHECK-NEXT: entry: 83b22fa909Smskamp; CHECK-NEXT: ret <16 x i1> <i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 true, i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 true> 84b22fa909Smskamp; 85b22fa909Smskampentry: 86b22fa909Smskamp %and1 = and <16 x i16> %x, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3> 87b22fa909Smskamp %and2 = and <16 x i16> %y, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3> 88b22fa909Smskamp %hadd = tail call <16 x i16> @llvm.x86.avx2.phadd.sw(<16 x i16> %and1, <16 x i16> %and2) 89b22fa909Smskamp %andr = and <16 x i16> %hadd, <i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8, i16 -8> 90b22fa909Smskamp %ret = icmp eq <16 x i16> %andr, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 0, i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 0> 91b22fa909Smskamp ret <16 x i1> %ret 92b22fa909Smskamp} 93b22fa909Smskamp 94b22fa909Smskampdefine <4 x i1> @hsub_trunc_eq_v4i32(<4 x i32> %x, <4 x i32> %y) { 95b22fa909Smskamp; CHECK-LABEL: define <4 x i1> @hsub_trunc_eq_v4i32( 96b22fa909Smskamp; CHECK-SAME: <4 x i32> [[X:%.*]], <4 x i32> [[Y:%.*]]) { 97b22fa909Smskamp; CHECK-NEXT: entry: 98b22fa909Smskamp; CHECK-NEXT: ret <4 x i1> zeroinitializer 99b22fa909Smskamp; 100b22fa909Smskampentry: 101b22fa909Smskamp %or1 = or <4 x i32> %x, <i32 65535, i32 65535, i32 65535, i32 65535> 102b22fa909Smskamp %or2 = or <4 x i32> %y, <i32 65535, i32 65535, i32 65535, i32 65535> 103b22fa909Smskamp %hsub = tail call <4 x i32> @llvm.x86.ssse3.phsub.d.128(<4 x i32> %or1, <4 x i32> %or2) 104b22fa909Smskamp %conv = trunc <4 x i32> %hsub to <4 x i16> 105b22fa909Smskamp %ret = icmp eq <4 x i16> %conv, <i16 3, i16 4, i16 5, i16 6> 106b22fa909Smskamp ret <4 x i1> %ret 107b22fa909Smskamp} 108b22fa909Smskamp 109b22fa909Smskampdefine <8 x i1> @hsub_trunc_eq_v8i16(<8 x i16> %x, <8 x i16> %y) { 110b22fa909Smskamp; CHECK-LABEL: define <8 x i1> @hsub_trunc_eq_v8i16( 111b22fa909Smskamp; CHECK-SAME: <8 x i16> [[X:%.*]], <8 x i16> [[Y:%.*]]) { 112b22fa909Smskamp; CHECK-NEXT: entry: 113b22fa909Smskamp; CHECK-NEXT: ret <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 true> 114b22fa909Smskamp; 115b22fa909Smskampentry: 116b22fa909Smskamp %or1 = or <8 x i16> %x, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 117b22fa909Smskamp %or2 = or <8 x i16> %y, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 118b22fa909Smskamp %hsub = tail call <8 x i16> @llvm.x86.ssse3.phsub.w.128(<8 x i16> %or1, <8 x i16> %or2) 119b22fa909Smskamp %conv = trunc <8 x i16> %hsub to <8 x i8> 120b22fa909Smskamp %ret = icmp eq <8 x i8> %conv, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 0> 121b22fa909Smskamp ret <8 x i1> %ret 122b22fa909Smskamp} 123b22fa909Smskamp 124b22fa909Smskampdefine <8 x i1> @hsub_and_eq_v8i16_sat(<8 x i16> %x, <8 x i16> %y) { 125b22fa909Smskamp; CHECK-LABEL: define <8 x i1> @hsub_and_eq_v8i16_sat( 126b22fa909Smskamp; CHECK-SAME: <8 x i16> [[X:%.*]], <8 x i16> [[Y:%.*]]) { 127b22fa909Smskamp; CHECK-NEXT: entry: 128*38fffa63SPaul Walker; CHECK-NEXT: ret <8 x i1> splat (i1 true) 129b22fa909Smskamp; 130b22fa909Smskampentry: 131b22fa909Smskamp %or1 = or <8 x i16> %x, <i16 3, i16 0, i16 3, i16 0, i16 3, i16 0, i16 3, i16 0> 132b22fa909Smskamp %or2 = or <8 x i16> %y, <i16 3, i16 0, i16 3, i16 0, i16 3, i16 0, i16 3, i16 0> 133b22fa909Smskamp %and1 = and <8 x i16> %or1, <i16 7, i16 3, i16 7, i16 3, i16 7, i16 3, i16 7, i16 3> 134b22fa909Smskamp %and2 = and <8 x i16> %or2, <i16 7, i16 3, i16 7, i16 3, i16 7, i16 3, i16 7, i16 3> 135b22fa909Smskamp %hsub = tail call <8 x i16> @llvm.x86.ssse3.phsub.sw.128(<8 x i16> %and1, <8 x i16> %and2) 136b22fa909Smskamp %ret = icmp sle <8 x i16> %hsub, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7> 137b22fa909Smskamp ret <8 x i1> %ret 138b22fa909Smskamp} 139b22fa909Smskamp 140b22fa909Smskampdefine <8 x i1> @hsub_trunc_eq_v8i32(<8 x i32> %x, <8 x i32> %y) { 141b22fa909Smskamp; CHECK-LABEL: define <8 x i1> @hsub_trunc_eq_v8i32( 142b22fa909Smskamp; CHECK-SAME: <8 x i32> [[X:%.*]], <8 x i32> [[Y:%.*]]) { 143b22fa909Smskamp; CHECK-NEXT: entry: 144b22fa909Smskamp; CHECK-NEXT: ret <8 x i1> zeroinitializer 145b22fa909Smskamp; 146b22fa909Smskampentry: 147b22fa909Smskamp %or1 = or <8 x i32> %x, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535> 148b22fa909Smskamp %or2 = or <8 x i32> %y, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535> 149b22fa909Smskamp %hsub = tail call <8 x i32> @llvm.x86.avx2.phsub.d(<8 x i32> %or1, <8 x i32> %or2) 150b22fa909Smskamp %conv = trunc <8 x i32> %hsub to <8 x i16> 151b22fa909Smskamp %ret = icmp eq <8 x i16> %conv, <i16 3, i16 4, i16 5, i16 6, i16 3, i16 4, i16 5, i16 6> 152b22fa909Smskamp ret <8 x i1> %ret 153b22fa909Smskamp} 154b22fa909Smskamp 155b22fa909Smskampdefine <16 x i1> @hsub_trunc_eq_v16i16(<16 x i16> %x, <16 x i16> %y) { 156b22fa909Smskamp; CHECK-LABEL: define <16 x i1> @hsub_trunc_eq_v16i16( 157b22fa909Smskamp; CHECK-SAME: <16 x i16> [[X:%.*]], <16 x i16> [[Y:%.*]]) { 158b22fa909Smskamp; CHECK-NEXT: entry: 159b22fa909Smskamp; CHECK-NEXT: ret <16 x i1> <i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 true, i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 true> 160b22fa909Smskamp; 161b22fa909Smskampentry: 162b22fa909Smskamp %or1 = or <16 x i16> %x, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 163b22fa909Smskamp %or2 = or <16 x i16> %y, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 164b22fa909Smskamp %hsub = tail call <16 x i16> @llvm.x86.avx2.phsub.w(<16 x i16> %or1, <16 x i16> %or2) 165b22fa909Smskamp %conv = trunc <16 x i16> %hsub to <16 x i8> 166b22fa909Smskamp %ret = icmp eq <16 x i8> %conv, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 0, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 0> 167b22fa909Smskamp ret <16 x i1> %ret 168b22fa909Smskamp} 169b22fa909Smskamp 170b22fa909Smskampdefine <16 x i1> @hsub_and_eq_v16i16_sat(<16 x i16> %x, <16 x i16> %y) { 171b22fa909Smskamp; CHECK-LABEL: define <16 x i1> @hsub_and_eq_v16i16_sat( 172b22fa909Smskamp; CHECK-SAME: <16 x i16> [[X:%.*]], <16 x i16> [[Y:%.*]]) { 173b22fa909Smskamp; CHECK-NEXT: entry: 174*38fffa63SPaul Walker; CHECK-NEXT: ret <16 x i1> splat (i1 true) 175b22fa909Smskamp; 176b22fa909Smskampentry: 177b22fa909Smskamp %or1 = or <16 x i16> %x, <i16 3, i16 0, i16 3, i16 0, i16 3, i16 0, i16 3, i16 0, i16 3, i16 0, i16 3, i16 0, i16 3, i16 0, i16 3, i16 0> 178b22fa909Smskamp %or2 = or <16 x i16> %y, <i16 3, i16 0, i16 3, i16 0, i16 3, i16 0, i16 3, i16 0, i16 3, i16 0, i16 3, i16 0, i16 3, i16 0, i16 3, i16 0> 179b22fa909Smskamp %and1 = and <16 x i16> %or1, <i16 7, i16 3, i16 7, i16 3, i16 7, i16 3, i16 7, i16 3, i16 7, i16 3, i16 7, i16 3, i16 7, i16 3, i16 7, i16 3> 180b22fa909Smskamp %and2 = and <16 x i16> %or2, <i16 7, i16 3, i16 7, i16 3, i16 7, i16 3, i16 7, i16 3, i16 7, i16 3, i16 7, i16 3, i16 7, i16 3, i16 7, i16 3> 181b22fa909Smskamp %hsub = tail call <16 x i16> @llvm.x86.avx2.phsub.sw(<16 x i16> %and1, <16 x i16> %and2) 182b22fa909Smskamp %ret = icmp sle <16 x i16> %hsub, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7> 183b22fa909Smskamp ret <16 x i1> %ret 184b22fa909Smskamp} 185b22fa909Smskamp 186b22fa909Smskampdefine <4 x i1> @hadd_shuffle_2st_v4i32(<4 x i32> %x, <4 x i32> %y) { 187b22fa909Smskamp; CHECK-LABEL: define <4 x i1> @hadd_shuffle_2st_v4i32( 188b22fa909Smskamp; CHECK-SAME: <4 x i32> [[X:%.*]], <4 x i32> [[Y:%.*]]) { 189b22fa909Smskamp; CHECK-NEXT: entry: 190*38fffa63SPaul Walker; CHECK-NEXT: ret <4 x i1> splat (i1 true) 191b22fa909Smskamp; 192b22fa909Smskampentry: 193b22fa909Smskamp %and1 = and <4 x i32> %x, <i32 -1, i32 -1, i32 3, i32 3> 194b22fa909Smskamp %and2 = and <4 x i32> %y, <i32 -1, i32 -1, i32 -1, i32 -1> 195b22fa909Smskamp %hadd = tail call <4 x i32> @llvm.x86.ssse3.phadd.d.128(<4 x i32> %and1, <4 x i32> %and2) 196b22fa909Smskamp %shuf = shufflevector <4 x i32> %hadd, <4x i32> zeroinitializer, <4 x i32> <i32 4, i32 1, i32 5, i32 6> 197b22fa909Smskamp %ret = icmp ne <4 x i32> %shuf, <i32 8, i32 8, i32 8, i32 8> 198b22fa909Smskamp ret <4 x i1> %ret 199b22fa909Smskamp} 200b22fa909Smskamp 201b22fa909Smskampdefine <4 x i1> @hadd_shuffle_4th_v4i32(<4 x i32> %x, <4 x i32> %y) { 202b22fa909Smskamp; CHECK-LABEL: define <4 x i1> @hadd_shuffle_4th_v4i32( 203b22fa909Smskamp; CHECK-SAME: <4 x i32> [[X:%.*]], <4 x i32> [[Y:%.*]]) { 204b22fa909Smskamp; CHECK-NEXT: entry: 205*38fffa63SPaul Walker; CHECK-NEXT: ret <4 x i1> splat (i1 true) 206b22fa909Smskamp; 207b22fa909Smskampentry: 208b22fa909Smskamp %and1 = and <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1> 209b22fa909Smskamp %and2 = and <4 x i32> %y, <i32 -1, i32 -1, i32 3, i32 3> 210b22fa909Smskamp %hadd = tail call <4 x i32> @llvm.x86.ssse3.phadd.d.128(<4 x i32> %and1, <4 x i32> %and2) 211b22fa909Smskamp %shuf = shufflevector <4 x i32> %hadd, <4x i32> zeroinitializer, <4 x i32> <i32 4, i32 5, i32 6, i32 3> 212b22fa909Smskamp %ret = icmp ne <4 x i32> %shuf, <i32 8, i32 8, i32 8, i32 8> 213b22fa909Smskamp ret <4 x i1> %ret 214b22fa909Smskamp} 215b22fa909Smskamp 216b22fa909Smskampdefine <4 x i1> @hadd_shuffle_2st_negative_v4i32(<4 x i32> %x, <4 x i32> %y) { 217b22fa909Smskamp; CHECK-LABEL: define <4 x i1> @hadd_shuffle_2st_negative_v4i32( 218b22fa909Smskamp; CHECK-SAME: <4 x i32> [[X:%.*]], <4 x i32> [[Y:%.*]]) { 219b22fa909Smskamp; CHECK-NEXT: entry: 220b22fa909Smskamp; CHECK-NEXT: [[TMP0:%.*]] = and <4 x i32> [[X]], <i32 3, i32 3, i32 -1, i32 -1> 221*38fffa63SPaul Walker; CHECK-NEXT: [[TMP1:%.*]] = and <4 x i32> [[Y]], splat (i32 3) 222b22fa909Smskamp; CHECK-NEXT: [[TMP2:%.*]] = tail call <4 x i32> @llvm.x86.ssse3.phadd.d.128(<4 x i32> [[TMP0]], <4 x i32> [[TMP1]]) 223b22fa909Smskamp; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x i32> [[TMP2]], <4 x i32> <i32 0, i32 0, i32 0, i32 poison>, <4 x i32> <i32 4, i32 1, i32 5, i32 6> 224*38fffa63SPaul Walker; CHECK-NEXT: [[RET:%.*]] = icmp ne <4 x i32> [[TMP3]], splat (i32 8) 225b22fa909Smskamp; CHECK-NEXT: ret <4 x i1> [[RET]] 226b22fa909Smskamp; 227b22fa909Smskampentry: 228b22fa909Smskamp %and1 = and <4 x i32> %x, <i32 3, i32 3, i32 -1, i32 -1> 229b22fa909Smskamp %and2 = and <4 x i32> %y, <i32 3, i32 3, i32 3, i32 3> 230b22fa909Smskamp %hadd = tail call <4 x i32> @llvm.x86.ssse3.phadd.d.128(<4 x i32> %and1, <4 x i32> %and2) 231b22fa909Smskamp %shuf = shufflevector <4 x i32> %hadd, <4x i32> zeroinitializer, <4 x i32> <i32 4, i32 1, i32 5, i32 6> 232b22fa909Smskamp %ret = icmp ne <4 x i32> %shuf, <i32 8, i32 8, i32 8, i32 8> 233b22fa909Smskamp ret <4 x i1> %ret 234b22fa909Smskamp} 235b22fa909Smskamp 236b22fa909Smskampdefine <4 x i1> @hadd_shuffle_4th_negative_v4i32(<4 x i32> %x, <4 x i32> %y) { 237b22fa909Smskamp; CHECK-LABEL: define <4 x i1> @hadd_shuffle_4th_negative_v4i32( 238b22fa909Smskamp; CHECK-SAME: <4 x i32> [[X:%.*]], <4 x i32> [[Y:%.*]]) { 239b22fa909Smskamp; CHECK-NEXT: entry: 240*38fffa63SPaul Walker; CHECK-NEXT: [[TMP0:%.*]] = and <4 x i32> [[X]], splat (i32 3) 241b22fa909Smskamp; CHECK-NEXT: [[TMP1:%.*]] = and <4 x i32> [[Y]], <i32 3, i32 3, i32 -1, i32 -1> 242b22fa909Smskamp; CHECK-NEXT: [[TMP2:%.*]] = tail call <4 x i32> @llvm.x86.ssse3.phadd.d.128(<4 x i32> [[TMP0]], <4 x i32> [[TMP1]]) 243b22fa909Smskamp; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x i32> <i32 0, i32 0, i32 0, i32 poison>, <4 x i32> [[TMP2]], <4 x i32> <i32 0, i32 1, i32 2, i32 7> 244*38fffa63SPaul Walker; CHECK-NEXT: [[RET:%.*]] = icmp ne <4 x i32> [[TMP3]], splat (i32 8) 245b22fa909Smskamp; CHECK-NEXT: ret <4 x i1> [[RET]] 246b22fa909Smskamp; 247b22fa909Smskampentry: 248b22fa909Smskamp %and1 = and <4 x i32> %x, <i32 3, i32 3, i32 3, i32 3> 249b22fa909Smskamp %and2 = and <4 x i32> %y, <i32 3, i32 3, i32 -1, i32 -1> 250b22fa909Smskamp %hadd = tail call <4 x i32> @llvm.x86.ssse3.phadd.d.128(<4 x i32> %and1, <4 x i32> %and2) 251b22fa909Smskamp %shuf = shufflevector <4 x i32> %hadd, <4x i32> zeroinitializer, <4 x i32> <i32 4, i32 5, i32 6, i32 3> 252b22fa909Smskamp %ret = icmp ne <4 x i32> %shuf, <i32 8, i32 8, i32 8, i32 8> 253b22fa909Smskamp ret <4 x i1> %ret 254b22fa909Smskamp} 255