diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2019-02-24 21:55:37 +0000 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-02-24 21:55:37 +0000 |
commit | b7918f3c14c3fa14a3f8e89008c1540039f4f603 (patch) | |
tree | 835d2da3c269630448b8b52ead5659a9c2047b34 /llvm/test/Transforms/InstCombine/with_overflow.ll | |
parent | bdefe47857278d377df5926c9d561b983cc0768c (diff) | |
download | bcm5719-llvm-b7918f3c14c3fa14a3f8e89008c1540039f4f603.tar.gz bcm5719-llvm-b7918f3c14c3fa14a3f8e89008c1540039f4f603.zip |
[InstCombine] Add tests for PR40846; NFC
The icmps are the same as the overflow result of the intrinsic.
llvm-svn: 354760
Diffstat (limited to 'llvm/test/Transforms/InstCombine/with_overflow.ll')
-rw-r--r-- | llvm/test/Transforms/InstCombine/with_overflow.ll | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/llvm/test/Transforms/InstCombine/with_overflow.ll b/llvm/test/Transforms/InstCombine/with_overflow.ll index 13339c392e7..267db829ef1 100644 --- a/llvm/test/Transforms/InstCombine/with_overflow.ll +++ b/llvm/test/Transforms/InstCombine/with_overflow.ll @@ -345,3 +345,126 @@ define { i32, i1 } @never_overflows_ssub_test0(i32 %a) { %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 +} |