diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index ec84878f29885..c1963a1dc525f 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -5691,6 +5691,22 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT, if (OpOpcode == ISD::UNDEF) // zext(undef) = 0, because the top bits will be zero. return getConstant(0, DL, VT); + + // Skip unnecessary zext_inreg pattern: + // (zext (trunc (assertzext x))) -> (assertzext x) + // TODO: Generalize to MaskedValueIsZero check? + if (OpOpcode == ISD::TRUNCATE) { + SDValue OpOp = N1.getOperand(0); + if (OpOp.getValueType() == VT) { + if (OpOp.getOpcode() == ISD::AssertZext && N1->hasOneUse()) { + EVT ExtVT = cast(OpOp.getOperand(1))->getVT(); + if (N1.getScalarValueSizeInBits() >= ExtVT.getSizeInBits()) { + transferDbgValues(N1, OpOp); + return OpOp; + } + } + } + } break; case ISD::ANY_EXTEND: assert(VT.isInteger() && N1.getValueType().isInteger() && diff --git a/llvm/test/CodeGen/RISCV/rvv/fold-vp-fadd-and-vp-fmul.ll b/llvm/test/CodeGen/RISCV/rvv/fold-vp-fadd-and-vp-fmul.ll index f773de3b518c6..1eccaaa26154f 100644 --- a/llvm/test/CodeGen/RISCV/rvv/fold-vp-fadd-and-vp-fmul.ll +++ b/llvm/test/CodeGen/RISCV/rvv/fold-vp-fadd-and-vp-fmul.ll @@ -62,9 +62,9 @@ define @fma_reassociate( %a, @llvm.vp.fmul.nxv1f64( %a, %b, %m, i32 %vl) %2 = call fast @llvm.vp.fmul.nxv1f64( %c, %d, %m, i32 %vl) diff --git a/llvm/test/CodeGen/X86/extract-bits.ll b/llvm/test/CodeGen/X86/extract-bits.ll index 638c4db756b44..de826aba54ae2 100644 --- a/llvm/test/CodeGen/X86/extract-bits.ll +++ b/llvm/test/CodeGen/X86/extract-bits.ll @@ -210,9 +210,8 @@ define i32 @bextr32_a1_indexzext(i32 %val, i8 zeroext %numskipbits, i8 zeroext % ; X64-BMI1-LABEL: bextr32_a1_indexzext: ; X64-BMI1: # %bb.0: ; X64-BMI1-NEXT: shll $8, %edx -; X64-BMI1-NEXT: movzbl %sil, %eax -; X64-BMI1-NEXT: orl %edx, %eax -; X64-BMI1-NEXT: bextrl %eax, %edi, %eax +; X64-BMI1-NEXT: orl %esi, %edx +; X64-BMI1-NEXT: bextrl %edx, %edi, %eax ; X64-BMI1-NEXT: retq ; ; X64-BMI2-LABEL: bextr32_a1_indexzext: @@ -351,9 +350,8 @@ define i32 @bextr32_a3_load_indexzext(ptr %w, i8 zeroext %numskipbits, i8 zeroex ; X64-BMI1-LABEL: bextr32_a3_load_indexzext: ; X64-BMI1: # %bb.0: ; X64-BMI1-NEXT: shll $8, %edx -; X64-BMI1-NEXT: movzbl %sil, %eax -; X64-BMI1-NEXT: orl %edx, %eax -; X64-BMI1-NEXT: bextrl %eax, (%rdi), %eax +; X64-BMI1-NEXT: orl %esi, %edx +; X64-BMI1-NEXT: bextrl %edx, (%rdi), %eax ; X64-BMI1-NEXT: retq ; ; X64-BMI2-LABEL: bextr32_a3_load_indexzext: @@ -953,10 +951,10 @@ define i64 @bextr64_a1_indexzext(i64 %val, i8 zeroext %numskipbits, i8 zeroext % ; ; X64-BMI1-LABEL: bextr64_a1_indexzext: ; X64-BMI1: # %bb.0: +; X64-BMI1-NEXT: # kill: def $edx killed $edx def $rdx ; X64-BMI1-NEXT: shll $8, %edx -; X64-BMI1-NEXT: movzbl %sil, %eax -; X64-BMI1-NEXT: orl %edx, %eax -; X64-BMI1-NEXT: bextrq %rax, %rdi, %rax +; X64-BMI1-NEXT: orl %esi, %edx +; X64-BMI1-NEXT: bextrq %rdx, %rdi, %rax ; X64-BMI1-NEXT: retq ; ; X64-BMI2-LABEL: bextr64_a1_indexzext: @@ -1250,10 +1248,10 @@ define i64 @bextr64_a3_load_indexzext(ptr %w, i8 zeroext %numskipbits, i8 zeroex ; ; X64-BMI1-LABEL: bextr64_a3_load_indexzext: ; X64-BMI1: # %bb.0: +; X64-BMI1-NEXT: # kill: def $edx killed $edx def $rdx ; X64-BMI1-NEXT: shll $8, %edx -; X64-BMI1-NEXT: movzbl %sil, %eax -; X64-BMI1-NEXT: orl %edx, %eax -; X64-BMI1-NEXT: bextrq %rax, (%rdi), %rax +; X64-BMI1-NEXT: orl %esi, %edx +; X64-BMI1-NEXT: bextrq %rdx, (%rdi), %rax ; X64-BMI1-NEXT: retq ; ; X64-BMI2-LABEL: bextr64_a3_load_indexzext: @@ -2327,9 +2325,8 @@ define i32 @bextr32_b1_indexzext(i32 %val, i8 zeroext %numskipbits, i8 zeroext % ; X64-BMI1-LABEL: bextr32_b1_indexzext: ; X64-BMI1: # %bb.0: ; X64-BMI1-NEXT: shll $8, %edx -; X64-BMI1-NEXT: movzbl %sil, %eax -; X64-BMI1-NEXT: orl %edx, %eax -; X64-BMI1-NEXT: bextrl %eax, %edi, %eax +; X64-BMI1-NEXT: orl %esi, %edx +; X64-BMI1-NEXT: bextrl %edx, %edi, %eax ; X64-BMI1-NEXT: retq ; ; X64-BMI2-LABEL: bextr32_b1_indexzext: @@ -2468,9 +2465,8 @@ define i32 @bextr32_b3_load_indexzext(ptr %w, i8 zeroext %numskipbits, i8 zeroex ; X64-BMI1-LABEL: bextr32_b3_load_indexzext: ; X64-BMI1: # %bb.0: ; X64-BMI1-NEXT: shll $8, %edx -; X64-BMI1-NEXT: movzbl %sil, %eax -; X64-BMI1-NEXT: orl %edx, %eax -; X64-BMI1-NEXT: bextrl %eax, (%rdi), %eax +; X64-BMI1-NEXT: orl %esi, %edx +; X64-BMI1-NEXT: bextrl %edx, (%rdi), %eax ; X64-BMI1-NEXT: retq ; ; X64-BMI2-LABEL: bextr32_b3_load_indexzext: @@ -2916,10 +2912,10 @@ define i64 @bextr64_b1_indexzext(i64 %val, i8 zeroext %numskipbits, i8 zeroext % ; ; X64-BMI1-LABEL: bextr64_b1_indexzext: ; X64-BMI1: # %bb.0: +; X64-BMI1-NEXT: # kill: def $edx killed $edx def $rdx ; X64-BMI1-NEXT: shll $8, %edx -; X64-BMI1-NEXT: movzbl %sil, %eax -; X64-BMI1-NEXT: orl %edx, %eax -; X64-BMI1-NEXT: bextrq %rax, %rdi, %rax +; X64-BMI1-NEXT: orl %esi, %edx +; X64-BMI1-NEXT: bextrq %rdx, %rdi, %rax ; X64-BMI1-NEXT: retq ; ; X64-BMI2-LABEL: bextr64_b1_indexzext: @@ -3205,10 +3201,10 @@ define i64 @bextr64_b3_load_indexzext(ptr %w, i8 zeroext %numskipbits, i8 zeroex ; ; X64-BMI1-LABEL: bextr64_b3_load_indexzext: ; X64-BMI1: # %bb.0: +; X64-BMI1-NEXT: # kill: def $edx killed $edx def $rdx ; X64-BMI1-NEXT: shll $8, %edx -; X64-BMI1-NEXT: movzbl %sil, %eax -; X64-BMI1-NEXT: orl %edx, %eax -; X64-BMI1-NEXT: bextrq %rax, (%rdi), %rax +; X64-BMI1-NEXT: orl %esi, %edx +; X64-BMI1-NEXT: bextrq %rdx, (%rdi), %rax ; X64-BMI1-NEXT: retq ; ; X64-BMI2-LABEL: bextr64_b3_load_indexzext: