brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.4 KiB · 2fbcec3 Raw
295 lines · plain
1; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+simd128 | FileCheck %s2 3; Tests that redundant masking and conversions are folded out4; following SIMD reduction instructions.5 6target triple = "wasm32-unknown-unknown"7 8; ==============================================================================9; 16 x i810; ==============================================================================11declare i32 @llvm.wasm.anytrue.v16i8(<16 x i8>)12declare i32 @llvm.wasm.alltrue.v16i8(<16 x i8>)13 14; CHECK-LABEL: any_v16i8_trunc:15; CHECK-NEXT: .functype any_v16i8_trunc (v128) -> (i32){{$}}16; CHECK-NEXT: v128.any_true $push[[R:[0-9]+]]=, $0{{$}}17; CHECK-NEXT: return $pop[[R]]{{$}}18define i32 @any_v16i8_trunc(<16 x i8> %x) {19  %a = call i32 @llvm.wasm.anytrue.v16i8(<16 x i8> %x)20  %b = trunc i32 %a to i121  %c = zext i1 %b to i3222  ret i32 %c23}24 25; CHECK-LABEL: any_v16i8_ne:26; CHECK-NEXT: .functype any_v16i8_ne (v128) -> (i32){{$}}27; CHECK-NEXT: v128.any_true $push[[R:[0-9]+]]=, $0{{$}}28; CHECK-NEXT: return $pop[[R]]{{$}}29define i32 @any_v16i8_ne(<16 x i8> %x) {30  %a = call i32 @llvm.wasm.anytrue.v16i8(<16 x i8> %x)31  %b = icmp ne i32 %a, 032  %c = zext i1 %b to i3233  ret i32 %c34}35 36; CHECK-LABEL: any_v16i8_eq:37; CHECK-NEXT: .functype any_v16i8_eq (v128) -> (i32){{$}}38; CHECK-NEXT: v128.any_true $push[[R:[0-9]+]]=, $0{{$}}39; CHECK-NEXT: return $pop[[R]]{{$}}40define i32 @any_v16i8_eq(<16 x i8> %x) {41  %a = call i32 @llvm.wasm.anytrue.v16i8(<16 x i8> %x)42  %b = icmp eq i32 %a, 143  %c = zext i1 %b to i3244  ret i32 %c45}46 47; CHECK-LABEL: all_v16i8_trunc:48; CHECK-NEXT: .functype all_v16i8_trunc (v128) -> (i32){{$}}49; CHECK-NEXT: i8x16.all_true $push[[R:[0-9]+]]=, $0{{$}}50; CHECK-NEXT: return $pop[[R]]{{$}}51define i32 @all_v16i8_trunc(<16 x i8> %x) {52  %a = call i32 @llvm.wasm.alltrue.v16i8(<16 x i8> %x)53  %b = trunc i32 %a to i154  %c = zext i1 %b to i3255  ret i32 %c56}57 58; CHECK-LABEL: all_v16i8_ne:59; CHECK-NEXT: .functype all_v16i8_ne (v128) -> (i32){{$}}60; CHECK-NEXT: i8x16.all_true $push[[R:[0-9]+]]=, $0{{$}}61; CHECK-NEXT: return $pop[[R]]{{$}}62define i32 @all_v16i8_ne(<16 x i8> %x) {63  %a = call i32 @llvm.wasm.alltrue.v16i8(<16 x i8> %x)64  %b = icmp ne i32 %a, 065  %c = zext i1 %b to i3266  ret i32 %c67}68 69; CHECK-LABEL: all_v16i8_eq:70; CHECK-NEXT: .functype all_v16i8_eq (v128) -> (i32){{$}}71; CHECK-NEXT: i8x16.all_true $push[[R:[0-9]+]]=, $0{{$}}72; CHECK-NEXT: return $pop[[R]]{{$}}73define i32 @all_v16i8_eq(<16 x i8> %x) {74  %a = call i32 @llvm.wasm.alltrue.v16i8(<16 x i8> %x)75  %b = icmp eq i32 %a, 176  %c = zext i1 %b to i3277  ret i32 %c78}79 80; ==============================================================================81; 8 x i1682; ==============================================================================83declare i32 @llvm.wasm.anytrue.v8i16(<8 x i16>)84declare i32 @llvm.wasm.alltrue.v8i16(<8 x i16>)85 86; CHECK-LABEL: any_v8i16_trunc:87; CHECK-NEXT: .functype any_v8i16_trunc (v128) -> (i32){{$}}88; CHECK-NEXT: v128.any_true $push[[R:[0-9]+]]=, $0{{$}}89; CHECK-NEXT: return $pop[[R]]{{$}}90define i32 @any_v8i16_trunc(<8 x i16> %x) {91  %a = call i32 @llvm.wasm.anytrue.v8i16(<8 x i16> %x)92  %b = trunc i32 %a to i193  %c = zext i1 %b to i3294  ret i32 %c95}96 97; CHECK-LABEL: any_v8i16_ne:98; CHECK-NEXT: .functype any_v8i16_ne (v128) -> (i32){{$}}99; CHECK-NEXT: v128.any_true $push[[R:[0-9]+]]=, $0{{$}}100; CHECK-NEXT: return $pop[[R]]{{$}}101define i32 @any_v8i16_ne(<8 x i16> %x) {102  %a = call i32 @llvm.wasm.anytrue.v8i16(<8 x i16> %x)103  %b = icmp ne i32 %a, 0104  %c = zext i1 %b to i32105  ret i32 %c106}107 108; CHECK-LABEL: any_v8i16_eq:109; CHECK-NEXT: .functype any_v8i16_eq (v128) -> (i32){{$}}110; CHECK-NEXT: v128.any_true $push[[R:[0-9]+]]=, $0{{$}}111; CHECK-NEXT: return $pop[[R]]{{$}}112define i32 @any_v8i16_eq(<8 x i16> %x) {113  %a = call i32 @llvm.wasm.anytrue.v8i16(<8 x i16> %x)114  %b = icmp eq i32 %a, 1115  %c = zext i1 %b to i32116  ret i32 %c117}118 119; CHECK-LABEL: all_v8i16_trunc:120; CHECK-NEXT: .functype all_v8i16_trunc (v128) -> (i32){{$}}121; CHECK-NEXT: i16x8.all_true $push[[R:[0-9]+]]=, $0{{$}}122; CHECK-NEXT: return $pop[[R]]{{$}}123define i32 @all_v8i16_trunc(<8 x i16> %x) {124  %a = call i32 @llvm.wasm.alltrue.v8i16(<8 x i16> %x)125  %b = trunc i32 %a to i1126  %c = zext i1 %b to i32127  ret i32 %c128}129 130; CHECK-LABEL: all_v8i16_ne:131; CHECK-NEXT: .functype all_v8i16_ne (v128) -> (i32){{$}}132; CHECK-NEXT: i16x8.all_true $push[[R:[0-9]+]]=, $0{{$}}133; CHECK-NEXT: return $pop[[R]]{{$}}134define i32 @all_v8i16_ne(<8 x i16> %x) {135  %a = call i32 @llvm.wasm.alltrue.v8i16(<8 x i16> %x)136  %b = icmp ne i32 %a, 0137  %c = zext i1 %b to i32138  ret i32 %c139}140 141; CHECK-LABEL: all_v8i16_eq:142; CHECK-NEXT: .functype all_v8i16_eq (v128) -> (i32){{$}}143; CHECK-NEXT: i16x8.all_true $push[[R:[0-9]+]]=, $0{{$}}144; CHECK-NEXT: return $pop[[R]]{{$}}145define i32 @all_v8i16_eq(<8 x i16> %x) {146  %a = call i32 @llvm.wasm.alltrue.v8i16(<8 x i16> %x)147  %b = icmp eq i32 %a, 1148  %c = zext i1 %b to i32149  ret i32 %c150}151 152; ==============================================================================153; 4 x i32154; ==============================================================================155declare i32 @llvm.wasm.anytrue.v4i32(<4 x i32>)156declare i32 @llvm.wasm.alltrue.v4i32(<4 x i32>)157 158; CHECK-LABEL: any_v4i32_trunc:159; CHECK-NEXT: .functype any_v4i32_trunc (v128) -> (i32){{$}}160; CHECK-NEXT: v128.any_true $push[[R:[0-9]+]]=, $0{{$}}161; CHECK-NEXT: return $pop[[R]]{{$}}162define i32 @any_v4i32_trunc(<4 x i32> %x) {163  %a = call i32 @llvm.wasm.anytrue.v4i32(<4 x i32> %x)164  %b = trunc i32 %a to i1165  %c = zext i1 %b to i32166  ret i32 %c167}168 169; CHECK-LABEL: any_v4i32_ne:170; CHECK-NEXT: .functype any_v4i32_ne (v128) -> (i32){{$}}171; CHECK-NEXT: v128.any_true $push[[R:[0-9]+]]=, $0{{$}}172; CHECK-NEXT: return $pop[[R]]{{$}}173define i32 @any_v4i32_ne(<4 x i32> %x) {174  %a = call i32 @llvm.wasm.anytrue.v4i32(<4 x i32> %x)175  %b = icmp ne i32 %a, 0176  %c = zext i1 %b to i32177  ret i32 %c178}179 180; CHECK-LABEL: any_v4i32_eq:181; CHECK-NEXT: .functype any_v4i32_eq (v128) -> (i32){{$}}182; CHECK-NEXT: v128.any_true $push[[R:[0-9]+]]=, $0{{$}}183; CHECK-NEXT: return $pop[[R]]{{$}}184define i32 @any_v4i32_eq(<4 x i32> %x) {185  %a = call i32 @llvm.wasm.anytrue.v4i32(<4 x i32> %x)186  %b = icmp eq i32 %a, 1187  %c = zext i1 %b to i32188  ret i32 %c189}190 191; CHECK-LABEL: all_v4i32_trunc:192; CHECK-NEXT: .functype all_v4i32_trunc (v128) -> (i32){{$}}193; CHECK-NEXT: i32x4.all_true $push[[R:[0-9]+]]=, $0{{$}}194; CHECK-NEXT: return $pop[[R]]{{$}}195define i32 @all_v4i32_trunc(<4 x i32> %x) {196  %a = call i32 @llvm.wasm.alltrue.v4i32(<4 x i32> %x)197  %b = trunc i32 %a to i1198  %c = zext i1 %b to i32199  ret i32 %c200}201 202; CHECK-LABEL: all_v4i32_ne:203; CHECK-NEXT: .functype all_v4i32_ne (v128) -> (i32){{$}}204; CHECK-NEXT: i32x4.all_true $push[[R:[0-9]+]]=, $0{{$}}205; CHECK-NEXT: return $pop[[R]]{{$}}206define i32 @all_v4i32_ne(<4 x i32> %x) {207  %a = call i32 @llvm.wasm.alltrue.v4i32(<4 x i32> %x)208  %b = icmp ne i32 %a, 0209  %c = zext i1 %b to i32210  ret i32 %c211}212 213; CHECK-LABEL: all_v4i32_eq:214; CHECK-NEXT: .functype all_v4i32_eq (v128) -> (i32){{$}}215; CHECK-NEXT: i32x4.all_true $push[[R:[0-9]+]]=, $0{{$}}216; CHECK-NEXT: return $pop[[R]]{{$}}217define i32 @all_v4i32_eq(<4 x i32> %x) {218  %a = call i32 @llvm.wasm.alltrue.v4i32(<4 x i32> %x)219  %b = icmp eq i32 %a, 1220  %c = zext i1 %b to i32221  ret i32 %c222}223 224; ==============================================================================225; 2 x i64226; ==============================================================================227declare i32 @llvm.wasm.anytrue.v2i64(<2 x i64>)228declare i32 @llvm.wasm.alltrue.v2i64(<2 x i64>)229 230; CHECK-LABEL: any_v2i64_trunc:231; CHECK-NEXT: .functype any_v2i64_trunc (v128) -> (i32){{$}}232; CHECK-NEXT: v128.any_true $push[[R:[0-9]+]]=, $0{{$}}233; CHECK-NEXT: return $pop[[R]]{{$}}234define i32 @any_v2i64_trunc(<2 x i64> %x) {235  %a = call i32 @llvm.wasm.anytrue.v2i64(<2 x i64> %x)236  %b = trunc i32 %a to i1237  %c = zext i1 %b to i32238  ret i32 %c239}240 241; CHECK-LABEL: any_v2i64_ne:242; CHECK-NEXT: .functype any_v2i64_ne (v128) -> (i32){{$}}243; CHECK-NEXT: v128.any_true $push[[R:[0-9]+]]=, $0{{$}}244; CHECK-NEXT: return $pop[[R]]{{$}}245define i32 @any_v2i64_ne(<2 x i64> %x) {246  %a = call i32 @llvm.wasm.anytrue.v2i64(<2 x i64> %x)247  %b = icmp ne i32 %a, 0248  %c = zext i1 %b to i32249  ret i32 %c250}251 252; CHECK-LABEL: any_v2i64_eq:253; CHECK-NEXT: .functype any_v2i64_eq (v128) -> (i32){{$}}254; CHECK-NEXT: v128.any_true $push[[R:[0-9]+]]=, $0{{$}}255; CHECK-NEXT: return $pop[[R]]{{$}}256define i32 @any_v2i64_eq(<2 x i64> %x) {257  %a = call i32 @llvm.wasm.anytrue.v2i64(<2 x i64> %x)258  %b = icmp eq i32 %a, 1259  %c = zext i1 %b to i32260  ret i32 %c261}262 263; CHECK-LABEL: all_v2i64_trunc:264; CHECK-NEXT: .functype all_v2i64_trunc (v128) -> (i32){{$}}265; CHECK-NEXT: i64x2.all_true $push[[R:[0-9]+]]=, $0{{$}}266; CHECK-NEXT: return $pop[[R]]{{$}}267define i32 @all_v2i64_trunc(<2 x i64> %x) {268  %a = call i32 @llvm.wasm.alltrue.v2i64(<2 x i64> %x)269  %b = trunc i32 %a to i1270  %c = zext i1 %b to i32271  ret i32 %c272}273 274; CHECK-LABEL: all_v2i64_ne:275; CHECK-NEXT: .functype all_v2i64_ne (v128) -> (i32){{$}}276; CHECK-NEXT: i64x2.all_true $push[[R:[0-9]+]]=, $0{{$}}277; CHECK-NEXT: return $pop[[R]]{{$}}278define i32 @all_v2i64_ne(<2 x i64> %x) {279  %a = call i32 @llvm.wasm.alltrue.v2i64(<2 x i64> %x)280  %b = icmp ne i32 %a, 0281  %c = zext i1 %b to i32282  ret i32 %c283}284 285; CHECK-LABEL: all_v2i64_eq:286; CHECK-NEXT: .functype all_v2i64_eq (v128) -> (i32){{$}}287; CHECK-NEXT: i64x2.all_true $push[[R:[0-9]+]]=, $0{{$}}288; CHECK-NEXT: return $pop[[R]]{{$}}289define i32 @all_v2i64_eq(<2 x i64> %x) {290  %a = call i32 @llvm.wasm.alltrue.v2i64(<2 x i64> %x)291  %b = icmp eq i32 %a, 1292  %c = zext i1 %b to i32293  ret i32 %c294}295