[llvm] [InstCombine] Combine trunc (lshr X, BW-1) to i1 --> icmp slt X, 0 (#142593) (PR #143846)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 12 02:17:45 PDT 2025
================
@@ -0,0 +1,103 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt -S -passes=instcombine < %s | FileCheck %s
+
+define i1 @foo_pos1(i32 %i, ptr %p) {
+; CHECK-LABEL: define i1 @foo_pos1(
+; CHECK-SAME: i32 [[I:%.*]], ptr [[P:%.*]]) {
+; CHECK-NEXT: [[COMMON_RET1:.*:]]
+; CHECK-NEXT: [[DOTLOBIT:%.*]] = lshr i32 [[I]], 31
+; CHECK-NEXT: store i32 [[DOTLOBIT]], ptr [[P]], align 1
+; CHECK-NEXT: ret i1 false
+;
+common.ret1:
+ %.lobit = lshr i32 %i, 31
+ %t = trunc nuw i32 %.lobit to i1
+ %b = icmp slt i32 %i, 0
+ %not. = xor i1 %t, true
+ %common.ret1.op = select i1 %not., i1 %b, i1 false
+ store i32 %.lobit, ptr %p, align 1
+ ret i1 %common.ret1.op
+}
+
+define i1 @foo_pos2(i32 %i, ptr %p) {
+; CHECK-LABEL: define i1 @foo_pos2(
+; CHECK-SAME: i32 [[I:%.*]], ptr [[P:%.*]]) {
+; CHECK-NEXT: [[COMMON_RET1:.*:]]
+; CHECK-NEXT: [[DOTLOBIT:%.*]] = ashr i32 [[I]], 31
+; CHECK-NEXT: store i32 [[DOTLOBIT]], ptr [[P]], align 1
+; CHECK-NEXT: ret i1 false
+;
+common.ret1:
+ %.lobit = ashr i32 %i, 31
+ %t = trunc nuw i32 %.lobit to i1
+ %b = icmp slt i32 %i, 0
+ %not. = xor i1 %t, true
+ %common.ret1.op = select i1 %not., i1 %b, i1 false
+ store i32 %.lobit, ptr %p, align 1
+ ret i1 %common.ret1.op
+}
+
+define i1 @foo_pos3(i32 %i, ptr %p, ptr %q) {
+; CHECK-LABEL: define i1 @foo_pos3(
+; CHECK-SAME: i32 [[I:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]]) {
+; CHECK-NEXT: [[COMMON_RET1:.*:]]
+; CHECK-NEXT: [[DOTLOBIT:%.*]] = lshr i32 [[I]], 31
+; CHECK-NEXT: store i32 [[DOTLOBIT]], ptr [[P]], align 1
+; CHECK-NEXT: store i32 [[DOTLOBIT]], ptr [[Q]], align 1
+; CHECK-NEXT: ret i1 false
+;
+common.ret1:
+ %.lobit = lshr i32 %i, 31
+ %t = trunc nuw i32 %.lobit to i1
+ %b = icmp slt i32 %i, 0
+ %not. = xor i1 %t, true
+ %common.ret1.op = select i1 %not., i1 %b, i1 false
+ store i32 %.lobit, ptr %p, align 1
+ store i32 %.lobit, ptr %q, align 1
+ ret i1 %common.ret1.op
+}
+
+define i1 @foo_neg1(i32 %i, ptr %p) {
----------------
RKSimon wrote:
(style) add a comment why each negative test won't fold
https://github.com/llvm/llvm-project/pull/143846
More information about the llvm-commits
mailing list