1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=instsimplify -S -o - %s | FileCheck %s 3 4target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64" 5 6define <16 x i1> @v16i1_0() { 7; CHECK-LABEL: @v16i1_0( 8; CHECK-NEXT: entry: 9; CHECK-NEXT: ret <16 x i1> zeroinitializer 10; 11entry: 12 %int = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i32(i32 0, i32 0) 13 ret <16 x i1> %int 14} 15 16define <16 x i1> @v16i1_1() { 17; CHECK-LABEL: @v16i1_1( 18; CHECK-NEXT: entry: 19; CHECK-NEXT: ret <16 x i1> <i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false> 20; 21entry: 22 %int = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i32(i32 0, i32 1) 23 ret <16 x i1> %int 24} 25 26define <16 x i1> @v16i1_8() { 27; CHECK-LABEL: @v16i1_8( 28; CHECK-NEXT: entry: 29; CHECK-NEXT: ret <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false> 30; 31entry: 32 %int = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i32(i32 0, i32 8) 33 ret <16 x i1> %int 34} 35 36define <16 x i1> @v16i1_15() { 37; CHECK-LABEL: @v16i1_15( 38; CHECK-NEXT: entry: 39; CHECK-NEXT: ret <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 false> 40; 41entry: 42 %int = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i32(i32 0, i32 15) 43 ret <16 x i1> %int 44} 45 46define <16 x i1> @v16i1_16() { 47; CHECK-LABEL: @v16i1_16( 48; CHECK-NEXT: entry: 49; CHECK-NEXT: ret <16 x i1> splat (i1 true) 50; 51entry: 52 %int = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i32(i32 0, i32 16) 53 ret <16 x i1> %int 54} 55 56define <16 x i1> @v16i1_100() { 57; CHECK-LABEL: @v16i1_100( 58; CHECK-NEXT: entry: 59; CHECK-NEXT: ret <16 x i1> splat (i1 true) 60; 61entry: 62 %int = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i32(i32 0, i32 100) 63 ret <16 x i1> %int 64} 65 66define <16 x i1> @v16i1_m1() { 67; CHECK-LABEL: @v16i1_m1( 68; CHECK-NEXT: entry: 69; CHECK-NEXT: ret <16 x i1> splat (i1 true) 70; 71entry: 72 %int = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i32(i32 0, i32 -1) 73 ret <16 x i1> %int 74} 75 76define <16 x i1> @v16i1_10_11() { 77; CHECK-LABEL: @v16i1_10_11( 78; CHECK-NEXT: entry: 79; CHECK-NEXT: ret <16 x i1> <i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false> 80; 81entry: 82 %int = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i32(i32 10, i32 11) 83 ret <16 x i1> %int 84} 85 86define <16 x i1> @v16i1_12_11() { 87; CHECK-LABEL: @v16i1_12_11( 88; CHECK-NEXT: entry: 89; CHECK-NEXT: ret <16 x i1> zeroinitializer 90; 91entry: 92 %int = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i32(i32 12, i32 11) 93 ret <16 x i1> %int 94} 95 96 97 98define <8 x i1> @v8i1_0() { 99; CHECK-LABEL: @v8i1_0( 100; CHECK-NEXT: entry: 101; CHECK-NEXT: ret <8 x i1> zeroinitializer 102; 103entry: 104 %int = call <8 x i1> @llvm.get.active.lane.mask.v8i1.i32(i32 0, i32 0) 105 ret <8 x i1> %int 106} 107 108define <8 x i1> @v8i1_1() { 109; CHECK-LABEL: @v8i1_1( 110; CHECK-NEXT: entry: 111; CHECK-NEXT: ret <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false> 112; 113entry: 114 %int = call <8 x i1> @llvm.get.active.lane.mask.v8i1.i32(i32 0, i32 1) 115 ret <8 x i1> %int 116} 117 118define <8 x i1> @v8i1_4() { 119; CHECK-LABEL: @v8i1_4( 120; CHECK-NEXT: entry: 121; CHECK-NEXT: ret <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 false, i1 false, i1 false, i1 false> 122; 123entry: 124 %int = call <8 x i1> @llvm.get.active.lane.mask.v8i1.i32(i32 0, i32 4) 125 ret <8 x i1> %int 126} 127 128define <8 x i1> @v8i1_7() { 129; CHECK-LABEL: @v8i1_7( 130; CHECK-NEXT: entry: 131; CHECK-NEXT: ret <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 false> 132; 133entry: 134 %int = call <8 x i1> @llvm.get.active.lane.mask.v8i1.i32(i32 0, i32 7) 135 ret <8 x i1> %int 136} 137 138define <8 x i1> @v8i1_8() { 139; CHECK-LABEL: @v8i1_8( 140; CHECK-NEXT: entry: 141; CHECK-NEXT: ret <8 x i1> splat (i1 true) 142; 143entry: 144 %int = call <8 x i1> @llvm.get.active.lane.mask.v8i1.i32(i32 0, i32 8) 145 ret <8 x i1> %int 146} 147 148define <8 x i1> @v8i1_100() { 149; CHECK-LABEL: @v8i1_100( 150; CHECK-NEXT: entry: 151; CHECK-NEXT: ret <8 x i1> splat (i1 true) 152; 153entry: 154 %int = call <8 x i1> @llvm.get.active.lane.mask.v8i1.i32(i32 0, i32 100) 155 ret <8 x i1> %int 156} 157 158define <8 x i1> @v8i1_m1() { 159; CHECK-LABEL: @v8i1_m1( 160; CHECK-NEXT: entry: 161; CHECK-NEXT: ret <8 x i1> splat (i1 true) 162; 163entry: 164 %int = call <8 x i1> @llvm.get.active.lane.mask.v8i1.i32(i32 0, i32 -1) 165 ret <8 x i1> %int 166} 167 168define <8 x i1> @v8i1_10_11() { 169; CHECK-LABEL: @v8i1_10_11( 170; CHECK-NEXT: entry: 171; CHECK-NEXT: ret <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false> 172; 173entry: 174 %int = call <8 x i1> @llvm.get.active.lane.mask.v8i1.i32(i32 10, i32 11) 175 ret <8 x i1> %int 176} 177 178define <8 x i1> @v8i1_12_11() { 179; CHECK-LABEL: @v8i1_12_11( 180; CHECK-NEXT: entry: 181; CHECK-NEXT: ret <8 x i1> zeroinitializer 182; 183entry: 184 %int = call <8 x i1> @llvm.get.active.lane.mask.v8i1.i32(i32 12, i32 11) 185 ret <8 x i1> %int 186} 187 188 189 190define <4 x i1> @v4i1_0() { 191; CHECK-LABEL: @v4i1_0( 192; CHECK-NEXT: entry: 193; CHECK-NEXT: ret <4 x i1> zeroinitializer 194; 195entry: 196 %int = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 0, i32 0) 197 ret <4 x i1> %int 198} 199 200define <4 x i1> @v4i1_1() { 201; CHECK-LABEL: @v4i1_1( 202; CHECK-NEXT: entry: 203; CHECK-NEXT: ret <4 x i1> <i1 true, i1 false, i1 false, i1 false> 204; 205entry: 206 %int = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 0, i32 1) 207 ret <4 x i1> %int 208} 209 210define <4 x i1> @v4i1_3() { 211; CHECK-LABEL: @v4i1_3( 212; CHECK-NEXT: entry: 213; CHECK-NEXT: ret <4 x i1> <i1 true, i1 true, i1 true, i1 false> 214; 215entry: 216 %int = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 0, i32 3) 217 ret <4 x i1> %int 218} 219 220define <4 x i1> @v4i1_4() { 221; CHECK-LABEL: @v4i1_4( 222; CHECK-NEXT: entry: 223; CHECK-NEXT: ret <4 x i1> splat (i1 true) 224; 225entry: 226 %int = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 0, i32 4) 227 ret <4 x i1> %int 228} 229 230define <4 x i1> @v4i1_100() { 231; CHECK-LABEL: @v4i1_100( 232; CHECK-NEXT: entry: 233; CHECK-NEXT: ret <4 x i1> splat (i1 true) 234; 235entry: 236 %int = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 0, i32 100) 237 ret <4 x i1> %int 238} 239 240define <4 x i1> @v4i1_m1() { 241; CHECK-LABEL: @v4i1_m1( 242; CHECK-NEXT: entry: 243; CHECK-NEXT: ret <4 x i1> splat (i1 true) 244; 245entry: 246 %int = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 0, i32 -1) 247 ret <4 x i1> %int 248} 249 250define <4 x i1> @v4i1_10_11() { 251; CHECK-LABEL: @v4i1_10_11( 252; CHECK-NEXT: entry: 253; CHECK-NEXT: ret <4 x i1> <i1 true, i1 false, i1 false, i1 false> 254; 255entry: 256 %int = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 10, i32 11) 257 ret <4 x i1> %int 258} 259 260define <4 x i1> @v4i1_12_11() { 261; CHECK-LABEL: @v4i1_12_11( 262; CHECK-NEXT: entry: 263; CHECK-NEXT: ret <4 x i1> zeroinitializer 264; 265entry: 266 %int = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 12, i32 11) 267 ret <4 x i1> %int 268} 269 270 271 272define <4 x i1> @v4i1_nc1(i32 %x) { 273; CHECK-LABEL: @v4i1_nc1( 274; CHECK-NEXT: entry: 275; CHECK-NEXT: [[INT:%.*]] = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 [[X:%.*]], i32 11) 276; CHECK-NEXT: ret <4 x i1> [[INT]] 277; 278entry: 279 %int = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 %x, i32 11) 280 ret <4 x i1> %int 281} 282 283define <4 x i1> @v4i1_nc2(i32 %x) { 284; CHECK-LABEL: @v4i1_nc2( 285; CHECK-NEXT: entry: 286; CHECK-NEXT: [[INT:%.*]] = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 11, i32 [[X:%.*]]) 287; CHECK-NEXT: ret <4 x i1> [[INT]] 288; 289entry: 290 %int = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 11, i32 %x) 291 ret <4 x i1> %int 292} 293 294 295define <4 x float> @poisonc(<4 x float> %a, i32 %n) { 296; CHECK-LABEL: @poisonc( 297; CHECK-NEXT: entry: 298; CHECK-NEXT: [[VAR27:%.*]] = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 poison, i32 1024) 299; CHECK-NEXT: [[VAR33:%.*]] = select <4 x i1> [[VAR27]], <4 x float> [[A:%.*]], <4 x float> zeroinitializer 300; CHECK-NEXT: ret <4 x float> [[VAR33]] 301; 302entry: 303 %new0 = shl i1 0, 1 304 %last = zext i1 %new0 to i32 305 %var27 = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 %last, i32 1024) 306 %var33 = select <4 x i1> %var27, <4 x float> %a, <4 x float> zeroinitializer 307 ret <4 x float> %var33 308} 309 310declare <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32, i32) 311declare <8 x i1> @llvm.get.active.lane.mask.v8i1.i32(i32, i32) 312declare <16 x i1> @llvm.get.active.lane.mask.v16i1.i32(i32, i32) 313