diff options
-rw-r--r-- | llvm/test/Transforms/InstCombine/builtin-dynamic-object-size.ll | 2 | ||||
-rw-r--r-- | llvm/test/Transforms/InstCombine/unsigned_saturated_sub.ll | 299 |
2 files changed, 300 insertions, 1 deletions
diff --git a/llvm/test/Transforms/InstCombine/builtin-dynamic-object-size.ll b/llvm/test/Transforms/InstCombine/builtin-dynamic-object-size.ll index eabe3a4c4b7..96d0772da38 100644 --- a/llvm/test/Transforms/InstCombine/builtin-dynamic-object-size.ll +++ b/llvm/test/Transforms/InstCombine/builtin-dynamic-object-size.ll @@ -1,4 +1,4 @@ -; RUN: opt -instcombine -S < %s | FileCheck %s --dump-input-on-failure +; RUN: opt -instcombine -S < %s | FileCheck %s target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.14.0" diff --git a/llvm/test/Transforms/InstCombine/unsigned_saturated_sub.ll b/llvm/test/Transforms/InstCombine/unsigned_saturated_sub.ll index 44aa7deb4ac..a5b15040ac7 100644 --- a/llvm/test/Transforms/InstCombine/unsigned_saturated_sub.ll +++ b/llvm/test/Transforms/InstCombine/unsigned_saturated_sub.ll @@ -5,6 +5,8 @@ ; usub.sat() intrinsics is tested here. declare void @use(i64) +declare void @usei32(i32) +declare void @usei1(i1) ; (a > b) ? a - b : 0 -> usub.sat(a, b) @@ -32,6 +34,52 @@ define i64 @max_sub_uge(i64 %a, i64 %b) { ret i64 %sel } +define i64 @max_sub_uge_extrause1(i64 %a, i64 %b) { +; CHECK-LABEL: @max_sub_uge_extrause1( +; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[A:%.*]], [[B:%.*]] +; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[A]], [[B]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i64 0, i64 [[SUB]] +; CHECK-NEXT: call void @use(i64 [[SUB]]) +; CHECK-NEXT: ret i64 [[SEL]] +; + %cmp = icmp uge i64 %a, %b + %sub = sub i64 %a, %b + %sel = select i1 %cmp, i64 %sub ,i64 0 + call void @use(i64 %sub) + ret i64 %sel +} + +define i64 @max_sub_uge_extrause2(i64 %a, i64 %b) { +; CHECK-LABEL: @max_sub_uge_extrause2( +; CHECK-NEXT: [[CMP:%.*]] = icmp uge i64 [[A:%.*]], [[B:%.*]] +; CHECK-NEXT: [[TMP1:%.*]] = call i64 @llvm.usub.sat.i64(i64 [[A]], i64 [[B]]) +; CHECK-NEXT: call void @usei1(i1 [[CMP]]) +; CHECK-NEXT: ret i64 [[TMP1]] +; + %cmp = icmp uge i64 %a, %b + %sub = sub i64 %a, %b + %sel = select i1 %cmp, i64 %sub ,i64 0 + call void @usei1(i1 %cmp) + ret i64 %sel +} + +define i64 @max_sub_uge_extrause3(i64 %a, i64 %b) { +; CHECK-LABEL: @max_sub_uge_extrause3( +; CHECK-NEXT: [[CMP:%.*]] = icmp uge i64 [[A:%.*]], [[B:%.*]] +; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[A]], [[B]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i64 [[SUB]], i64 0 +; CHECK-NEXT: call void @use(i64 [[SUB]]) +; CHECK-NEXT: call void @usei1(i1 [[CMP]]) +; CHECK-NEXT: ret i64 [[SEL]] +; + %cmp = icmp uge i64 %a, %b + %sub = sub i64 %a, %b + %sel = select i1 %cmp, i64 %sub ,i64 0 + call void @use(i64 %sub) + call void @usei1(i1 %cmp) + ret i64 %sel +} + ; Again, with vectors: ; (a > b) ? a - b : 0 -> usub.sat(a, b) @@ -140,6 +188,53 @@ define i64 @neg_max_sub_ugt_sel_swapped(i64 %a, i64 %b) { ret i64 %sel } +define i64 @neg_max_sub_ugt_sel_swapped_extrause1(i64 %a, i64 %b) { +; CHECK-LABEL: @neg_max_sub_ugt_sel_swapped_extrause1( +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[B:%.*]], [[A:%.*]] +; CHECK-NEXT: [[TMP1:%.*]] = call i64 @llvm.usub.sat.i64(i64 [[A]], i64 [[B]]) +; CHECK-NEXT: [[TMP2:%.*]] = sub i64 0, [[TMP1]] +; CHECK-NEXT: call void @usei1(i1 [[CMP]]) +; CHECK-NEXT: ret i64 [[TMP2]] +; + %cmp = icmp ugt i64 %b, %a + %sub = sub i64 %b, %a + %sel = select i1 %cmp, i64 0 ,i64 %sub + call void @usei1(i1 %cmp) + ret i64 %sel +} + +define i64 @neg_max_sub_ugt_sel_swapped_extrause2(i64 %a, i64 %b) { +; CHECK-LABEL: @neg_max_sub_ugt_sel_swapped_extrause2( +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[B:%.*]], [[A:%.*]] +; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[B]], [[A]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i64 0, i64 [[SUB]] +; CHECK-NEXT: call void @use(i64 [[SUB]]) +; CHECK-NEXT: ret i64 [[SEL]] +; + %cmp = icmp ugt i64 %b, %a + %sub = sub i64 %b, %a + %sel = select i1 %cmp, i64 0 ,i64 %sub + call void @use(i64 %sub) + ret i64 %sel +} + +define i64 @neg_max_sub_ugt_sel_swapped_extrause3(i64 %a, i64 %b) { +; CHECK-LABEL: @neg_max_sub_ugt_sel_swapped_extrause3( +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[B:%.*]], [[A:%.*]] +; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[B]], [[A]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i64 0, i64 [[SUB]] +; CHECK-NEXT: call void @use(i64 [[SUB]]) +; CHECK-NEXT: call void @usei1(i1 [[CMP]]) +; CHECK-NEXT: ret i64 [[SEL]] +; + %cmp = icmp ugt i64 %b, %a + %sub = sub i64 %b, %a + %sel = select i1 %cmp, i64 0 ,i64 %sub + call void @use(i64 %sub) + call void @usei1(i1 %cmp) + ret i64 %sel +} + ; ((a < b) ? 0 : b - a) -> -usub.sat(a, b) define i64 @neg_max_sub_ult_sel_swapped(i64 %a, i64 %b) { @@ -158,3 +253,207 @@ define i64 @neg_max_sub_ult_sel_swapped(i64 %a, i64 %b) { ret i64 %sel } +define i32 @max_sub_ugt_c1(i32 %a) { +; CHECK-LABEL: @max_sub_ugt_c1( +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[A:%.*]], 1 +; CHECK-NEXT: [[SUB:%.*]] = add i32 [[A]], -1 +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i32 [[SUB]], i32 0 +; CHECK-NEXT: ret i32 [[SEL]] +; + %cmp = icmp ugt i32 %a, 1 + %sub = add i32 %a, -1 + %sel = select i1 %cmp, i32 %sub ,i32 0 + ret i32 %sel +} + +define i32 @max_sub_ugt_c01(i32 %a) { +; CHECK-LABEL: @max_sub_ugt_c01( +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A:%.*]], 0 +; CHECK-NEXT: [[SUB:%.*]] = add i32 [[A]], -1 +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i32 0, i32 [[SUB]] +; CHECK-NEXT: ret i32 [[SEL]] +; + %cmp = icmp ugt i32 %a, 0 + %sub = add i32 %a, -1 + %sel = select i1 %cmp, i32 %sub ,i32 0 + ret i32 %sel +} + +define i32 @max_sub_ugt_c10(i32 %a) { +; CHECK-LABEL: @max_sub_ugt_c10( +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[A:%.*]], 10 +; CHECK-NEXT: [[SUB:%.*]] = add i32 [[A]], -10 +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i32 [[SUB]], i32 0 +; CHECK-NEXT: ret i32 [[SEL]] +; + %cmp = icmp ugt i32 %a, 10 + %sub = add i32 %a, -10 + %sel = select i1 %cmp, i32 %sub, i32 0 + ret i32 %sel +} + +define i32 @max_sub_ugt_c910(i32 %a) { +; CHECK-LABEL: @max_sub_ugt_c910( +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[A:%.*]], 9 +; CHECK-NEXT: [[SUB:%.*]] = add i32 [[A]], -10 +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i32 [[SUB]], i32 0 +; CHECK-NEXT: ret i32 [[SEL]] +; + %cmp = icmp ugt i32 %a, 9 + %sub = add i32 %a, -10 + %sel = select i1 %cmp, i32 %sub, i32 0 + ret i32 %sel +} + +define i32 @max_sub_ugt_c1110(i32 %a) { +; CHECK-LABEL: @max_sub_ugt_c1110( +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[A:%.*]], 11 +; CHECK-NEXT: [[SUB:%.*]] = add i32 [[A]], -10 +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i32 [[SUB]], i32 0 +; CHECK-NEXT: ret i32 [[SEL]] +; + %cmp = icmp ugt i32 %a, 11 + %sub = add i32 %a, -10 + %sel = select i1 %cmp, i32 %sub, i32 0 + ret i32 %sel +} + +define i32 @max_sub_ugt_c0(i32 %a) { +; CHECK-LABEL: @max_sub_ugt_c0( +; CHECK-NEXT: ret i32 0 +; + %cmp = icmp ugt i32 %a, -1 + %sub = add i32 %a, 0 + %sel = select i1 %cmp, i32 %sub, i32 0 + ret i32 %sel +} + +define i32 @max_sub_ugt_cmiss(i32 %a) { +; CHECK-LABEL: @max_sub_ugt_cmiss( +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[A:%.*]], 1 +; CHECK-NEXT: [[SUB:%.*]] = add i32 [[A]], -2 +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i32 [[SUB]], i32 0 +; CHECK-NEXT: ret i32 [[SEL]] +; + %cmp = icmp ugt i32 %a, 1 + %sub = add i32 %a, -2 + %sel = select i1 %cmp, i32 %sub, i32 0 + ret i32 %sel +} + +define i32 @max_sub_ult_c1(i32 %a) { +; CHECK-LABEL: @max_sub_ult_c1( +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A:%.*]], 0 +; CHECK-NEXT: [[SEL:%.*]] = sext i1 [[CMP]] to i32 +; CHECK-NEXT: ret i32 [[SEL]] +; + %cmp = icmp ult i32 %a, 1 + %sub = add i32 %a, -1 + %sel = select i1 %cmp, i32 %sub, i32 0 + ret i32 %sel +} + +define i32 @max_sub_ult_c2(i32 %a) { +; CHECK-LABEL: @max_sub_ult_c2( +; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[A:%.*]], 2 +; CHECK-NEXT: [[SUB:%.*]] = add i32 [[A]], -2 +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i32 [[SUB]], i32 0 +; CHECK-NEXT: ret i32 [[SEL]] +; + %cmp = icmp ult i32 %a, 2 + %sub = add i32 %a, -2 + %sel = select i1 %cmp, i32 %sub, i32 0 + ret i32 %sel +} + +define i32 @max_sub_ult_c2_oneuseicmp(i32 %a) { +; CHECK-LABEL: @max_sub_ult_c2_oneuseicmp( +; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[A:%.*]], 2 +; CHECK-NEXT: [[SUB:%.*]] = add i32 [[A]], -2 +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i32 [[SUB]], i32 0 +; CHECK-NEXT: call void @usei1(i1 [[CMP]]) +; CHECK-NEXT: ret i32 [[SEL]] +; + %cmp = icmp ult i32 %a, 2 + %sub = add i32 %a, -2 + %sel = select i1 %cmp, i32 %sub, i32 0 + call void @usei1(i1 %cmp) + ret i32 %sel +} + +define i32 @max_sub_ult_c2_oneusesub(i32 %a) { +; CHECK-LABEL: @max_sub_ult_c2_oneusesub( +; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[A:%.*]], 2 +; CHECK-NEXT: [[SUB:%.*]] = add i32 [[A]], -2 +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i32 [[SUB]], i32 0 +; CHECK-NEXT: call void @usei32(i32 [[SUB]]) +; CHECK-NEXT: ret i32 [[SEL]] +; + %cmp = icmp ult i32 %a, 2 + %sub = add i32 %a, -2 + %sel = select i1 %cmp, i32 %sub, i32 0 + call void @usei32(i32 %sub) + ret i32 %sel +} + +define i32 @max_sub_ult_c32(i32 %a) { +; CHECK-LABEL: @max_sub_ult_c32( +; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[A:%.*]], 3 +; CHECK-NEXT: [[SUB:%.*]] = add i32 [[A]], -2 +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i32 [[SUB]], i32 0 +; CHECK-NEXT: ret i32 [[SEL]] +; + %cmp = icmp ult i32 %a, 3 + %sub = add i32 %a, -2 + %sel = select i1 %cmp, i32 %sub, i32 0 + ret i32 %sel +} + +define i32 @max_sub_ugt_c32(i32 %a) { +; CHECK-LABEL: @max_sub_ugt_c32( +; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[A:%.*]], 3 +; CHECK-NEXT: [[SUB:%.*]] = add i32 [[A]], -2 +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i32 [[SUB]], i32 0 +; CHECK-NEXT: ret i32 [[SEL]] +; + %cmp = icmp ugt i32 3, %a + %sub = add i32 %a, -2 + %sel = select i1 %cmp, i32 %sub, i32 0 + ret i32 %sel +} + +define i32 @max_sub_uge_c32(i32 %a) { +; CHECK-LABEL: @max_sub_uge_c32( +; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[A:%.*]], 3 +; CHECK-NEXT: [[SUB:%.*]] = add i32 [[A]], -2 +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i32 [[SUB]], i32 0 +; CHECK-NEXT: ret i32 [[SEL]] +; + %cmp = icmp uge i32 2, %a + %sub = add i32 %a, -2 + %sel = select i1 %cmp, i32 %sub, i32 0 + ret i32 %sel +} + +define i32 @max_sub_ult_c12(i32 %a) { +; CHECK-LABEL: @max_sub_ult_c12( +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A:%.*]], 0 +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i32 -2, i32 0 +; CHECK-NEXT: ret i32 [[SEL]] +; + %cmp = icmp ult i32 %a, 1 + %sub = add i32 %a, -2 + %sel = select i1 %cmp, i32 %sub, i32 0 + ret i32 %sel +} + +define i32 @max_sub_ult_c0(i32 %a) { +; CHECK-LABEL: @max_sub_ult_c0( +; CHECK-NEXT: ret i32 0 +; + %cmp = icmp ult i32 %a, 0 + %sub = add i32 %a, -1 + %sel = select i1 %cmp, i32 %sub, i32 0 + ret i32 %sel +} + |