[llvm] 304cda0 - [InstCombine] add tests for sub with extended operands; NFC
Sanjay Patel via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 14 08:40:58 PDT 2022
Author: Sanjay Patel
Date: 2022-06-14T11:24:06-04:00
New Revision: 304cda0b1600a40063b8f39eeebf48e25bb4dba7
URL: https://github.com/llvm/llvm-project/commit/304cda0b1600a40063b8f39eeebf48e25bb4dba7
DIFF: https://github.com/llvm/llvm-project/commit/304cda0b1600a40063b8f39eeebf48e25bb4dba7.diff
LOG: [InstCombine] add tests for sub with extended operands; NFC
Added:
Modified:
llvm/test/Transforms/InstCombine/sub.ll
Removed:
################################################################################
diff --git a/llvm/test/Transforms/InstCombine/sub.ll b/llvm/test/Transforms/InstCombine/sub.ll
index 9964209a8b71e..190d305e023fd 100644
--- a/llvm/test/Transforms/InstCombine/sub.ll
+++ b/llvm/test/Transforms/InstCombine/sub.ll
@@ -1723,3 +1723,201 @@ define <2 x i5> @sub_urem(<2 x i5> noundef %x, <2 x i5> %y) {
%sub = sub <2 x i5> %x, %rem
ret <2 x i5> %sub
}
+
+define <3 x i32> @nuw_const_zext(<3 x i8> %y) {
+; CHECK-LABEL: @nuw_const_zext(
+; CHECK-NEXT: [[ZY:%.*]] = zext <3 x i8> [[Y:%.*]] to <3 x i32>
+; CHECK-NEXT: [[S:%.*]] = sub nuw nsw <3 x i32> <i32 255, i32 128, i32 0>, [[ZY]]
+; CHECK-NEXT: ret <3 x i32> [[S]]
+;
+ %zy = zext <3 x i8> %y to <3 x i32>
+ %s = sub nuw <3 x i32> <i32 255, i32 128, i32 0>, %zy
+ ret <3 x i32> %s
+}
+
+define i32 @nuw_const_zext_big(i8 %y) {
+; CHECK-LABEL: @nuw_const_zext_big(
+; CHECK-NEXT: [[ZY:%.*]] = zext i8 [[Y:%.*]] to i32
+; CHECK-NEXT: [[S:%.*]] = sub nuw nsw i32 257, [[ZY]]
+; CHECK-NEXT: ret i32 [[S]]
+;
+ %zy = zext i8 %y to i32
+ %s = sub nuw i32 257, %zy
+ ret i32 %s
+}
+
+define i32 @nuw_zext_zext(i8 %x, i8 %y) {
+; CHECK-LABEL: @nuw_zext_zext(
+; CHECK-NEXT: [[ZX:%.*]] = zext i8 [[X:%.*]] to i32
+; CHECK-NEXT: [[ZY:%.*]] = zext i8 [[Y:%.*]] to i32
+; CHECK-NEXT: [[S:%.*]] = sub nuw nsw i32 [[ZX]], [[ZY]]
+; CHECK-NEXT: ret i32 [[S]]
+;
+ %zx = zext i8 %x to i32
+ %zy = zext i8 %y to i32
+ %s = sub nuw i32 %zx, %zy
+ ret i32 %s
+}
+
+define <2 x i16> @nuw_zext_sext(<2 x i8> %x, <2 x i8> %y) {
+; CHECK-LABEL: @nuw_zext_sext(
+; CHECK-NEXT: [[ZX:%.*]] = zext <2 x i8> [[X:%.*]] to <2 x i16>
+; CHECK-NEXT: [[SY:%.*]] = sext <2 x i8> [[Y:%.*]] to <2 x i16>
+; CHECK-NEXT: [[S:%.*]] = sub nuw nsw <2 x i16> [[ZX]], [[SY]]
+; CHECK-NEXT: ret <2 x i16> [[S]]
+;
+ %zx = zext <2 x i8> %x to <2 x i16>
+ %sy = sext <2 x i8> %y to <2 x i16>
+ %s = sub nuw <2 x i16> %zx, %sy
+ ret <2 x i16> %s
+}
+
+define i32 @nuw_sext_zext(i8 %x, i8 %y) {
+; CHECK-LABEL: @nuw_sext_zext(
+; CHECK-NEXT: [[SX:%.*]] = sext i8 [[X:%.*]] to i32
+; CHECK-NEXT: [[ZY:%.*]] = zext i8 [[Y:%.*]] to i32
+; CHECK-NEXT: [[S:%.*]] = sub nuw nsw i32 [[SX]], [[ZY]]
+; CHECK-NEXT: ret i32 [[S]]
+;
+ %sx = sext i8 %x to i32
+ %zy = zext i8 %y to i32
+ %s = sub nuw i32 %sx, %zy
+ ret i32 %s
+}
+
+define i8 @nuw_zext_zext_use1(i5 %x, i5 %y) {
+; CHECK-LABEL: @nuw_zext_zext_use1(
+; CHECK-NEXT: [[ZX:%.*]] = zext i5 [[X:%.*]] to i8
+; CHECK-NEXT: call void @use8(i8 [[ZX]])
+; CHECK-NEXT: [[ZY:%.*]] = zext i5 [[Y:%.*]] to i8
+; CHECK-NEXT: [[S:%.*]] = sub nuw nsw i8 [[ZX]], [[ZY]]
+; CHECK-NEXT: ret i8 [[S]]
+;
+ %zx = zext i5 %x to i8
+ call void @use8(i8 %zx)
+ %zy = zext i5 %y to i8
+ %s = sub nuw i8 %zx, %zy
+ ret i8 %s
+}
+
+define i8 @nuw_zext_zext_use2(i5 %x, i5 %y) {
+; CHECK-LABEL: @nuw_zext_zext_use2(
+; CHECK-NEXT: [[ZX:%.*]] = zext i5 [[X:%.*]] to i8
+; CHECK-NEXT: [[ZY:%.*]] = zext i5 [[Y:%.*]] to i8
+; CHECK-NEXT: call void @use8(i8 [[ZY]])
+; CHECK-NEXT: [[S:%.*]] = sub nuw nsw i8 [[ZX]], [[ZY]]
+; CHECK-NEXT: ret i8 [[S]]
+;
+ %zx = zext i5 %x to i8
+ %zy = zext i5 %y to i8
+ call void @use8(i8 %zy)
+ %s = sub nuw i8 %zx, %zy
+ ret i8 %s
+}
+
+define i8 @nuw_zext_zext_use3(i5 %x, i5 %y) {
+; CHECK-LABEL: @nuw_zext_zext_use3(
+; CHECK-NEXT: [[ZX:%.*]] = zext i5 [[X:%.*]] to i8
+; CHECK-NEXT: call void @use8(i8 [[ZX]])
+; CHECK-NEXT: [[ZY:%.*]] = zext i5 [[Y:%.*]] to i8
+; CHECK-NEXT: call void @use8(i8 [[ZY]])
+; CHECK-NEXT: [[S:%.*]] = sub nuw nsw i8 [[ZX]], [[ZY]]
+; CHECK-NEXT: ret i8 [[S]]
+;
+ %zx = zext i5 %x to i8
+ call void @use8(i8 %zx)
+ %zy = zext i5 %y to i8
+ call void @use8(i8 %zy)
+ %s = sub nuw i8 %zx, %zy
+ ret i8 %s
+}
+
+define i32 @nuw_zext_zext_
diff erent_width(i8 %x, i7 %y) {
+; CHECK-LABEL: @nuw_zext_zext_
diff erent_width(
+; CHECK-NEXT: [[ZX:%.*]] = zext i8 [[X:%.*]] to i32
+; CHECK-NEXT: [[ZY:%.*]] = zext i7 [[Y:%.*]] to i32
+; CHECK-NEXT: [[S:%.*]] = sub nuw nsw i32 [[ZX]], [[ZY]]
+; CHECK-NEXT: ret i32 [[S]]
+;
+ %zx = zext i8 %x to i32
+ %zy = zext i7 %y to i32
+ %s = sub nuw i32 %zx, %zy
+ ret i32 %s
+}
+
+define i16 @sext_nsw_noundef(i8 noundef %x, i8 %y) {
+; CHECK-LABEL: @sext_nsw_noundef(
+; CHECK-NEXT: [[D:%.*]] = sub nsw i8 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT: [[EX:%.*]] = sext i8 [[X]] to i16
+; CHECK-NEXT: [[ED:%.*]] = sext i8 [[D]] to i16
+; CHECK-NEXT: [[Z:%.*]] = sub nsw i16 [[EX]], [[ED]]
+; CHECK-NEXT: ret i16 [[Z]]
+;
+ %d = sub nsw i8 %x, %y
+ %ex = sext i8 %x to i16
+ %ed = sext i8 %d to i16
+ %z = sub i16 %ex, %ed
+ ret i16 %z
+}
+
+define i16 @sext_nsw(i8 %x, i8 %y) {
+; CHECK-LABEL: @sext_nsw(
+; CHECK-NEXT: [[D:%.*]] = sub nsw i8 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT: [[EX:%.*]] = sext i8 [[X]] to i16
+; CHECK-NEXT: [[ED:%.*]] = sext i8 [[D]] to i16
+; CHECK-NEXT: [[Z:%.*]] = sub nsw i16 [[EX]], [[ED]]
+; CHECK-NEXT: ret i16 [[Z]]
+;
+ %d = sub nsw i8 %x, %y
+ %ex = sext i8 %x to i16
+ %ed = sext i8 %d to i16
+ %z = sub i16 %ex, %ed
+ ret i16 %z
+}
+
+define i16 @sext_noundef(i8 noundef %x, i8 %y) {
+; CHECK-LABEL: @sext_noundef(
+; CHECK-NEXT: [[D:%.*]] = sub i8 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT: [[EX:%.*]] = sext i8 [[X]] to i16
+; CHECK-NEXT: [[ED:%.*]] = sext i8 [[D]] to i16
+; CHECK-NEXT: [[Z:%.*]] = sub nsw i16 [[EX]], [[ED]]
+; CHECK-NEXT: ret i16 [[Z]]
+;
+ %d = sub i8 %x, %y
+ %ex = sext i8 %x to i16
+ %ed = sext i8 %d to i16
+ %z = sub i16 %ex, %ed
+ ret i16 %z
+}
+
+define i16 @sext_nsw_noundef_wrong_val(i8 noundef %x, i8 noundef %y, i8 noundef %q) {
+; CHECK-LABEL: @sext_nsw_noundef_wrong_val(
+; CHECK-NEXT: [[D:%.*]] = sub nsw i8 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT: [[EQ:%.*]] = sext i8 [[Q:%.*]] to i16
+; CHECK-NEXT: [[ED:%.*]] = sext i8 [[D]] to i16
+; CHECK-NEXT: [[Z:%.*]] = sub nsw i16 [[EQ]], [[ED]]
+; CHECK-NEXT: ret i16 [[Z]]
+;
+ %d = sub nsw i8 %x, %y
+ %eq = sext i8 %q to i16
+ %ed = sext i8 %d to i16
+ %z = sub i16 %eq, %ed
+ ret i16 %z
+}
+
+define i16 @srem_sext_noundef(i8 noundef %x, i8 %y) {
+; CHECK-LABEL: @srem_sext_noundef(
+; CHECK-NEXT: [[R:%.*]] = srem i8 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT: [[D:%.*]] = sub nsw i8 [[X]], [[R]]
+; CHECK-NEXT: [[SD:%.*]] = sext i8 [[D]] to i16
+; CHECK-NEXT: [[SX:%.*]] = sext i8 [[X]] to i16
+; CHECK-NEXT: [[Z:%.*]] = sub nsw i16 [[SX]], [[SD]]
+; CHECK-NEXT: ret i16 [[Z]]
+;
+ %r = srem i8 %x, %y
+ %d = sub i8 %x, %r
+ %sd = sext i8 %d to i16
+ %sx = sext i8 %x to i16
+ %z = sub i16 %sx, %sd
+ ret i16 %z
+}
More information about the llvm-commits
mailing list