[llvm] [InstCombine] Remove one-use requirement for add iN (sext i1 X), (sext i1 Y) --> sext (X | Y) to iN (PR #90509)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Thu May 2 18:37:02 PDT 2024
================
@@ -1435,34 +1435,65 @@ define i32 @and31_add_sexts(i1 %x, i1 %y) {
ret i32 %r
}
-; Negative test - extra use
+declare void @use_sexts(i32, i32)
-define i32 @lshr_add_use_sexts(i1 %x, i1 %y, ptr %p) {
-; CHECK-LABEL: @lshr_add_use_sexts(
+; Negative test
+define i32 @lshr_add_use_sexts_both(i1 %x, i1 %y, ptr %p) {
+; CHECK-LABEL: @lshr_add_use_sexts_both(
; CHECK-NEXT: [[XS:%.*]] = sext i1 [[X:%.*]] to i32
; CHECK-NEXT: store i32 [[XS]], ptr [[P:%.*]], align 4
; CHECK-NEXT: [[YS:%.*]] = sext i1 [[Y:%.*]] to i32
+; CHECK-NEXT: call void @use_sexts(i32 [[XS]], i32 [[YS]])
; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[XS]], [[YS]]
; CHECK-NEXT: [[R:%.*]] = lshr i32 [[SUB]], 31
; CHECK-NEXT: ret i32 [[R]]
;
%xs = sext i1 %x to i32
store i32 %xs, ptr %p
%ys = sext i1 %y to i32
+ call void @use_sexts(i32 %xs, i32 %ys)
+ %sub = add i32 %xs, %ys
+ %r = lshr i32 %sub, 31
+ ret i32 %r
+}
+
+define i32 @lshr_add_use_sexts(i1 %x, i1 %y, ptr %p) {
+; CHECK-LABEL: @lshr_add_use_sexts(
+; CHECK-NEXT: [[TMP1:%.*]] = or i1 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT: [[R:%.*]] = zext i1 [[TMP1]] to i32
+; CHECK-NEXT: ret i32 [[R]]
+;
+ %xs = sext i1 %x to i32
+ %ys = sext i1 %y to i32
----------------
nikic wrote:
Now you've also dropped the extra use of %ys in this test...
https://github.com/llvm/llvm-project/pull/90509
More information about the llvm-commits
mailing list