diff --git a/llvm/lib/Target/X86/X86LegalizerInfo.cpp b/llvm/lib/Target/X86/X86LegalizerInfo.cpp --- a/llvm/lib/Target/X86/X86LegalizerInfo.cpp +++ b/llvm/lib/Target/X86/X86LegalizerInfo.cpp @@ -289,6 +289,15 @@ .widenScalarToNextPow2(1, /*Min=*/8) .clampScalar(1, s8, sMaxScalar); + // todo: vectors + getActionDefinitionsBuilder(G_SELECT) + // .legalFor({{s8, s8}, {s16, s16}, {s32, s32}, {s64, s64}, {p0, p0}}) + .legalFor({s8, s16, s32, s64, p0}) + .widenScalarToNextPow2(0, /*Min=*/8) + .clampScalar(0, s8, sMaxScalar) + .widenScalarToNextPow2(1, /*Min=*/8) + .clampScalar(1, s8, sMaxScalar); + setLegalizerInfo32bit(); setLegalizerInfo64bit(); setLegalizerInfoSSE1(); diff --git a/llvm/test/CodeGen/X86/GlobalISel/legalize-leading-zeros.mir b/llvm/test/CodeGen/X86/GlobalISel/legalize-leading-zeros.mir --- a/llvm/test/CodeGen/X86/GlobalISel/legalize-leading-zeros.mir +++ b/llvm/test/CodeGen/X86/GlobalISel/legalize-leading-zeros.mir @@ -1,10 +1,6 @@ # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 2 # RUN: llc -mtriple=x86_64-linux-gnu -mattr=+lzcnt -run-pass=legalizer %s -o - | FileCheck %s --check-prefixes=CHECK,X64 # 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,X86 -# RUN: FileCheck -check-prefix=ERR32 %s < %t - -# ERR32: remark: :0:0: unable to legalize instruction: %13:_(s32), %14:_(s1) = G_USUBE %8:_, %10:_, %12:_ (in function: test_ctlz35) -# ERR32: remark: :0:0: unable to legalize instruction: %1:_(s64) = G_SELECT %6:_(s1), %9:_, %10:_ (in function: test_ctlz64) # test count leading zeros for s16, s32, and s64 @@ -93,8 +89,13 @@ ; X86-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 32 ; X86-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[CTLZ]], [[C1]] ; X86-NEXT: [[CTLZ_ZERO_UNDEF:%[0-9]+]]:_(s64) = G_CTLZ_ZERO_UNDEF [[UV1]](s32) - ; X86-NEXT: [[SELECT:%[0-9]+]]:_(s64) = G_SELECT [[ICMP]](s1), [[ADD]], [[CTLZ_ZERO_UNDEF]] - ; X86-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY [[SELECT]](s64) + ; X86-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[ADD]](s64) + ; X86-NEXT: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[CTLZ_ZERO_UNDEF]](s64) + ; X86-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[ICMP]](s1), [[UV2]], [[UV4]] + ; X86-NEXT: [[ZEXT:%[0-9]+]]:_(s8) = G_ZEXT [[ICMP]](s1) + ; X86-NEXT: [[SELECT1:%[0-9]+]]:_(s32) = G_SELECT [[ZEXT]](s8), [[UV3]], [[UV5]] + ; X86-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[SELECT]](s32), [[SELECT1]](s32) + ; X86-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY [[MV]](s64) ; X86-NEXT: RET 0, implicit [[COPY]](s64) %0:_(s64) = IMPLICIT_DEF %1:_(s64) = G_CTLZ %0 diff --git a/llvm/test/CodeGen/X86/GlobalISel/legalize-select.mir b/llvm/test/CodeGen/X86/GlobalISel/legalize-select.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/X86/GlobalISel/legalize-select.mir @@ -0,0 +1,83 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 2 +# RUN: llc -mtriple=i386-linux-gnu -run-pass=legalizer %s -o - | FileCheck %s --check-prefixes=CHECK,X86 + +# test select + +... +--- +name: test_selectp0 +body: | + bb.1: + ; CHECK-LABEL: name: test_selectp0 + ; CHECK: [[DEF:%[0-9]+]]:_(s1) = IMPLICIT_DEF + ; CHECK-NEXT: [[DEF1:%[0-9]+]]:_(p0) = IMPLICIT_DEF + ; CHECK-NEXT: [[DEF2:%[0-9]+]]:_(p0) = IMPLICIT_DEF + ; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(p0) = G_SELECT [[DEF]](s1), [[DEF1]], [[DEF2]] + ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY [[SELECT]](p0) + ; CHECK-NEXT: RET 0, implicit [[COPY]](p0) + %0:_(s1) = IMPLICIT_DEF + %1:_(p0) = IMPLICIT_DEF + %2:_(p0) = IMPLICIT_DEF + %3:_(p0) = G_SELECT %0, %1, %2 + %4:_(p0) = COPY %3(p0) + RET 0, implicit %4 + +... +--- +name: test_selects10 +body: | + bb.1: + ; CHECK-LABEL: name: test_selects10 + ; CHECK: [[DEF:%[0-9]+]]:_(s1) = IMPLICIT_DEF + ; CHECK-NEXT: [[DEF1:%[0-9]+]]:_(s10) = IMPLICIT_DEF + ; CHECK-NEXT: [[DEF2:%[0-9]+]]:_(s10) = IMPLICIT_DEF + ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s16) = G_ANYEXT [[DEF1]](s10) + ; CHECK-NEXT: [[ANYEXT1:%[0-9]+]]:_(s16) = G_ANYEXT [[DEF2]](s10) + ; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s16) = G_SELECT [[DEF]](s1), [[ANYEXT]], [[ANYEXT1]] + ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s10) = G_TRUNC [[SELECT]](s16) + ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s10) = COPY [[TRUNC]](s10) + ; CHECK-NEXT: RET 0, implicit [[COPY]](s10) + %0:_(s1) = IMPLICIT_DEF + %1:_(s10) = IMPLICIT_DEF + %2:_(s10) = IMPLICIT_DEF + %3:_(s10) = G_SELECT %0, %1, %2 + %4:_(s10) = COPY %3(s10) + RET 0, implicit %4 + +... +--- +name: test_select32 +body: | + bb.1: + ; CHECK-LABEL: name: test_select32 + ; CHECK: [[DEF:%[0-9]+]]:_(s1) = IMPLICIT_DEF + ; CHECK-NEXT: [[DEF1:%[0-9]+]]:_(s32) = IMPLICIT_DEF + ; CHECK-NEXT: [[DEF2:%[0-9]+]]:_(s32) = IMPLICIT_DEF + ; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[DEF]](s1), [[DEF1]], [[DEF2]] + ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY [[SELECT]](s32) + ; CHECK-NEXT: RET 0, implicit [[COPY]](s32) + %0:_(s1) = IMPLICIT_DEF + %1:_(s32) = IMPLICIT_DEF + %2:_(s32) = IMPLICIT_DEF + %3:_(s32) = G_SELECT %0, %1, %2 + %4:_(s32) = COPY %3(s32) + RET 0, implicit %4 + +... +--- +name: test_select16 +body: | + bb.1: + ; CHECK-LABEL: name: test_select16 + ; CHECK: [[DEF:%[0-9]+]]:_(s1) = IMPLICIT_DEF + ; CHECK-NEXT: [[DEF1:%[0-9]+]]:_(s16) = IMPLICIT_DEF + ; CHECK-NEXT: [[DEF2:%[0-9]+]]:_(s16) = IMPLICIT_DEF + ; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s16) = G_SELECT [[DEF]](s1), [[DEF1]], [[DEF2]] + ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s16) = COPY [[SELECT]](s16) + ; CHECK-NEXT: RET 0, implicit [[COPY]](s16) + %0:_(s1) = IMPLICIT_DEF + %1:_(s16) = IMPLICIT_DEF + %2:_(s16) = IMPLICIT_DEF + %3:_(s16) = G_SELECT %0, %1, %2 + %4:_(s16) = COPY %3(s16) + RET 0, implicit %4 diff --git a/llvm/test/CodeGen/X86/GlobalISel/legalize-trailing-zeros-undef.mir b/llvm/test/CodeGen/X86/GlobalISel/legalize-trailing-zeros-undef.mir --- a/llvm/test/CodeGen/X86/GlobalISel/legalize-trailing-zeros-undef.mir +++ b/llvm/test/CodeGen/X86/GlobalISel/legalize-trailing-zeros-undef.mir @@ -1,10 +1,6 @@ # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 2 # RUN: llc -mtriple=x86_64-linux-gnu -run-pass=legalizer %s -o - | FileCheck %s --check-prefixes=CHECK,X64 # RUN: llc -mtriple=i386-linux-gnu -run-pass=legalizer -global-isel-abort=2 -pass-remarks-missed='gisel*' %s 2>%t -o - | FileCheck %s --check-prefixes=CHECK,X86 -# RUN: FileCheck -check-prefix=ERR32 %s < %t - -# ERR32: remark: :0:0: unable to legalize instruction: %4:_(s64) = G_SELECT %8:_(s1), %11:_, %12:_ (in function: test_cttz35) -# ERR32: remark: :0:0: unable to legalize instruction: %1:_(s64) = G_SELECT %6:_(s1), %9:_, %10:_ (in function: test_cttz64) # test count leading zeros for s16, s32, and s64 @@ -35,8 +31,13 @@ ; X86-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 32 ; X86-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[CTTZ_ZERO_UNDEF]], [[C1]] ; X86-NEXT: [[CTTZ_ZERO_UNDEF1:%[0-9]+]]:_(s64) = G_CTTZ_ZERO_UNDEF [[UV]](s32) - ; X86-NEXT: [[SELECT:%[0-9]+]]:_(s64) = G_SELECT [[ICMP]](s1), [[ADD]], [[CTTZ_ZERO_UNDEF1]] - ; X86-NEXT: [[TRUNC:%[0-9]+]]:_(s35) = G_TRUNC [[SELECT]](s64) + ; X86-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[ADD]](s64) + ; X86-NEXT: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[CTTZ_ZERO_UNDEF1]](s64) + ; X86-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[ICMP]](s1), [[UV2]], [[UV4]] + ; X86-NEXT: [[ZEXT:%[0-9]+]]:_(s8) = G_ZEXT [[ICMP]](s1) + ; X86-NEXT: [[SELECT1:%[0-9]+]]:_(s32) = G_SELECT [[ZEXT]](s8), [[UV3]], [[UV5]] + ; X86-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[SELECT]](s32), [[SELECT1]](s32) + ; X86-NEXT: [[TRUNC:%[0-9]+]]:_(s35) = G_TRUNC [[MV]](s64) ; X86-NEXT: [[COPY:%[0-9]+]]:_(s35) = COPY [[TRUNC]](s35) ; X86-NEXT: RET 0, implicit [[COPY]](s35) %0:_(s35) = IMPLICIT_DEF @@ -90,8 +91,13 @@ ; X86-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 32 ; X86-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[CTTZ_ZERO_UNDEF]], [[C1]] ; X86-NEXT: [[CTTZ_ZERO_UNDEF1:%[0-9]+]]:_(s64) = G_CTTZ_ZERO_UNDEF [[UV]](s32) - ; X86-NEXT: [[SELECT:%[0-9]+]]:_(s64) = G_SELECT [[ICMP]](s1), [[ADD]], [[CTTZ_ZERO_UNDEF1]] - ; X86-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY [[SELECT]](s64) + ; X86-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[ADD]](s64) + ; X86-NEXT: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[CTTZ_ZERO_UNDEF1]](s64) + ; X86-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[ICMP]](s1), [[UV2]], [[UV4]] + ; X86-NEXT: [[ZEXT:%[0-9]+]]:_(s8) = G_ZEXT [[ICMP]](s1) + ; X86-NEXT: [[SELECT1:%[0-9]+]]:_(s32) = G_SELECT [[ZEXT]](s8), [[UV3]], [[UV5]] + ; X86-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[SELECT]](s32), [[SELECT1]](s32) + ; X86-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY [[MV]](s64) ; X86-NEXT: RET 0, implicit [[COPY]](s64) %0:_(s64) = IMPLICIT_DEF %1:_(s64) = G_CTTZ_ZERO_UNDEF %0 diff --git a/llvm/test/CodeGen/X86/GlobalISel/legalize-trailing-zeros.mir b/llvm/test/CodeGen/X86/GlobalISel/legalize-trailing-zeros.mir --- a/llvm/test/CodeGen/X86/GlobalISel/legalize-trailing-zeros.mir +++ b/llvm/test/CodeGen/X86/GlobalISel/legalize-trailing-zeros.mir @@ -1,10 +1,6 @@ # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 2 # RUN: llc -mtriple=x86_64-linux-gnu -mattr=+bmi -run-pass=legalizer %s -o - | FileCheck %s --check-prefixes=CHECK,X64 # RUN: llc -mtriple=i386-linux-gnu -mattr=+bmi -run-pass=legalizer -global-isel-abort=2 -pass-remarks-missed='gisel*' %s 2>%t -o - | FileCheck %s --check-prefixes=CHECK,X86 -# RUN: FileCheck -check-prefix=ERR32 %s < %t - -# ERR32: remark: :0:0: unable to legalize instruction: %6:_(s64) = G_SELECT %10:_(s1), %13:_, %14:_ (in function: test_cttz35) -# ERR32: remark: :0:0: unable to legalize instruction: %1:_(s64) = G_SELECT %6:_(s1), %9:_, %10:_ (in function: test_cttz64) # test count leading zeros for s16, s32, and s64 @@ -39,8 +35,13 @@ ; X86-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 32 ; X86-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[CTTZ_ZERO_UNDEF]], [[C2]] ; X86-NEXT: [[CTTZ_ZERO_UNDEF1:%[0-9]+]]:_(s64) = G_CTTZ_ZERO_UNDEF [[UV]](s32) - ; X86-NEXT: [[SELECT:%[0-9]+]]:_(s64) = G_SELECT [[ICMP]](s1), [[ADD]], [[CTTZ_ZERO_UNDEF1]] - ; X86-NEXT: [[TRUNC:%[0-9]+]]:_(s35) = G_TRUNC [[SELECT]](s64) + ; X86-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[ADD]](s64) + ; X86-NEXT: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[CTTZ_ZERO_UNDEF1]](s64) + ; X86-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[ICMP]](s1), [[UV2]], [[UV4]] + ; X86-NEXT: [[ZEXT:%[0-9]+]]:_(s8) = G_ZEXT [[ICMP]](s1) + ; X86-NEXT: [[SELECT1:%[0-9]+]]:_(s32) = G_SELECT [[ZEXT]](s8), [[UV3]], [[UV5]] + ; X86-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[SELECT]](s32), [[SELECT1]](s32) + ; X86-NEXT: [[TRUNC:%[0-9]+]]:_(s35) = G_TRUNC [[MV]](s64) ; X86-NEXT: [[COPY:%[0-9]+]]:_(s35) = COPY [[TRUNC]](s35) ; X86-NEXT: RET 0, implicit [[COPY]](s35) %0:_(s35) = IMPLICIT_DEF @@ -96,8 +97,13 @@ ; X86-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 32 ; X86-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[CTTZ]], [[C1]] ; X86-NEXT: [[CTTZ_ZERO_UNDEF:%[0-9]+]]:_(s64) = G_CTTZ_ZERO_UNDEF [[UV]](s32) - ; X86-NEXT: [[SELECT:%[0-9]+]]:_(s64) = G_SELECT [[ICMP]](s1), [[ADD]], [[CTTZ_ZERO_UNDEF]] - ; X86-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY [[SELECT]](s64) + ; X86-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[ADD]](s64) + ; X86-NEXT: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[CTTZ_ZERO_UNDEF]](s64) + ; X86-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[ICMP]](s1), [[UV2]], [[UV4]] + ; X86-NEXT: [[ZEXT:%[0-9]+]]:_(s8) = G_ZEXT [[ICMP]](s1) + ; X86-NEXT: [[SELECT1:%[0-9]+]]:_(s32) = G_SELECT [[ZEXT]](s8), [[UV3]], [[UV5]] + ; X86-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[SELECT]](s32), [[SELECT1]](s32) + ; X86-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY [[MV]](s64) ; X86-NEXT: RET 0, implicit [[COPY]](s64) %0:_(s64) = IMPLICIT_DEF %1:_(s64) = G_CTTZ %0