[llvm] fe0d4ba - [RISCV] Add test for incorrect sext.w removal. NFC

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Sun Nov 13 17:30:48 PST 2022


Author: Craig Topper
Date: 2022-11-13T17:30:39-08:00
New Revision: fe0d4ba37312cdd334790a3947cc31a7fbea974a

URL: https://github.com/llvm/llvm-project/commit/fe0d4ba37312cdd334790a3947cc31a7fbea974a
DIFF: https://github.com/llvm/llvm-project/commit/fe0d4ba37312cdd334790a3947cc31a7fbea974a.diff

LOG: [RISCV] Add test for incorrect sext.w removal. NFC

Added: 
    

Modified: 
    llvm/test/CodeGen/RISCV/sextw-removal.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/CodeGen/RISCV/sextw-removal.ll b/llvm/test/CodeGen/RISCV/sextw-removal.ll
index b3abb7dd1216..5dada972b86a 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
+}


        


More information about the llvm-commits mailing list