brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.7 KiB · 93faf2e Raw
386 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers | FileCheck %s3; RUN: llc < %s -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -fast-isel -fast-isel-abort=1 | FileCheck %s --check-prefix=FAST4 5; Test that wasm select instruction is selected from LLVM select instruction.6 7target triple = "wasm32-unknown-unknown"8 9define i32 @select_i32_bool(i1 zeroext %a, i32 %b, i32 %c) {10; CHECK-LABEL: select_i32_bool:11; CHECK:         .functype select_i32_bool (i32, i32, i32) -> (i32)12; CHECK-NEXT:  # %bb.0:13; CHECK-NEXT:    i32.select $push0=, $1, $2, $014; CHECK-NEXT:    return $pop015;16; FAST-LABEL: select_i32_bool:17; FAST:         .functype select_i32_bool (i32, i32, i32) -> (i32)18; FAST-NEXT:  # %bb.0:19; FAST-NEXT:    i32.select $push0=, $1, $2, $020; FAST-NEXT:    return $pop021  %cond = select i1 %a, i32 %b, i32 %c22  ret i32 %cond23}24 25define i32 @select_i32_bool_nozext(i1 %a, i32 %b, i32 %c) {26; CHECK-LABEL: select_i32_bool_nozext:27; CHECK:         .functype select_i32_bool_nozext (i32, i32, i32) -> (i32)28; CHECK-NEXT:  # %bb.0:29; CHECK-NEXT:    i32.const $push0=, 130; CHECK-NEXT:    i32.and $push1=, $0, $pop031; CHECK-NEXT:    i32.select $push2=, $1, $2, $pop132; CHECK-NEXT:    return $pop233;34; FAST-LABEL: select_i32_bool_nozext:35; FAST:         .functype select_i32_bool_nozext (i32, i32, i32) -> (i32)36; FAST-NEXT:  # %bb.0:37; FAST-NEXT:    i32.const $push0=, 138; FAST-NEXT:    i32.and $push1=, $0, $pop039; FAST-NEXT:    i32.select $push2=, $1, $2, $pop140; FAST-NEXT:    return $pop241  %cond = select i1 %a, i32 %b, i32 %c42  ret i32 %cond43}44 45define i32 @select_i32_eq(i32 %a, i32 %b, i32 %c) {46; CHECK-LABEL: select_i32_eq:47; CHECK:         .functype select_i32_eq (i32, i32, i32) -> (i32)48; CHECK-NEXT:  # %bb.0:49; CHECK-NEXT:    i32.select $push0=, $2, $1, $050; CHECK-NEXT:    return $pop051;52; FAST-LABEL: select_i32_eq:53; FAST:         .functype select_i32_eq (i32, i32, i32) -> (i32)54; FAST-NEXT:  # %bb.0:55; FAST-NEXT:    i32.select $push0=, $2, $1, $056; FAST-NEXT:    return $pop057  %cmp = icmp eq i32 %a, 058  %cond = select i1 %cmp, i32 %b, i32 %c59  ret i32 %cond60}61 62define i32 @select_i32_ne(i32 %a, i32 %b, i32 %c) {63; CHECK-LABEL: select_i32_ne:64; CHECK:         .functype select_i32_ne (i32, i32, i32) -> (i32)65; CHECK-NEXT:  # %bb.0:66; CHECK-NEXT:    i32.select $push0=, $1, $2, $067; CHECK-NEXT:    return $pop068;69; FAST-LABEL: select_i32_ne:70; FAST:         .functype select_i32_ne (i32, i32, i32) -> (i32)71; FAST-NEXT:  # %bb.0:72; FAST-NEXT:    i32.select $push0=, $1, $2, $073; FAST-NEXT:    return $pop074  %cmp = icmp ne i32 %a, 075  %cond = select i1 %cmp, i32 %b, i32 %c76  ret i32 %cond77}78 79define i64 @select_i64_bool(i1 zeroext %a, i64 %b, i64 %c) {80; CHECK-LABEL: select_i64_bool:81; CHECK:         .functype select_i64_bool (i32, i64, i64) -> (i64)82; CHECK-NEXT:  # %bb.0:83; CHECK-NEXT:    i64.select $push0=, $1, $2, $084; CHECK-NEXT:    return $pop085;86; FAST-LABEL: select_i64_bool:87; FAST:         .functype select_i64_bool (i32, i64, i64) -> (i64)88; FAST-NEXT:  # %bb.0:89; FAST-NEXT:    i64.select $push0=, $1, $2, $090; FAST-NEXT:    return $pop091  %cond = select i1 %a, i64 %b, i64 %c92  ret i64 %cond93}94 95define i64 @select_i64_bool_nozext(i1 %a, i64 %b, i64 %c) {96; CHECK-LABEL: select_i64_bool_nozext:97; CHECK:         .functype select_i64_bool_nozext (i32, i64, i64) -> (i64)98; CHECK-NEXT:  # %bb.0:99; CHECK-NEXT:    i32.const $push0=, 1100; CHECK-NEXT:    i32.and $push1=, $0, $pop0101; CHECK-NEXT:    i64.select $push2=, $1, $2, $pop1102; CHECK-NEXT:    return $pop2103;104; FAST-LABEL: select_i64_bool_nozext:105; FAST:         .functype select_i64_bool_nozext (i32, i64, i64) -> (i64)106; FAST-NEXT:  # %bb.0:107; FAST-NEXT:    i32.const $push0=, 1108; FAST-NEXT:    i32.and $push1=, $0, $pop0109; FAST-NEXT:    i64.select $push2=, $1, $2, $pop1110; FAST-NEXT:    return $pop2111  %cond = select i1 %a, i64 %b, i64 %c112  ret i64 %cond113}114 115define i64 @select_i64_eq(i32 %a, i64 %b, i64 %c) {116; CHECK-LABEL: select_i64_eq:117; CHECK:         .functype select_i64_eq (i32, i64, i64) -> (i64)118; CHECK-NEXT:  # %bb.0:119; CHECK-NEXT:    i64.select $push0=, $2, $1, $0120; CHECK-NEXT:    return $pop0121;122; FAST-LABEL: select_i64_eq:123; FAST:         .functype select_i64_eq (i32, i64, i64) -> (i64)124; FAST-NEXT:  # %bb.0:125; FAST-NEXT:    i64.select $push0=, $2, $1, $0126; FAST-NEXT:    return $pop0127  %cmp = icmp eq i32 %a, 0128  %cond = select i1 %cmp, i64 %b, i64 %c129  ret i64 %cond130}131 132define i64 @select_i64_ne(i32 %a, i64 %b, i64 %c) {133; CHECK-LABEL: select_i64_ne:134; CHECK:         .functype select_i64_ne (i32, i64, i64) -> (i64)135; CHECK-NEXT:  # %bb.0:136; CHECK-NEXT:    i64.select $push0=, $1, $2, $0137; CHECK-NEXT:    return $pop0138;139; FAST-LABEL: select_i64_ne:140; FAST:         .functype select_i64_ne (i32, i64, i64) -> (i64)141; FAST-NEXT:  # %bb.0:142; FAST-NEXT:    i64.select $push0=, $1, $2, $0143; FAST-NEXT:    return $pop0144  %cmp = icmp ne i32 %a, 0145  %cond = select i1 %cmp, i64 %b, i64 %c146  ret i64 %cond147}148 149define float @select_f32_bool(i1 zeroext %a, float %b, float %c) {150; CHECK-LABEL: select_f32_bool:151; CHECK:         .functype select_f32_bool (i32, f32, f32) -> (f32)152; CHECK-NEXT:  # %bb.0:153; CHECK-NEXT:    f32.select $push0=, $1, $2, $0154; CHECK-NEXT:    return $pop0155;156; FAST-LABEL: select_f32_bool:157; FAST:         .functype select_f32_bool (i32, f32, f32) -> (f32)158; FAST-NEXT:  # %bb.0:159; FAST-NEXT:    f32.select $push0=, $1, $2, $0160; FAST-NEXT:    return $pop0161  %cond = select i1 %a, float %b, float %c162  ret float %cond163}164 165define float @select_f32_bool_nozext(i1 %a, float %b, float %c) {166; CHECK-LABEL: select_f32_bool_nozext:167; CHECK:         .functype select_f32_bool_nozext (i32, f32, f32) -> (f32)168; CHECK-NEXT:  # %bb.0:169; CHECK-NEXT:    i32.const $push0=, 1170; CHECK-NEXT:    i32.and $push1=, $0, $pop0171; CHECK-NEXT:    f32.select $push2=, $1, $2, $pop1172; CHECK-NEXT:    return $pop2173;174; FAST-LABEL: select_f32_bool_nozext:175; FAST:         .functype select_f32_bool_nozext (i32, f32, f32) -> (f32)176; FAST-NEXT:  # %bb.0:177; FAST-NEXT:    i32.const $push0=, 1178; FAST-NEXT:    i32.and $push1=, $0, $pop0179; FAST-NEXT:    f32.select $push2=, $1, $2, $pop1180; FAST-NEXT:    return $pop2181  %cond = select i1 %a, float %b, float %c182  ret float %cond183}184 185define float @select_f32_eq(i32 %a, float %b, float %c) {186; CHECK-LABEL: select_f32_eq:187; CHECK:         .functype select_f32_eq (i32, f32, f32) -> (f32)188; CHECK-NEXT:  # %bb.0:189; CHECK-NEXT:    f32.select $push0=, $2, $1, $0190; CHECK-NEXT:    return $pop0191;192; FAST-LABEL: select_f32_eq:193; FAST:         .functype select_f32_eq (i32, f32, f32) -> (f32)194; FAST-NEXT:  # %bb.0:195; FAST-NEXT:    f32.select $push0=, $2, $1, $0196; FAST-NEXT:    return $pop0197  %cmp = icmp eq i32 %a, 0198  %cond = select i1 %cmp, float %b, float %c199  ret float %cond200}201 202define float @select_f32_ne(i32 %a, float %b, float %c) {203; CHECK-LABEL: select_f32_ne:204; CHECK:         .functype select_f32_ne (i32, f32, f32) -> (f32)205; CHECK-NEXT:  # %bb.0:206; CHECK-NEXT:    f32.select $push0=, $1, $2, $0207; CHECK-NEXT:    return $pop0208;209; FAST-LABEL: select_f32_ne:210; FAST:         .functype select_f32_ne (i32, f32, f32) -> (f32)211; FAST-NEXT:  # %bb.0:212; FAST-NEXT:    f32.select $push0=, $1, $2, $0213; FAST-NEXT:    return $pop0214  %cmp = icmp ne i32 %a, 0215  %cond = select i1 %cmp, float %b, float %c216  ret float %cond217}218 219define double @select_f64_bool(i1 zeroext %a, double %b, double %c) {220; CHECK-LABEL: select_f64_bool:221; CHECK:         .functype select_f64_bool (i32, f64, f64) -> (f64)222; CHECK-NEXT:  # %bb.0:223; CHECK-NEXT:    f64.select $push0=, $1, $2, $0224; CHECK-NEXT:    return $pop0225;226; FAST-LABEL: select_f64_bool:227; FAST:         .functype select_f64_bool (i32, f64, f64) -> (f64)228; FAST-NEXT:  # %bb.0:229; FAST-NEXT:    f64.select $push0=, $1, $2, $0230; FAST-NEXT:    return $pop0231  %cond = select i1 %a, double %b, double %c232  ret double %cond233}234 235define double @select_f64_bool_nozext(i1 %a, double %b, double %c) {236; CHECK-LABEL: select_f64_bool_nozext:237; CHECK:         .functype select_f64_bool_nozext (i32, f64, f64) -> (f64)238; CHECK-NEXT:  # %bb.0:239; CHECK-NEXT:    i32.const $push0=, 1240; CHECK-NEXT:    i32.and $push1=, $0, $pop0241; CHECK-NEXT:    f64.select $push2=, $1, $2, $pop1242; CHECK-NEXT:    return $pop2243;244; FAST-LABEL: select_f64_bool_nozext:245; FAST:         .functype select_f64_bool_nozext (i32, f64, f64) -> (f64)246; FAST-NEXT:  # %bb.0:247; FAST-NEXT:    i32.const $push0=, 1248; FAST-NEXT:    i32.and $push1=, $0, $pop0249; FAST-NEXT:    f64.select $push2=, $1, $2, $pop1250; FAST-NEXT:    return $pop2251  %cond = select i1 %a, double %b, double %c252  ret double %cond253}254 255define double @select_f64_eq(i32 %a, double %b, double %c) {256; CHECK-LABEL: select_f64_eq:257; CHECK:         .functype select_f64_eq (i32, f64, f64) -> (f64)258; CHECK-NEXT:  # %bb.0:259; CHECK-NEXT:    f64.select $push0=, $2, $1, $0260; CHECK-NEXT:    return $pop0261;262; FAST-LABEL: select_f64_eq:263; FAST:         .functype select_f64_eq (i32, f64, f64) -> (f64)264; FAST-NEXT:  # %bb.0:265; FAST-NEXT:    f64.select $push0=, $2, $1, $0266; FAST-NEXT:    return $pop0267  %cmp = icmp eq i32 %a, 0268  %cond = select i1 %cmp, double %b, double %c269  ret double %cond270}271 272define double @select_f64_ne(i32 %a, double %b, double %c) {273; CHECK-LABEL: select_f64_ne:274; CHECK:         .functype select_f64_ne (i32, f64, f64) -> (f64)275; CHECK-NEXT:  # %bb.0:276; CHECK-NEXT:    f64.select $push0=, $1, $2, $0277; CHECK-NEXT:    return $pop0278;279; FAST-LABEL: select_f64_ne:280; FAST:         .functype select_f64_ne (i32, f64, f64) -> (f64)281; FAST-NEXT:  # %bb.0:282; FAST-NEXT:    f64.select $push0=, $1, $2, $0283; FAST-NEXT:    return $pop0284  %cmp = icmp ne i32 %a, 0285  %cond = select i1 %cmp, double %b, double %c286  ret double %cond287}288 289define i32 @pr40805_i32(i32 %x, i32 %y, i32 %z) {290; CHECK-LABEL: pr40805_i32:291; CHECK:         .functype pr40805_i32 (i32, i32, i32) -> (i32)292; CHECK-NEXT:  # %bb.0:293; CHECK-NEXT:    i32.const $push0=, 1294; CHECK-NEXT:    i32.and $push1=, $0, $pop0295; CHECK-NEXT:    i32.select $push2=, $1, $2, $pop1296; CHECK-NEXT:    return $pop2297;298; FAST-LABEL: pr40805_i32:299; FAST:         .functype pr40805_i32 (i32, i32, i32) -> (i32)300; FAST-NEXT:  # %bb.0:301; FAST-NEXT:    i32.const $push1=, 1302; FAST-NEXT:    i32.and $push2=, $0, $pop1303; FAST-NEXT:    i32.select $push0=, $1, $2, $pop2304; FAST-NEXT:    return $pop0305  %a = and i32 %x, 1306  %b = icmp ne i32 %a, 0307  %c = select i1 %b, i32 %y, i32 %z308  ret i32 %c309}310 311define i64 @pr40805_i64(i64 %x, i64 %y, i64 %z) {312; CHECK-LABEL: pr40805_i64:313; CHECK:         .functype pr40805_i64 (i64, i64, i64) -> (i64)314; CHECK-NEXT:  # %bb.0:315; CHECK-NEXT:    i32.wrap_i64 $push0=, $0316; CHECK-NEXT:    i32.const $push1=, 1317; CHECK-NEXT:    i32.and $push2=, $pop0, $pop1318; CHECK-NEXT:    i64.select $push3=, $1, $2, $pop2319; CHECK-NEXT:    return $pop3320;321; FAST-LABEL: pr40805_i64:322; FAST:         .functype pr40805_i64 (i64, i64, i64) -> (i64)323; FAST-NEXT:  # %bb.0:324; FAST-NEXT:    i64.const $push5=, 1325; FAST-NEXT:    i64.and $push6=, $0, $pop5326; FAST-NEXT:    i64.const $push3=, 0327; FAST-NEXT:    i64.ne $push4=, $pop6, $pop3328; FAST-NEXT:    i32.const $push0=, 1329; FAST-NEXT:    i32.and $push1=, $pop4, $pop0330; FAST-NEXT:    i64.select $push2=, $1, $2, $pop1331; FAST-NEXT:    return $pop2332  %a = and i64 %x, 1333  %b = icmp ne i64 %a, 0334  %c = select i1 %b, i64 %y, i64 %z335  ret i64 %c336}337 338define float @pr44012_i32(i32 %x, float %y, float %z) {339; CHECK-LABEL: pr44012_i32:340; CHECK:         .functype pr44012_i32 (i32, f32, f32) -> (f32)341; CHECK-NEXT:  # %bb.0:342; CHECK-NEXT:    i32.const $push0=, 1343; CHECK-NEXT:    i32.and $push1=, $0, $pop0344; CHECK-NEXT:    f32.select $push2=, $1, $2, $pop1345; CHECK-NEXT:    return $pop2346;347; FAST-LABEL: pr44012_i32:348; FAST:         .functype pr44012_i32 (i32, f32, f32) -> (f32)349; FAST-NEXT:  # %bb.0:350; FAST-NEXT:    i32.const $push1=, 1351; FAST-NEXT:    i32.and $push2=, $0, $pop1352; FAST-NEXT:    f32.select $push0=, $1, $2, $pop2353; FAST-NEXT:    return $pop0354  %a = and i32 %x, 1355  %b = icmp ne i32 %a, 0356  %c = select i1 %b, float %y, float %z357  ret float %c358}359 360define float @pr44012_i64(i64 %x, float %y, float %z) {361; CHECK-LABEL: pr44012_i64:362; CHECK:         .functype pr44012_i64 (i64, f32, f32) -> (f32)363; CHECK-NEXT:  # %bb.0:364; CHECK-NEXT:    i32.wrap_i64 $push0=, $0365; CHECK-NEXT:    i32.const $push1=, 1366; CHECK-NEXT:    i32.and $push2=, $pop0, $pop1367; CHECK-NEXT:    f32.select $push3=, $1, $2, $pop2368; CHECK-NEXT:    return $pop3369;370; FAST-LABEL: pr44012_i64:371; FAST:         .functype pr44012_i64 (i64, f32, f32) -> (f32)372; FAST-NEXT:  # %bb.0:373; FAST-NEXT:    i64.const $push5=, 1374; FAST-NEXT:    i64.and $push6=, $0, $pop5375; FAST-NEXT:    i64.const $push3=, 0376; FAST-NEXT:    i64.ne $push4=, $pop6, $pop3377; FAST-NEXT:    i32.const $push0=, 1378; FAST-NEXT:    i32.and $push1=, $pop4, $pop0379; FAST-NEXT:    f32.select $push2=, $1, $2, $pop1380; FAST-NEXT:    return $pop2381  %a = and i64 %x, 1382  %b = icmp ne i64 %a, 0383  %c = select i1 %b, float %y, float %z384  ret float %c385}386