[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