143 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc < %s -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+simd128 | FileCheck %s3 4target triple = "wasm32-unknown-unknown"5 6declare i32 @memcmp(ptr, ptr, i32)7 8define i1 @memcmp_expand_3(ptr %a, ptr %b) {9; CHECK-LABEL: memcmp_expand_3:10; CHECK: .functype memcmp_expand_3 (i32, i32) -> (i32)11; CHECK-NEXT: # %bb.0:12; CHECK-NEXT: i32.load16_u $push7=, 0($0):p2align=013; CHECK-NEXT: i32.load16_u $push6=, 0($1):p2align=014; CHECK-NEXT: i32.xor $push8=, $pop7, $pop615; CHECK-NEXT: i32.const $push0=, 216; CHECK-NEXT: i32.add $push3=, $0, $pop017; CHECK-NEXT: i32.load8_u $push4=, 0($pop3)18; CHECK-NEXT: i32.const $push13=, 219; CHECK-NEXT: i32.add $push1=, $1, $pop1320; CHECK-NEXT: i32.load8_u $push2=, 0($pop1)21; CHECK-NEXT: i32.xor $push5=, $pop4, $pop222; CHECK-NEXT: i32.or $push9=, $pop8, $pop523; CHECK-NEXT: i32.const $push10=, 6553524; CHECK-NEXT: i32.and $push11=, $pop9, $pop1025; CHECK-NEXT: i32.eqz $push12=, $pop1126; CHECK-NEXT: return $pop1227 %cmp_3 = call i32 @memcmp(ptr %a, ptr %b, i32 3)28 %res = icmp eq i32 %cmp_3, 029 ret i1 %res30}31 32define i1 @memcmp_expand_5(ptr %a, ptr %b) {33; CHECK-LABEL: memcmp_expand_5:34; CHECK: .functype memcmp_expand_5 (i32, i32) -> (i32)35; CHECK-NEXT: # %bb.0:36; CHECK-NEXT: i32.load $push7=, 0($0):p2align=037; CHECK-NEXT: i32.load $push6=, 0($1):p2align=038; CHECK-NEXT: i32.xor $push8=, $pop7, $pop639; CHECK-NEXT: i32.const $push0=, 440; CHECK-NEXT: i32.add $push3=, $0, $pop041; CHECK-NEXT: i32.load8_u $push4=, 0($pop3)42; CHECK-NEXT: i32.const $push11=, 443; CHECK-NEXT: i32.add $push1=, $1, $pop1144; CHECK-NEXT: i32.load8_u $push2=, 0($pop1)45; CHECK-NEXT: i32.xor $push5=, $pop4, $pop246; CHECK-NEXT: i32.or $push9=, $pop8, $pop547; CHECK-NEXT: i32.eqz $push10=, $pop948; CHECK-NEXT: return $pop1049 %cmp_5 = call i32 @memcmp(ptr %a, ptr %b, i32 5)50 %res = icmp eq i32 %cmp_5, 051 ret i1 %res52}53 54define i1 @memcmp_expand_7(ptr %a, ptr %b) {55; CHECK-LABEL: memcmp_expand_7:56; CHECK: .functype memcmp_expand_7 (i32, i32) -> (i32)57; CHECK-NEXT: # %bb.0:58; CHECK-NEXT: i32.load $push7=, 0($0):p2align=059; CHECK-NEXT: i32.load $push6=, 0($1):p2align=060; CHECK-NEXT: i32.xor $push8=, $pop7, $pop661; CHECK-NEXT: i32.const $push0=, 362; CHECK-NEXT: i32.add $push3=, $0, $pop063; CHECK-NEXT: i32.load $push4=, 0($pop3):p2align=064; CHECK-NEXT: i32.const $push11=, 365; CHECK-NEXT: i32.add $push1=, $1, $pop1166; CHECK-NEXT: i32.load $push2=, 0($pop1):p2align=067; CHECK-NEXT: i32.xor $push5=, $pop4, $pop268; CHECK-NEXT: i32.or $push9=, $pop8, $pop569; CHECK-NEXT: i32.eqz $push10=, $pop970; CHECK-NEXT: return $pop1071 %cmp_7 = call i32 @memcmp(ptr %a, ptr %b, i32 7)72 %res = icmp eq i32 %cmp_7, 073 ret i1 %res74}75 76; INFO: Negative test77; Should not expand even with simd12878define i1 @memcmp_expand_129(ptr %a, ptr %b) {79; CHECK-LABEL: memcmp_expand_129:80; CHECK: .functype memcmp_expand_129 (i32, i32) -> (i32)81; CHECK-NEXT: # %bb.0:82; CHECK-NEXT: i32.const $push0=, 12983; CHECK-NEXT: call $push1=, memcmp, $0, $1, $pop084; CHECK-NEXT: i32.eqz $push2=, $pop185; CHECK-NEXT: return $pop286 %cmp_129 = call i32 @memcmp(ptr %a, ptr %b, i32 129)87 %res = icmp eq i32 %cmp_129, 088 ret i1 %res89}90 91define i1 @memcmp_expand_2(ptr %a, ptr %b) {92; CHECK-LABEL: memcmp_expand_2:93; CHECK: .functype memcmp_expand_2 (i32, i32) -> (i32)94; CHECK-NEXT: # %bb.0:95; CHECK-NEXT: i32.load16_u $push1=, 0($0):p2align=096; CHECK-NEXT: i32.load16_u $push0=, 0($1):p2align=097; CHECK-NEXT: i32.eq $push2=, $pop1, $pop098; CHECK-NEXT: return $pop299 %cmp_2 = call i32 @memcmp(ptr %a, ptr %b, i32 2)100 %res = icmp eq i32 %cmp_2, 0101 ret i1 %res102}103 104define i1 @memcmp_expand_2_align(ptr align(2) %a, ptr align(2) %b) {105; CHECK-LABEL: memcmp_expand_2_align:106; CHECK: .functype memcmp_expand_2_align (i32, i32) -> (i32)107; CHECK-NEXT: # %bb.0:108; CHECK-NEXT: i32.load16_u $push1=, 0($0)109; CHECK-NEXT: i32.load16_u $push0=, 0($1)110; CHECK-NEXT: i32.eq $push2=, $pop1, $pop0111; CHECK-NEXT: return $pop2112 %cmp_2 = call i32 @memcmp(ptr %a, ptr %b, i32 2)113 %res = icmp eq i32 %cmp_2, 0114 ret i1 %res115}116 117define i1 @memcmp_expand_8(ptr %a, ptr %b) {118; CHECK-LABEL: memcmp_expand_8:119; CHECK: .functype memcmp_expand_8 (i32, i32) -> (i32)120; CHECK-NEXT: # %bb.0:121; CHECK-NEXT: i64.load $push1=, 0($0):p2align=0122; CHECK-NEXT: i64.load $push0=, 0($1):p2align=0123; CHECK-NEXT: i64.eq $push2=, $pop1, $pop0124; CHECK-NEXT: return $pop2125 %cmp_8 = call i32 @memcmp(ptr %a, ptr %b, i32 8)126 %res = icmp eq i32 %cmp_8, 0127 ret i1 %res128}129 130define i1 @memcmp_expand_16(ptr %a, ptr %b) {131; CHECK-LABEL: memcmp_expand_16:132; CHECK: .functype memcmp_expand_16 (i32, i32) -> (i32)133; CHECK-NEXT: # %bb.0:134; CHECK-NEXT: v128.load $push1=, 0($0):p2align=0135; CHECK-NEXT: v128.load $push0=, 0($1):p2align=0136; CHECK-NEXT: i8x16.eq $push2=, $pop1, $pop0137; CHECK-NEXT: i8x16.all_true $push3=, $pop2138; CHECK-NEXT: return $pop3139 %cmp_16 = call i32 @memcmp(ptr %a, ptr %b, i32 16)140 %res = icmp eq i32 %cmp_16, 0141 ret i1 %res142}143