[llvm] 3251593 - [X86] Place new constant node in topological order in X86DAGToDAGISel::matchBitExtract.
Roman Lebedev via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 14 23:36:49 PDT 2020
Thanks for the fix!
On Tue, Sep 15, 2020 at 2:29 AM Craig Topper via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
>
>
> Author: Craig Topper
> Date: 2020-09-14T16:28:37-07:00
> New Revision: 32515938901685bcbc438d5f5bb03cb8a9f4c637
>
> URL: https://github.com/llvm/llvm-project/commit/32515938901685bcbc438d5f5bb03cb8a9f4c637
> DIFF: https://github.com/llvm/llvm-project/commit/32515938901685bcbc438d5f5bb03cb8a9f4c637.diff
>
> LOG: [X86] Place new constant node in topological order in X86DAGToDAGISel::matchBitExtract.
>
> Fixes PR47525
>
> Added:
> llvm/test/CodeGen/X86/pr47525.ll
>
> Modified:
> llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
>
> Removed:
>
>
>
> ################################################################################
> diff --git a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
> index 840f132ec666..3b5a29ef31fc 100644
> --- a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
> +++ b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
> @@ -3502,6 +3502,7 @@ bool X86DAGToDAGISel::matchBitExtract(SDNode *Node) {
> // Shift NBits left by 8 bits, thus producing 'control'.
> // This makes the low 8 bits to be zero.
> SDValue C8 = CurDAG->getConstant(8, DL, MVT::i8);
> + insertDAGNode(*CurDAG, SDValue(Node, 0), C8);
> SDValue Control = CurDAG->getNode(ISD::SHL, DL, MVT::i32, NBits, C8);
> insertDAGNode(*CurDAG, SDValue(Node, 0), Control);
>
>
> diff --git a/llvm/test/CodeGen/X86/pr47525.ll b/llvm/test/CodeGen/X86/pr47525.ll
> new file mode 100644
> index 000000000000..e0f01f3c5115
> --- /dev/null
> +++ b/llvm/test/CodeGen/X86/pr47525.ll
> @@ -0,0 +1,42 @@
> +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
> +; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=bmi | FileCheck %s
> +
> + at a = external local_unnamed_addr global i32, align 4
> + at f = external local_unnamed_addr global i32, align 4
> +
> +define void @g(i32* %x, i32* %y, i32* %z) {
> +; CHECK-LABEL: g:
> +; CHECK: # %bb.0: # %entry
> +; CHECK-NEXT: movl {{.*}}(%rip), %eax
> +; CHECK-NEXT: #APP
> +; CHECK-NEXT: #NO_APP
> +; CHECK-NEXT: xorl %ecx, %ecx
> +; CHECK-NEXT: testl %eax, %eax
> +; CHECK-NEXT: sete %cl
> +; CHECK-NEXT: addl %ecx, %ecx
> +; CHECK-NEXT: orl (%rdi), %ecx
> +; CHECK-NEXT: movl $0, (%rsi)
> +; CHECK-NEXT: #APP
> +; CHECK-NEXT: #NO_APP
> +; CHECK-NEXT: shll $8, %eax
> +; CHECK-NEXT: bextrl %eax, {{.*}}(%rip), %eax
> +; CHECK-NEXT: orl %ecx, %eax
> +; CHECK-NEXT: movl %eax, (%rdx)
> +; CHECK-NEXT: retq
> +entry:
> + %0 = load i32, i32* @a, align 4
> + %1 = tail call i32 asm "", "=r,r,~{dirflag},~{fpsr},~{flags}"(i32 %0)
> + %2 = icmp eq i32 %1, 0
> + %shl1 = select i1 %2, i32 2, i32 0
> + %3 = load i32, i32* %x, align 4
> + %or = or i32 %3, %shl1
> + store i32 0, i32* %y, align 4
> + %4 = tail call i32 asm "", "=r,~{dirflag},~{fpsr},~{flags}"()
> + %notmask = shl nsw i32 -1, %4
> + %sub = xor i32 %notmask, -1
> + %5 = load i32, i32* @f, align 4
> + %and4 = and i32 %5, %sub
> + %or6 = or i32 %and4, %or
> + store i32 %or6, i32* %z, align 4
> + ret void
> +}
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list