brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.7 KiB · 1966340 Raw
385 lines · plain
1; Test that DAGCombiner gets helped by computeKnownBitsForTargetNode() with2; vector intrinsics.3;4; RUN: llc -mtriple=s390x-linux-gnu -mcpu=z13 < %s  | FileCheck %s5 6declare <8 x i16> @llvm.s390.vuphb(<16 x i8>)7declare <8 x i16> @llvm.s390.vuplhb(<16 x i8>)8 9; VUPHB (used operand elements are 0)10define <8 x i16> @f0() {11; CHECK-LABEL: f0:12; CHECK-LABEL: # %bb.0:13; CHECK-NEXT:  vgbm %v24, 014; CHECK-NEXT:  br %r1415  %unp = call <8 x i16> @llvm.s390.vuphb(<16 x i8>16                                         <i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0,17                                          i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)18  %and = and <8 x i16> %unp, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>19  ret <8 x i16> %and20}21 22; VUPHB (used operand elements are 1)23; NOTE: The AND is optimized away, but instead of replicating '1' into <8 x24; i16>, the original vector constant is put in the constant pool and then25; unpacked (repeated in more test cases below).26define <8 x i16> @f1() {27; CHECK-LABEL: f1:28; CHECK-LABEL: # %bb.0:29; CHECK-NEXT:  larl %r1, .LCPI30; CHECK-NEXT:  vl %v0, 0(%r1)31; CHECK-NEXT:  vuphb %v24, %v032; CHECK-NEXT:  br %r1433  %unp = call <8 x i16> @llvm.s390.vuphb(<16 x i8>34                                         <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1,35                                          i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>)36  %and = and <8 x i16> %unp, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>37  ret <8 x i16> %and38}39 40; VUPLHB (used operand elements are 0)41define <8 x i16> @f2() {42; CHECK-LABEL: f2:43; CHECK-LABEL: # %bb.0:44; CHECK-NEXT:  vgbm %v24, 045; CHECK-NEXT:  br %r1446  %unp = call <8 x i16> @llvm.s390.vuplhb(<16 x i8>47                                          <i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0,48                                           i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)49  %and = and <8 x i16> %unp, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>50  ret <8 x i16> %and51}52 53; VUPLHB (used operand elements are 1)54define <8 x i16> @f3() {55; CHECK-LABEL: f3:56; CHECK-LABEL: # %bb.0:57; CHECK-NEXT:  larl %r1, .LCPI58; CHECK-NEXT:  vl %v0, 0(%r1)59; CHECK-NEXT:  vuplhb %v24, %v060; CHECK-NEXT:  br %r1461  %unp = call <8 x i16> @llvm.s390.vuplhb(<16 x i8>62                                          <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1,63                                           i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>)64  %and = and <8 x i16> %unp, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>65  ret <8 x i16> %and66}67 68declare <4 x i32> @llvm.s390.vuphh(<8 x i16>)69declare <4 x i32> @llvm.s390.vuplhh(<8 x i16>)70 71; VUPHH (used operand elements are 0)72define <4 x i32> @f4() {73; CHECK-LABEL: f4:74; CHECK-LABEL: # %bb.0:75; CHECK-NEXT:  vgbm %v24, 076; CHECK-NEXT:  br %r1477  %unp = call <4 x i32> @llvm.s390.vuphh(<8 x i16>78                                         <i16 0, i16 0, i16 0, i16 0,79                                          i16 1, i16 1, i16 1, i16 1>)80  %and = and <4 x i32> %unp, <i32 1, i32 1, i32 1, i32 1>81  ret <4 x i32> %and82}83 84; VUPHH (used operand elements are 1)85define <4 x i32> @f5() {86; CHECK-LABEL: f5:87; CHECK-LABEL: # %bb.0:88; CHECK-NEXT:  larl %r1, .LCPI89; CHECK-NEXT:  vl %v0, 0(%r1)90; CHECK-NEXT:  vuphh %v24, %v091; CHECK-NEXT:  br %r1492  %unp = call <4 x i32> @llvm.s390.vuphh(<8 x i16>93                                         <i16 1, i16 1, i16 1, i16 1,94                                          i16 0, i16 0, i16 0, i16 0>)95  %and = and <4 x i32> %unp, <i32 1, i32 1, i32 1, i32 1>96  ret <4 x i32> %and97}98 99; VUPLHH (used operand elements are 0)100define <4 x i32> @f6() {101; CHECK-LABEL: f6:102; CHECK-LABEL: # %bb.0:103; CHECK-NEXT:  vgbm %v24, 0104; CHECK-NEXT:  br %r14105  %unp = call <4 x i32> @llvm.s390.vuplhh(<8 x i16>106                                          <i16 0, i16 0, i16 0, i16 0,107                                           i16 1, i16 1, i16 1, i16 1>)108  %and = and <4 x i32> %unp, <i32 1, i32 1, i32 1, i32 1>109  ret <4 x i32> %and110}111 112; VUPLHH (used operand elements are 1)113define <4 x i32> @f7() {114; CHECK-LABEL: f7:115; CHECK-LABEL: # %bb.0:116; CHECK-NEXT:  larl %r1, .LCPI117; CHECK-NEXT:  vl %v0, 0(%r1)118; CHECK-NEXT:  vuplhh %v24, %v0119; CHECK-NEXT:  br %r14120  %unp = call <4 x i32> @llvm.s390.vuplhh(<8 x i16>121                                          <i16 1, i16 1, i16 1, i16 1,122                                           i16 0, i16 0, i16 0, i16 0>)123  %and = and <4 x i32> %unp, <i32 1, i32 1, i32 1, i32 1>124  ret <4 x i32> %and125}126 127declare <2 x i64> @llvm.s390.vuphf(<4 x i32>)128declare <2 x i64> @llvm.s390.vuplhf(<4 x i32>)129 130; VUPHF (used operand elements are 0)131define <2 x i64> @f8() {132; CHECK-LABEL: f8:133; CHECK-LABEL: # %bb.0:134; CHECK-NEXT:  vgbm %v24, 0135; CHECK-NEXT:  br %r14136  %unp = call <2 x i64> @llvm.s390.vuphf(<4 x i32> <i32 0, i32 0, i32 1, i32 1>)137  %and = and <2 x i64> %unp, <i64 1, i64 1>138  ret <2 x i64> %and139}140 141; VUPHF (used operand elements are 1)142define <2 x i64> @f9() {143; CHECK-LABEL: f9:144; CHECK-LABEL: # %bb.0:145; CHECK-NEXT:  larl %r1, .LCPI146; CHECK-NEXT:  vl %v0, 0(%r1)147; CHECK-NEXT:  vuphf %v24, %v0148; CHECK-NEXT:  br %r14149  %unp = call <2 x i64> @llvm.s390.vuphf(<4 x i32> <i32 1, i32 1, i32 0, i32 0>)150  %and = and <2 x i64> %unp, <i64 1, i64 1>151  ret <2 x i64> %and152}153 154; VUPLHF (used operand elements are 0)155define <2 x i64> @f10() {156; CHECK-LABEL: f10:157; CHECK-LABEL: # %bb.0:158; CHECK-NEXT:  vgbm %v24, 0159; CHECK-NEXT:  br %r14160  %unp = call <2 x i64> @llvm.s390.vuplhf(<4 x i32> <i32 0, i32 0, i32 1, i32 1>)161  %and = and <2 x i64> %unp, <i64 1, i64 1>162  ret <2 x i64> %and163}164 165; VUPLHF (used operand elements are 1)166define <2 x i64> @f11() {167; CHECK-LABEL: f11:168; CHECK-LABEL: # %bb.0:169; CHECK-NEXT:  larl %r1, .LCPI170; CHECK-NEXT:  vl %v0, 0(%r1)171; CHECK-NEXT:  vuplhf %v24, %v0172; CHECK-NEXT:  br %r14173  %unp = call <2 x i64> @llvm.s390.vuplhf(<4 x i32> <i32 1, i32 1, i32 0, i32 0>)174  %and = and <2 x i64> %unp, <i64 1, i64 1>175  ret <2 x i64> %and176}177 178declare <8 x i16> @llvm.s390.vuplb(<16 x i8>)179declare <8 x i16> @llvm.s390.vupllb(<16 x i8>)180 181; VUPLB (used operand elements are 0)182define <8 x i16> @f12() {183; CHECK-LABEL: f12:184; CHECK-LABEL: # %bb.0:185; CHECK-NEXT:  vgbm %v24, 0186; CHECK-NEXT:  br %r14187  %unp = call <8 x i16> @llvm.s390.vuplb(<16 x i8>188                                         <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1,189                                          i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>)190 191  %and = and <8 x i16> %unp, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>192  ret <8 x i16> %and193}194 195; VUPLB (used operand elements are 1)196define <8 x i16> @f13() {197; CHECK-LABEL: f13:198; CHECK-LABEL: # %bb.0:199; CHECK-NEXT:  larl %r1, .LCPI200; CHECK-NEXT:  vl %v0, 0(%r1)201; CHECK-NEXT:  vuplb %v24, %v0202; CHECK-NEXT:  br %r14203  %unp = call <8 x i16> @llvm.s390.vuplb(<16 x i8>204                                         <i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0,205                                          i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)206  %and = and <8 x i16> %unp, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>207  ret <8 x i16> %and208}209 210; VUPLLB (used operand elements are 0)211define <8 x i16> @f14() {212; CHECK-LABEL: f14:213; CHECK-LABEL: # %bb.0:214; CHECK-NEXT:  vgbm %v24, 0215; CHECK-NEXT:  br %r14216  %unp = call <8 x i16> @llvm.s390.vupllb(<16 x i8>217                                         <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1,218                                          i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>)219  %and = and <8 x i16> %unp, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>220  ret <8 x i16> %and221}222 223; VUPLLB (used operand elements are 1)224define <8 x i16> @f15() {225; CHECK-LABEL: f15:226; CHECK-LABEL: # %bb.0:227; CHECK-NEXT:  larl %r1, .LCPI228; CHECK-NEXT:  vl %v0, 0(%r1)229; CHECK-NEXT:  vupllb %v24, %v0230; CHECK-NEXT:  br %r14231  %unp = call <8 x i16> @llvm.s390.vupllb(<16 x i8>232                                         <i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0,233                                          i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>)234  %and = and <8 x i16> %unp, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>235  ret <8 x i16> %and236}237 238declare <4 x i32> @llvm.s390.vuplhw(<8 x i16>)239declare <4 x i32> @llvm.s390.vupllh(<8 x i16>)240 241; VUPLHW (used operand elements are 0)242define <4 x i32> @f16() {243; CHECK-LABEL: f16:244; CHECK-LABEL: # %bb.0:245; CHECK-NEXT:  vgbm %v24, 0246; CHECK-NEXT:  br %r14247  %unp = call <4 x i32> @llvm.s390.vuplhw(<8 x i16>248                                          <i16 1, i16 1, i16 1, i16 1,249                                           i16 0, i16 0, i16 0, i16 0>)250 251  %and = and <4 x i32> %unp, <i32 1, i32 1, i32 1, i32 1>252  ret <4 x i32> %and253}254 255; VUPLHW (used operand elements are 1)256define <4 x i32> @f17() {257; CHECK-LABEL: f17:258; CHECK-LABEL: # %bb.0:259; CHECK-NEXT:  larl %r1, .LCPI260; CHECK-NEXT:  vl %v0, 0(%r1)261; CHECK-NEXT:  vuplhw %v24, %v0262; CHECK-NEXT:  br %r14263  %unp = call <4 x i32> @llvm.s390.vuplhw(<8 x i16>264                                          <i16 0, i16 0, i16 0, i16 0,265                                           i16 1, i16 1, i16 1, i16 1>)266  %and = and <4 x i32> %unp, <i32 1, i32 1, i32 1, i32 1>267  ret <4 x i32> %and268}269 270; VUPLLH (used operand elements are 0)271define <4 x i32> @f18() {272; CHECK-LABEL: f18:273; CHECK-LABEL: # %bb.0:274; CHECK-NEXT:  vgbm %v24, 0275; CHECK-NEXT:  br %r14276  %unp = call <4 x i32> @llvm.s390.vupllh(<8 x i16>277                                          <i16 1, i16 1, i16 1, i16 1,278                                           i16 0, i16 0, i16 0, i16 0>)279  %and = and <4 x i32> %unp, <i32 1, i32 1, i32 1, i32 1>280  ret <4 x i32> %and281}282 283; VUPLLH (used operand elements are 1)284define <4 x i32> @f19() {285; CHECK-LABEL: f19:286; CHECK-LABEL: # %bb.0:287; CHECK-NEXT:  larl %r1, .LCPI288; CHECK-NEXT:  vl %v0, 0(%r1)289; CHECK-NEXT:  vupllh %v24, %v0290; CHECK-NEXT:  br %r14291  %unp = call <4 x i32> @llvm.s390.vupllh(<8 x i16>292                                          <i16 0, i16 0, i16 0, i16 0,293                                           i16 1, i16 1, i16 1, i16 1>)294  %and = and <4 x i32> %unp, <i32 1, i32 1, i32 1, i32 1>295  ret <4 x i32> %and296}297 298declare <2 x i64> @llvm.s390.vuplf(<4 x i32>)299declare <2 x i64> @llvm.s390.vupllf(<4 x i32>)300 301; VUPLF (used operand elements are 0)302define <2 x i64> @f20() {303; CHECK-LABEL: f20:304; CHECK-LABEL: # %bb.0:305; CHECK-NEXT:  vgbm %v24, 0306; CHECK-NEXT:  br %r14307  %unp = call <2 x i64> @llvm.s390.vuplf(<4 x i32> <i32 1, i32 1, i32 0, i32 0>)308  %and = and <2 x i64> %unp, <i64 1, i64 1>309  ret <2 x i64> %and310}311 312; VUPLF (used operand elements are 1)313define <2 x i64> @f21() {314; CHECK-LABEL: f21:315; CHECK-LABEL: # %bb.0:316; CHECK-NEXT:  larl %r1, .LCPI317; CHECK-NEXT:  vl %v0, 0(%r1)318; CHECK-NEXT:  vuplf %v24, %v0319; CHECK-NEXT:  br %r14320  %unp = call <2 x i64> @llvm.s390.vuplf(<4 x i32> <i32 0, i32 0, i32 1, i32 1>)321  %and = and <2 x i64> %unp, <i64 1, i64 1>322  ret <2 x i64> %and323}324 325; VUPLLF (used operand elements are 0)326define <2 x i64> @f22() {327; CHECK-LABEL: f22:328; CHECK-LABEL: # %bb.0:329; CHECK-NEXT:  vgbm %v24, 0330; CHECK-NEXT:  br %r14331  %unp = call <2 x i64> @llvm.s390.vupllf(<4 x i32> <i32 1, i32 1, i32 0, i32 0>)332  %and = and <2 x i64> %unp, <i64 1, i64 1>333  ret <2 x i64> %and334}335 336; VUPLLF (used operand elements are 1)337define <2 x i64> @f23() {338; CHECK-LABEL: f23:339; CHECK-LABEL: # %bb.0:340; CHECK-NEXT:  larl %r1, .LCPI341; CHECK-NEXT:  vl %v0, 0(%r1)342; CHECK-NEXT:  vupllf %v24, %v0343; CHECK-NEXT:  br %r14344  %unp = call <2 x i64> @llvm.s390.vupllf(<4 x i32> <i32 0, i32 0, i32 1, i32 1>)345  %and = and <2 x i64> %unp, <i64 1, i64 1>346  ret <2 x i64> %and347}348 349; Test that signed unpacking of positive elements gives known zeros in high part.350define <2 x i64> @f24() {351; CHECK-LABEL: f24:352; CHECK-LABEL: # %bb.0:353; CHECK-NEXT:  vgbm %v24, 0354; CHECK-NEXT:  br %r14355  %unp = call <2 x i64> @llvm.s390.vuphf(<4 x i32> <i32 1, i32 1, i32 0, i32 0>)356  %and = and <2 x i64> %unp, <i64 -4294967296, ; = 0xffffffff00000000357                              i64 -4294967296>358  ret <2 x i64> %and359}360 361; Test that signed unpacking of negative elements gives known ones in high part.362define <2 x i64> @f25() {363; CHECK-LABEL: f25:364; CHECK-LABEL: # %bb.0:365;                         61680 = 0xf0f0366; CHECK-NEXT:  vgbm %v24, 61680367; CHECK-NEXT:  br %r14368  %unp = call <2 x i64> @llvm.s390.vuphf(<4 x i32> <i32 -1, i32 -1, i32 0, i32 0>)369  %and = and <2 x i64> %unp, <i64 -4294967296, ; = 0xffffffff00000000370                              i64 -4294967296>371  ret <2 x i64> %and372}373 374; Test that logical unpacking of negative elements gives known zeros in high part.375define <2 x i64> @f26() {376; CHECK-LABEL: f26:377; CHECK-LABEL: # %bb.0:378; CHECK-NEXT:  vgbm %v24, 0379; CHECK-NEXT:  br %r14380  %unp = call <2 x i64> @llvm.s390.vuplhf(<4 x i32> <i32 -1, i32 -1, i32 0, i32 0>)381  %and = and <2 x i64> %unp, <i64 -4294967296, ; = 0xffffffff00000000382                              i64 -4294967296>383  ret <2 x i64> %and384}385