From fe0d4ba37312cdd334790a3947cc31a7fbea974a Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Sun, 13 Nov 2022 16:46:43 -0800 Subject: [PATCH] [RISCV] Add test for incorrect sext.w removal. NFC --- llvm/test/CodeGen/RISCV/sextw-removal.ll | 127 +++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) diff --git a/llvm/test/CodeGen/RISCV/sextw-removal.ll b/llvm/test/CodeGen/RISCV/sextw-removal.ll index b3abb7d..5dada97 100644 --- a/llvm/test/CodeGen/RISCV/sextw-removal.ll +++ b/llvm/test/CodeGen/RISCV/sextw-removal.ll @@ -1019,3 +1019,130 @@ bb7: ; preds = %bb2 %i7 = trunc i64 %i5 to i32 ret i32 %i7 } + +; FIXME: This test removes a sext.w without converting a slli to slliw. +define signext i32 @bug(i32 signext %x) { +; CHECK-LABEL: bug: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: beqz a0, .LBB18_10 +; CHECK-NEXT: # %bb.1: # %if.end +; CHECK-NEXT: srliw a1, a0, 16 +; CHECK-NEXT: beqz a1, .LBB18_3 +; CHECK-NEXT: # %bb.2: # %if.end +; CHECK-NEXT: li a1, 32 +; CHECK-NEXT: srliw a2, a0, 24 +; CHECK-NEXT: beqz a2, .LBB18_4 +; CHECK-NEXT: j .LBB18_5 +; CHECK-NEXT: .LBB18_3: +; CHECK-NEXT: slliw a0, a0, 16 +; CHECK-NEXT: li a1, 16 +; CHECK-NEXT: srliw a2, a0, 24 +; CHECK-NEXT: bnez a2, .LBB18_5 +; CHECK-NEXT: .LBB18_4: +; CHECK-NEXT: slliw a0, a0, 8 +; CHECK-NEXT: addi a1, a1, -8 +; CHECK-NEXT: .LBB18_5: # %if.end +; CHECK-NEXT: srliw a2, a0, 28 +; CHECK-NEXT: beqz a2, .LBB18_11 +; CHECK-NEXT: # %bb.6: # %if.end +; CHECK-NEXT: srliw a2, a0, 30 +; CHECK-NEXT: beqz a2, .LBB18_12 +; CHECK-NEXT: .LBB18_7: # %if.end +; CHECK-NEXT: bnez a2, .LBB18_9 +; CHECK-NEXT: .LBB18_8: +; CHECK-NEXT: addi a1, a1, -2 +; CHECK-NEXT: .LBB18_9: # %if.end +; CHECK-NEXT: not a0, a0 +; CHECK-NEXT: srli a0, a0, 31 +; CHECK-NEXT: addw a0, a1, a0 +; CHECK-NEXT: .LBB18_10: # %cleanup +; CHECK-NEXT: ret +; CHECK-NEXT: .LBB18_11: +; CHECK-NEXT: slliw a0, a0, 4 +; CHECK-NEXT: addi a1, a1, -4 +; CHECK-NEXT: srliw a2, a0, 30 +; CHECK-NEXT: bnez a2, .LBB18_7 +; CHECK-NEXT: .LBB18_12: +; CHECK-NEXT: slli a0, a0, 2 +; CHECK-NEXT: beqz a2, .LBB18_8 +; CHECK-NEXT: j .LBB18_9 +; +; NOREMOVAL-LABEL: bug: +; NOREMOVAL: # %bb.0: # %entry +; NOREMOVAL-NEXT: beqz a0, .LBB18_10 +; NOREMOVAL-NEXT: # %bb.1: # %if.end +; NOREMOVAL-NEXT: srliw a1, a0, 16 +; NOREMOVAL-NEXT: beqz a1, .LBB18_3 +; NOREMOVAL-NEXT: # %bb.2: # %if.end +; NOREMOVAL-NEXT: li a1, 32 +; NOREMOVAL-NEXT: srliw a2, a0, 24 +; NOREMOVAL-NEXT: beqz a2, .LBB18_4 +; NOREMOVAL-NEXT: j .LBB18_5 +; NOREMOVAL-NEXT: .LBB18_3: +; NOREMOVAL-NEXT: slliw a0, a0, 16 +; NOREMOVAL-NEXT: li a1, 16 +; NOREMOVAL-NEXT: srliw a2, a0, 24 +; NOREMOVAL-NEXT: bnez a2, .LBB18_5 +; NOREMOVAL-NEXT: .LBB18_4: +; NOREMOVAL-NEXT: slliw a0, a0, 8 +; NOREMOVAL-NEXT: addi a1, a1, -8 +; NOREMOVAL-NEXT: .LBB18_5: # %if.end +; NOREMOVAL-NEXT: srliw a2, a0, 28 +; NOREMOVAL-NEXT: beqz a2, .LBB18_11 +; NOREMOVAL-NEXT: # %bb.6: # %if.end +; NOREMOVAL-NEXT: srliw a2, a0, 30 +; NOREMOVAL-NEXT: beqz a2, .LBB18_12 +; NOREMOVAL-NEXT: .LBB18_7: # %if.end +; NOREMOVAL-NEXT: sext.w a0, a0 +; NOREMOVAL-NEXT: bnez a2, .LBB18_9 +; NOREMOVAL-NEXT: .LBB18_8: +; NOREMOVAL-NEXT: addi a1, a1, -2 +; NOREMOVAL-NEXT: .LBB18_9: # %if.end +; NOREMOVAL-NEXT: not a0, a0 +; NOREMOVAL-NEXT: srli a0, a0, 31 +; NOREMOVAL-NEXT: addw a0, a1, a0 +; NOREMOVAL-NEXT: .LBB18_10: # %cleanup +; NOREMOVAL-NEXT: ret +; NOREMOVAL-NEXT: .LBB18_11: +; NOREMOVAL-NEXT: slliw a0, a0, 4 +; NOREMOVAL-NEXT: addi a1, a1, -4 +; NOREMOVAL-NEXT: srliw a2, a0, 30 +; NOREMOVAL-NEXT: bnez a2, .LBB18_7 +; NOREMOVAL-NEXT: .LBB18_12: +; NOREMOVAL-NEXT: slli a0, a0, 2 +; NOREMOVAL-NEXT: sext.w a0, a0 +; NOREMOVAL-NEXT: beqz a2, .LBB18_8 +; NOREMOVAL-NEXT: j .LBB18_9 +entry: + %tobool.not = icmp eq i32 %x, 0 + br i1 %tobool.not, label %cleanup, label %if.end + +if.end: ; preds = %entry + %tobool1.not = icmp ult i32 %x, 65536 + %shl = shl i32 %x, 16 + %spec.select = select i1 %tobool1.not, i32 %shl, i32 %x + %spec.select43 = select i1 %tobool1.not, i32 16, i32 32 + %tobool5.not = icmp ult i32 %spec.select, 16777216 + %shl7 = shl i32 %spec.select, 8 + %sub8 = add nsw i32 %spec.select43, -8 + %x.addr.1 = select i1 %tobool5.not, i32 %shl7, i32 %spec.select + %r.1 = select i1 %tobool5.not, i32 %sub8, i32 %spec.select43 + %tobool11.not = icmp ult i32 %x.addr.1, 268435456 + %shl13 = shl i32 %x.addr.1, 4 + %sub14 = add nsw i32 %r.1, -4 + %x.addr.2 = select i1 %tobool11.not, i32 %shl13, i32 %x.addr.1 + %r.2 = select i1 %tobool11.not, i32 %sub14, i32 %r.1 + %tobool17.not = icmp ult i32 %x.addr.2, 1073741824 + %shl19 = shl i32 %x.addr.2, 2 + %sub20 = add nsw i32 %r.2, -2 + %x.addr.3 = select i1 %tobool17.not, i32 %shl19, i32 %x.addr.2 + %r.3 = select i1 %tobool17.not, i32 %sub20, i32 %r.2 + %x.addr.3.lobit = ashr i32 %x.addr.3, 31 + %x.addr.3.lobit.not = xor i32 %x.addr.3.lobit, -1 + %r.4 = add nsw i32 %r.3, %x.addr.3.lobit.not + br label %cleanup + +cleanup: ; preds = %entry, %if.end + %retval.0 = phi i32 [ %r.4, %if.end ], [ 0, %entry ] + ret i32 %retval.0 +} -- 2.7.4