167 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 22# RUN: llc -mtriple=x86_64-linux-gnu -mattr=+lzcnt -run-pass=legalizer %s -o - | FileCheck %s --check-prefixes=CHECK,X643# RUN: llc -mtriple=i386-linux-gnu -mattr=+lzcnt -run-pass=legalizer -global-isel-abort=2 -pass-remarks-missed='gisel*' %s 2>%t -o - | FileCheck %s --check-prefixes=CHECK,X864# RUN: FileCheck -check-prefix=ERR32 %s < %t5 6# ERR32: remark: <unknown>:0:0: unable to legalize instruction: %10:_(s64) = G_CTLZ_ZERO_UNDEF %4:_(s32) (in function: test_ctlz64)7 8# test count leading zeros for s16, s32, and s649 10---11name: test_ctlz3512alignment: 1613legalized: false14regBankSelected: false15registers:16 - { id: 0, class: _, preferred-register: '' }17body: |18 bb.1:19 ; X64-LABEL: name: test_ctlz3520 ; X64: [[COPY:%[0-9]+]]:_(s64) = COPY $rdx21 ; X64-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 3435973836722 ; X64-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[COPY]], [[C]]23 ; X64-NEXT: [[CTLZ:%[0-9]+]]:_(s64) = G_CTLZ [[AND]](s64)24 ; X64-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2925 ; X64-NEXT: [[SUB:%[0-9]+]]:_(s64) = G_SUB [[CTLZ]], [[C1]]26 ; X64-NEXT: [[AND1:%[0-9]+]]:_(s64) = G_AND [[SUB]], [[C]]27 ; X64-NEXT: RET 0, implicit [[AND1]](s64)28 ;29 ; X86-LABEL: name: test_ctlz3530 ; X86: [[COPY:%[0-9]+]]:_(s64) = COPY $rdx31 ; X86-NEXT: [[TRUNC:%[0-9]+]]:_(s35) = G_TRUNC [[COPY]](s64)32 ; X86-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[TRUNC]](s35)33 ; X86-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[ZEXT]](s64)34 ; X86-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 035 ; X86-NEXT: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[UV1]](s32), [[C]]36 ; X86-NEXT: [[CTLZ:%[0-9]+]]:_(s64) = G_CTLZ [[UV]](s32)37 ; X86-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 3238 ; X86-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[CTLZ]], [[C1]]39 ; X86-NEXT: [[CTLZ_ZERO_UNDEF:%[0-9]+]]:_(s64) = G_CTLZ_ZERO_UNDEF [[UV1]](s32)40 ; X86-NEXT: [[ZEXT1:%[0-9]+]]:_(s32) = G_ZEXT [[ICMP]](s1)41 ; X86-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[ADD]](s64)42 ; X86-NEXT: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[CTLZ_ZERO_UNDEF]](s64)43 ; X86-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[ZEXT1]](s32), [[UV2]], [[UV4]]44 ; X86-NEXT: [[SELECT1:%[0-9]+]]:_(s32) = G_SELECT [[ZEXT1]](s32), [[UV3]], [[UV5]]45 ; X86-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[SELECT]](s32), [[SELECT1]](s32)46 ; X86-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 2947 ; X86-NEXT: [[MV1:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[C2]](s32), [[C]](s32)48 ; X86-NEXT: [[UV6:%[0-9]+]]:_(s32), [[UV7:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[MV]](s64)49 ; X86-NEXT: [[UV8:%[0-9]+]]:_(s32), [[UV9:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[MV1]](s64)50 ; X86-NEXT: [[USUBO:%[0-9]+]]:_(s32), [[USUBO1:%[0-9]+]]:_(s8) = G_USUBO [[UV6]], [[UV8]]51 ; X86-NEXT: [[TRUNC1:%[0-9]+]]:_(s1) = G_TRUNC [[USUBO1]](s8)52 ; X86-NEXT: [[ZEXT2:%[0-9]+]]:_(s8) = G_ZEXT [[TRUNC1]](s1)53 ; X86-NEXT: [[USUBE:%[0-9]+]]:_(s32), [[USUBE1:%[0-9]+]]:_(s8) = G_USUBE [[UV7]], [[UV9]], [[ZEXT2]]54 ; X86-NEXT: [[TRUNC2:%[0-9]+]]:_(s1) = G_TRUNC [[USUBE1]](s8)55 ; X86-NEXT: [[MV2:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[USUBO]](s32), [[USUBE]](s32)56 ; X86-NEXT: [[TRUNC3:%[0-9]+]]:_(s35) = G_TRUNC [[MV2]](s64)57 ; X86-NEXT: [[ZEXT3:%[0-9]+]]:_(s64) = G_ZEXT [[TRUNC3]](s35)58 ; X86-NEXT: RET 0, implicit [[ZEXT3]](s64)59 %0(s64) = COPY $rdx60 %1:_(s35) = G_TRUNC %0(s64)61 %2:_(s35) = G_CTLZ %162 %3:_(s64) = G_ZEXT %263 RET 0, implicit %364...65---66name: test_ctlz867alignment: 1668legalized: false69regBankSelected: false70registers:71 - { id: 0, class: _, preferred-register: '' }72 - { id: 1, class: _, preferred-register: '' }73body: |74 bb.1:75 ; CHECK-LABEL: name: test_ctlz876 ; CHECK: [[DEF:%[0-9]+]]:_(s8) = IMPLICIT_DEF77 ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s16) = G_ZEXT [[DEF]](s8)78 ; CHECK-NEXT: [[CTLZ:%[0-9]+]]:_(s16) = G_CTLZ [[ZEXT]](s16)79 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 880 ; CHECK-NEXT: [[SUB:%[0-9]+]]:_(s16) = G_SUB [[CTLZ]], [[C]]81 ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[SUB]](s16)82 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s8) = COPY [[TRUNC]](s8)83 ; CHECK-NEXT: RET 0, implicit [[COPY]](s8)84 %0:_(s8) = IMPLICIT_DEF85 %1:_(s8) = G_CTLZ %086 %2:_(s8) = COPY %1(s8)87 RET 0, implicit %288...89---90name: test_ctlz6491alignment: 1692legalized: false93regBankSelected: false94registers:95 - { id: 0, class: _, preferred-register: '' }96 - { id: 1, class: _, preferred-register: '' }97body: |98 bb.1:99 ; X64-LABEL: name: test_ctlz64100 ; X64: [[DEF:%[0-9]+]]:_(s64) = IMPLICIT_DEF101 ; X64-NEXT: [[CTLZ:%[0-9]+]]:_(s64) = G_CTLZ [[DEF]](s64)102 ; X64-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY [[CTLZ]](s64)103 ; X64-NEXT: RET 0, implicit [[COPY]](s64)104 ;105 ; X86-LABEL: name: test_ctlz64106 ; X86: [[DEF:%[0-9]+]]:_(s64) = IMPLICIT_DEF107 ; X86-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[DEF]](s64)108 ; X86-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0109 ; X86-NEXT: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[UV1]](s32), [[C]]110 ; X86-NEXT: [[CTLZ:%[0-9]+]]:_(s64) = G_CTLZ [[UV]](s32)111 ; X86-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 32112 ; X86-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[CTLZ]], [[C1]]113 ; X86-NEXT: [[CTLZ_ZERO_UNDEF:%[0-9]+]]:_(s64) = G_CTLZ_ZERO_UNDEF [[UV1]](s32)114 ; X86-NEXT: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[ICMP]](s1)115 ; X86-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[ADD]](s64)116 ; X86-NEXT: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[CTLZ_ZERO_UNDEF]](s64)117 ; X86-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[ZEXT]](s32), [[UV2]], [[UV4]]118 ; X86-NEXT: [[SELECT1:%[0-9]+]]:_(s32) = G_SELECT [[ZEXT]](s32), [[UV3]], [[UV5]]119 ; X86-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[SELECT]](s32), [[SELECT1]](s32)120 ; X86-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY [[MV]](s64)121 ; X86-NEXT: RET 0, implicit [[COPY]](s64)122 %0:_(s64) = IMPLICIT_DEF123 %1:_(s64) = G_CTLZ %0124 %2:_(s64) = COPY %1(s64)125 RET 0, implicit %2126...127---128name: test_ctlz32129alignment: 16130legalized: false131regBankSelected: false132registers:133 - { id: 0, class: _, preferred-register: '' }134 - { id: 1, class: _, preferred-register: '' }135body: |136 bb.1:137 ; CHECK-LABEL: name: test_ctlz32138 ; CHECK: [[DEF:%[0-9]+]]:_(s32) = IMPLICIT_DEF139 ; CHECK-NEXT: [[CTLZ:%[0-9]+]]:_(s32) = G_CTLZ [[DEF]](s32)140 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY [[CTLZ]](s32)141 ; CHECK-NEXT: RET 0, implicit [[COPY]](s32)142 %0:_(s32) = IMPLICIT_DEF143 %1:_(s32) = G_CTLZ %0144 %2:_(s32) = COPY %1(s32)145 RET 0, implicit %2146...147---148name: test_ctlz16149alignment: 16150legalized: false151regBankSelected: false152registers:153 - { id: 0, class: _, preferred-register: '' }154 - { id: 1, class: _, preferred-register: '' }155body: |156 bb.1:157 ; CHECK-LABEL: name: test_ctlz16158 ; CHECK: [[DEF:%[0-9]+]]:_(s16) = IMPLICIT_DEF159 ; CHECK-NEXT: [[CTLZ:%[0-9]+]]:_(s16) = G_CTLZ [[DEF]](s16)160 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s16) = COPY [[CTLZ]](s16)161 ; CHECK-NEXT: RET 0, implicit [[COPY]](s16)162 %0:_(s16) = IMPLICIT_DEF163 %1:_(s16) = G_CTLZ %0164 %2:_(s16) = COPY %1(s16)165 RET 0, implicit %2166...167