diff options
author | Florian Hahn <flo@fhahn.com> | 2022-10-06 22:11:51 +0100 |
---|---|---|
committer | Florian Hahn <flo@fhahn.com> | 2022-10-06 22:11:51 +0100 |
commit | 5b70db8f0065554d3b0303e7fe7a6c730f0fb108 (patch) | |
tree | 9f7a06015172230898d310bf9b007495f1131741 /llvm | |
parent | 52601325f1a4db06510dbe12562240a018a254bd (diff) | |
download | llvm-5b70db8f0065554d3b0303e7fe7a6c730f0fb108.zip llvm-5b70db8f0065554d3b0303e7fe7a6c730f0fb108.tar.gz llvm-5b70db8f0065554d3b0303e7fe7a6c730f0fb108.tar.bz2 |
[ConstraintElimination] Add tests where unsigned system can be queried.
Add tests with a mix of signed and unsigned predicates. In some cases,
the unsigned system can be queried for signed predicates to improve
results.
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/test/Transforms/ConstraintElimination/signed-query-unsigned-system.ll | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/llvm/test/Transforms/ConstraintElimination/signed-query-unsigned-system.ll b/llvm/test/Transforms/ConstraintElimination/signed-query-unsigned-system.ll new file mode 100644 index 0000000..a07c7fa --- /dev/null +++ b/llvm/test/Transforms/ConstraintElimination/signed-query-unsigned-system.ll @@ -0,0 +1,144 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s + +declare void @llvm.assume(i1) + +define i1 @sge_0_unsigned_a_ne_0(i8 %a) { +; CHECK-LABEL: @sge_0_unsigned_a_ne_0( +; CHECK-NEXT: [[A_NE_0:%.*]] = icmp ne i8 [[A:%.*]], 0 +; CHECK-NEXT: call void @llvm.assume(i1 [[A_NE_0]]) +; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[A]] to i16 +; CHECK-NEXT: [[T:%.*]] = icmp sge i16 [[EXT]], 0 +; CHECK-NEXT: ret i1 [[T]] +; + %a.ne.0 = icmp ne i8 %a, 0 + call void @llvm.assume(i1 %a.ne.0) + %ext = zext i8 %a to i16 + %t = icmp sge i16 %ext, 0 + ret i1 %t +} + +define i1 @sgt_0_unsigned_a_ne_0(i8 %a) { +; CHECK-LABEL: @sgt_0_unsigned_a_ne_0( +; CHECK-NEXT: [[A_NE_0:%.*]] = icmp ne i8 [[A:%.*]], 0 +; CHECK-NEXT: call void @llvm.assume(i1 [[A_NE_0]]) +; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[A]] to i16 +; CHECK-NEXT: [[T:%.*]] = icmp sgt i16 [[EXT]], 0 +; CHECK-NEXT: ret i1 [[T]] +; + %a.ne.0 = icmp ne i8 %a, 0 + call void @llvm.assume(i1 %a.ne.0) + %ext = zext i8 %a to i16 + %t = icmp sgt i16 %ext, 0 + ret i1 %t +} + +define i1 @sgt_0_unsigned_a_sgt_0(i8 %a) { +; CHECK-LABEL: @sgt_0_unsigned_a_sgt_0( +; CHECK-NEXT: [[A_SGT_0:%.*]] = icmp sgt i8 [[A:%.*]], 0 +; CHECK-NEXT: call void @llvm.assume(i1 [[A_SGT_0]]) +; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[A]] to i16 +; CHECK-NEXT: [[T:%.*]] = icmp sgt i16 [[EXT]], 0 +; CHECK-NEXT: ret i1 [[T]] +; + %a.sgt.0 = icmp sgt i8 %a, 0 + call void @llvm.assume(i1 %a.sgt.0) + %ext = zext i8 %a to i16 + %t = icmp sgt i16 %ext, 0 + ret i1 %t +} + +define i1 @sge_0_unsigned_a_sge_0(i8 %a) { +; CHECK-LABEL: @sge_0_unsigned_a_sge_0( +; CHECK-NEXT: [[A_SGE_0:%.*]] = icmp sge i8 [[A:%.*]], 0 +; CHECK-NEXT: call void @llvm.assume(i1 [[A_SGE_0]]) +; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[A]] to i16 +; CHECK-NEXT: [[T:%.*]] = icmp sge i16 [[EXT]], 0 +; CHECK-NEXT: ret i1 [[T]] +; + %a.sge.0 = icmp sge i8 %a, 0 + call void @llvm.assume(i1 %a.sge.0) + %ext = zext i8 %a to i16 + %t = icmp sge i16 %ext, 0 + ret i1 %t +} + +define i1 @sgt_0_unsigned_a_ugt_0(i8 %a) { +; CHECK-LABEL: @sgt_0_unsigned_a_ugt_0( +; CHECK-NEXT: [[A_UGT_0:%.*]] = icmp ugt i8 [[A:%.*]], 0 +; CHECK-NEXT: call void @llvm.assume(i1 [[A_UGT_0]]) +; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[A]] to i16 +; CHECK-NEXT: [[T:%.*]] = icmp sgt i16 [[EXT]], 0 +; CHECK-NEXT: ret i1 [[T]] +; + %a.ugt.0 = icmp ugt i8 %a, 0 + call void @llvm.assume(i1 %a.ugt.0) + %ext = zext i8 %a to i16 + %t = icmp sgt i16 %ext, 0 + ret i1 %t +} + +define i1 @sgt_1_unsigned_a_ne_0(i8 %a) { +; CHECK-LABEL: @sgt_1_unsigned_a_ne_0( +; CHECK-NEXT: [[A_NE_0:%.*]] = icmp ne i8 [[A:%.*]], 0 +; CHECK-NEXT: call void @llvm.assume(i1 [[A_NE_0]]) +; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[A]] to i16 +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i16 [[EXT]], 1 +; CHECK-NEXT: ret i1 [[CMP]] +; + %a.ne.0 = icmp ne i8 %a, 0 + call void @llvm.assume(i1 %a.ne.0) + %ext = zext i8 %a to i16 + %cmp = icmp sgt i16 %ext, 1 + ret i1 %cmp +} + +define i1 @sgt_1_unsigned_a_ugt_1(i8 %a) { +; CHECK-LABEL: @sgt_1_unsigned_a_ugt_1( +; CHECK-NEXT: [[A_UGT_1:%.*]] = icmp ugt i8 [[A:%.*]], 1 +; CHECK-NEXT: call void @llvm.assume(i1 [[A_UGT_1]]) +; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[A]] to i16 +; CHECK-NEXT: [[T:%.*]] = icmp sgt i16 [[EXT]], 1 +; CHECK-NEXT: ret i1 [[T]] +; + %a.ugt.1 = icmp ugt i8 %a, 1 + call void @llvm.assume(i1 %a.ugt.1) + %ext = zext i8 %a to i16 + %t = icmp sgt i16 %ext, 1 + ret i1 %t +} + +define i1 @sge_no_const_unsigned_uge(i8 %a, i16 %b) { +; CHECK-LABEL: @sge_no_const_unsigned_uge( +; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[A:%.*]] to i16 +; CHECK-NEXT: [[A_UGE_B:%.*]] = icmp uge i16 [[EXT]], [[B:%.*]] +; CHECK-NEXT: call void @llvm.assume(i1 [[A_UGE_B]]) +; CHECK-NEXT: [[B_POS:%.*]] = icmp sge i16 [[B]], 0 +; CHECK-NEXT: call void @llvm.assume(i1 [[B_POS]]) +; CHECK-NEXT: [[CMP:%.*]] = icmp sge i16 [[EXT]], [[B]] +; CHECK-NEXT: ret i1 [[CMP]] +; + %ext = zext i8 %a to i16 + %a.uge.b = icmp uge i16 %ext, %b + call void @llvm.assume(i1 %a.uge.b) + + %b.pos = icmp sge i16 %b, 0 + call void @llvm.assume(i1 %b.pos) + %cmp = icmp sge i16 %ext, %b + ret i1 %cmp +} + +define i1 @sgt_0_unsigned_a_ugt_neg_10(i8 %a) { +; CHECK-LABEL: @sgt_0_unsigned_a_ugt_neg_10( +; CHECK-NEXT: [[A_UGT_0:%.*]] = icmp ugt i8 [[A:%.*]], 10 +; CHECK-NEXT: call void @llvm.assume(i1 [[A_UGT_0]]) +; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[A]] to i16 +; CHECK-NEXT: [[T:%.*]] = icmp sgt i16 [[EXT]], 0 +; CHECK-NEXT: ret i1 [[T]] +; + %a.ugt.0 = icmp ugt i8 %a, 10 + call void @llvm.assume(i1 %a.ugt.0) + %ext = zext i8 %a to i16 + %cmp = icmp sgt i16 %ext, 0 + ret i1 %cmp +} |