Simon Pilgrim 9fb4bc5bf4
[DAG] SimplifyMultipleUseDemandedBits - ignore SRL node if we're just demanding known sign bits (#114389)
Check to see if we are only demanding (shifted) signbits from a SRL node that are also signbits in the source node.

We can't demand any upper zero bits that the SRL will shift in (up to max shift amount), and the lower demanded bits bound must already be all signbits.
2024-10-31 16:40:29 +00:00

37 lines
1.1 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s | FileCheck -check-prefix=RV32I %s
; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s | FileCheck -check-prefix=RV64I %s
; regression due to creation of temporary i32 avgfloors node
define signext i64 @PR95284(i32 signext %0) {
; RV32I-LABEL: PR95284:
; RV32I: # %bb.0: # %entry
; RV32I-NEXT: addi a1, a0, -1
; RV32I-NEXT: seqz a0, a0
; RV32I-NEXT: slli a2, a0, 31
; RV32I-NEXT: srli a1, a1, 1
; RV32I-NEXT: or a1, a1, a2
; RV32I-NEXT: addi a1, a1, 1
; RV32I-NEXT: seqz a2, a1
; RV32I-NEXT: sub a2, a2, a0
; RV32I-NEXT: andi a0, a1, -2
; RV32I-NEXT: slli a1, a2, 1
; RV32I-NEXT: srli a1, a1, 1
; RV32I-NEXT: ret
;
; RV64I-LABEL: PR95284:
; RV64I: # %bb.0: # %entry
; RV64I-NEXT: addi a0, a0, -1
; RV64I-NEXT: srli a0, a0, 1
; RV64I-NEXT: addi a0, a0, 1
; RV64I-NEXT: andi a0, a0, -2
; RV64I-NEXT: ret
entry:
%1 = zext nneg i32 %0 to i64
%2 = add nsw i64 %1, -1
%3 = lshr i64 %2, 1
%4 = add nuw nsw i64 %3, 1
%5 = and i64 %4, 9223372036854775806
ret i64 %5
}