[llvm] r354760 - [InstCombine] Add tests for PR40846; NFC

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Sun Feb 24 13:55:37 PST 2019


Author: nikic
Date: Sun Feb 24 13:55:37 2019
New Revision: 354760

URL: http://llvm.org/viewvc/llvm-project?rev=354760&view=rev
Log:
[InstCombine] Add tests for PR40846; NFC

The icmps are the same as the overflow result of the intrinsic.

Modified:
    llvm/trunk/test/Transforms/InstCombine/with_overflow.ll

Modified: llvm/trunk/test/Transforms/InstCombine/with_overflow.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/with_overflow.ll?rev=354760&r1=354759&r2=354760&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/with_overflow.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/with_overflow.ll Sun Feb 24 13:55:37 2019
@@ -345,3 +345,126 @@ define { i32, i1 } @never_overflows_ssub
   %x = call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %a, i32 0)
   ret { i32, i1 } %x
 }
+
+define i1 @uadd_res_ult_x(i32 %x, i32 %y, i1* %p) nounwind {
+; CHECK-LABEL: @uadd_res_ult_x(
+; CHECK-NEXT:    [[A:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[X:%.*]], i32 [[Y:%.*]])
+; CHECK-NEXT:    [[B:%.*]] = extractvalue { i32, i1 } [[A]], 1
+; CHECK-NEXT:    store i1 [[B]], i1* [[P:%.*]], align 1
+; CHECK-NEXT:    [[C:%.*]] = extractvalue { i32, i1 } [[A]], 0
+; CHECK-NEXT:    [[D:%.*]] = icmp ult i32 [[C]], [[X]]
+; CHECK-NEXT:    ret i1 [[D]]
+;
+  %a = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %x, i32 %y)
+  %b = extractvalue { i32, i1 } %a, 1
+  store i1 %b, i1* %p
+  %c = extractvalue { i32, i1 } %a, 0
+  %d = icmp ult i32 %c, %x
+  ret i1 %d
+}
+
+define i1 @uadd_res_ult_y(i32 %x, i32 %y, i1* %p) nounwind {
+; CHECK-LABEL: @uadd_res_ult_y(
+; CHECK-NEXT:    [[A:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[X:%.*]], i32 [[Y:%.*]])
+; CHECK-NEXT:    [[B:%.*]] = extractvalue { i32, i1 } [[A]], 1
+; CHECK-NEXT:    store i1 [[B]], i1* [[P:%.*]], align 1
+; CHECK-NEXT:    [[C:%.*]] = extractvalue { i32, i1 } [[A]], 0
+; CHECK-NEXT:    [[D:%.*]] = icmp ult i32 [[C]], [[Y]]
+; CHECK-NEXT:    ret i1 [[D]]
+;
+  %a = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %x, i32 %y)
+  %b = extractvalue { i32, i1 } %a, 1
+  store i1 %b, i1* %p
+  %c = extractvalue { i32, i1 } %a, 0
+  %d = icmp ult i32 %c, %y
+  ret i1 %d
+}
+
+define i1 @uadd_res_ugt_x(i32 %xx, i32 %y, i1* %p) nounwind {
+; CHECK-LABEL: @uadd_res_ugt_x(
+; CHECK-NEXT:    [[X:%.*]] = urem i32 42, [[XX:%.*]]
+; CHECK-NEXT:    [[A:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[X]], i32 [[Y:%.*]])
+; CHECK-NEXT:    [[B:%.*]] = extractvalue { i32, i1 } [[A]], 1
+; CHECK-NEXT:    store i1 [[B]], i1* [[P:%.*]], align 1
+; CHECK-NEXT:    [[C:%.*]] = extractvalue { i32, i1 } [[A]], 0
+; CHECK-NEXT:    [[D:%.*]] = icmp ugt i32 [[X]], [[C]]
+; CHECK-NEXT:    ret i1 [[D]]
+;
+  %x = urem i32 42, %xx ; Thwart complexity-based canonicalization
+  %a = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %x, i32 %y)
+  %b = extractvalue { i32, i1 } %a, 1
+  store i1 %b, i1* %p
+  %c = extractvalue { i32, i1 } %a, 0
+  %d = icmp ugt i32 %x, %c
+  ret i1 %d
+}
+
+define i1 @uadd_res_ugt_y(i32 %x, i32 %yy, i1* %p) nounwind {
+; CHECK-LABEL: @uadd_res_ugt_y(
+; CHECK-NEXT:    [[Y:%.*]] = urem i32 42, [[YY:%.*]]
+; CHECK-NEXT:    [[A:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[X:%.*]], i32 [[Y]])
+; CHECK-NEXT:    [[B:%.*]] = extractvalue { i32, i1 } [[A]], 1
+; CHECK-NEXT:    store i1 [[B]], i1* [[P:%.*]], align 1
+; CHECK-NEXT:    [[C:%.*]] = extractvalue { i32, i1 } [[A]], 0
+; CHECK-NEXT:    [[D:%.*]] = icmp ugt i32 [[Y]], [[C]]
+; CHECK-NEXT:    ret i1 [[D]]
+;
+  %y = urem i32 42, %yy ; Thwart complexity-based canonicalization
+  %a = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %x, i32 %y)
+  %b = extractvalue { i32, i1 } %a, 1
+  store i1 %b, i1* %p
+  %c = extractvalue { i32, i1 } %a, 0
+  %d = icmp ugt i32 %y, %c
+  ret i1 %d
+}
+
+define i1 @uadd_res_ult_const(i32 %x, i1* %p) nounwind {
+; CHECK-LABEL: @uadd_res_ult_const(
+; CHECK-NEXT:    [[A:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[X:%.*]], i32 42)
+; CHECK-NEXT:    [[B:%.*]] = extractvalue { i32, i1 } [[A]], 1
+; CHECK-NEXT:    store i1 [[B]], i1* [[P:%.*]], align 1
+; CHECK-NEXT:    [[C:%.*]] = extractvalue { i32, i1 } [[A]], 0
+; CHECK-NEXT:    [[D:%.*]] = icmp ult i32 [[C]], 42
+; CHECK-NEXT:    ret i1 [[D]]
+;
+  %a = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %x, i32 42)
+  %b = extractvalue { i32, i1 } %a, 1
+  store i1 %b, i1* %p
+  %c = extractvalue { i32, i1 } %a, 0
+  %d = icmp ult i32 %c, 42
+  ret i1 %d
+}
+
+define i1 @uadd_res_ult_const_one(i32 %x, i1* %p) nounwind {
+; CHECK-LABEL: @uadd_res_ult_const_one(
+; CHECK-NEXT:    [[A:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[X:%.*]], i32 1)
+; CHECK-NEXT:    [[B:%.*]] = extractvalue { i32, i1 } [[A]], 1
+; CHECK-NEXT:    store i1 [[B]], i1* [[P:%.*]], align 1
+; CHECK-NEXT:    [[C:%.*]] = extractvalue { i32, i1 } [[A]], 0
+; CHECK-NEXT:    [[D:%.*]] = icmp eq i32 [[C]], 0
+; CHECK-NEXT:    ret i1 [[D]]
+;
+  %a = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %x, i32 1)
+  %b = extractvalue { i32, i1 } %a, 1
+  store i1 %b, i1* %p
+  %c = extractvalue { i32, i1 } %a, 0
+  %d = icmp ult i32 %c, 1
+  ret i1 %d
+}
+
+define i1 @uadd_res_ult_const_minus_one(i32 %x, i1* %p) nounwind {
+; CHECK-LABEL: @uadd_res_ult_const_minus_one(
+; CHECK-NEXT:    [[A:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[X:%.*]], i32 -1)
+; CHECK-NEXT:    [[B:%.*]] = extractvalue { i32, i1 } [[A]], 1
+; CHECK-NEXT:    store i1 [[B]], i1* [[P:%.*]], align 1
+; CHECK-NEXT:    [[C:%.*]] = extractvalue { i32, i1 } [[A]], 0
+; CHECK-NEXT:    [[D:%.*]] = icmp ne i32 [[C]], -1
+; CHECK-NEXT:    ret i1 [[D]]
+;
+  %a = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %x, i32 -1)
+  %b = extractvalue { i32, i1 } %a, 1
+  store i1 %b, i1* %p
+  %c = extractvalue { i32, i1 } %a, 0
+  %d = icmp ult i32 %c, -1
+  ret i1 %d
+}




More information about the llvm-commits mailing list