diff options
Diffstat (limited to 'test/CodeGen/AArch64/combine-comparisons-by-cse.ll')
| -rw-r--r-- | test/CodeGen/AArch64/combine-comparisons-by-cse.ll | 474 |
1 files changed, 0 insertions, 474 deletions
diff --git a/test/CodeGen/AArch64/combine-comparisons-by-cse.ll b/test/CodeGen/AArch64/combine-comparisons-by-cse.ll deleted file mode 100644 index 86be3ccea1d8..000000000000 --- a/test/CodeGen/AArch64/combine-comparisons-by-cse.ll +++ /dev/null @@ -1,474 +0,0 @@ -; RUN: llc < %s -mtriple=aarch64-linux-gnu | FileCheck %s - -; marked as external to prevent possible optimizations -@a = external global i32 -@b = external global i32 -@c = external global i32 -@d = external global i32 - -; (a > 10 && b == c) || (a >= 10 && b == d) -define i32 @combine_gt_ge_10() #0 { -; CHECK-LABEL: combine_gt_ge_10 -; CHECK: cmp -; CHECK: b.le -; CHECK: ret -; CHECK-NOT: cmp -; CHECK: b.lt -entry: - %0 = load i32, i32* @a, align 4 - %cmp = icmp sgt i32 %0, 10 - br i1 %cmp, label %land.lhs.true, label %lor.lhs.false - -land.lhs.true: ; preds = %entry - %1 = load i32, i32* @b, align 4 - %2 = load i32, i32* @c, align 4 - %cmp1 = icmp eq i32 %1, %2 - br i1 %cmp1, label %return, label %land.lhs.true3 - -lor.lhs.false: ; preds = %entry - %cmp2 = icmp sgt i32 %0, 9 - br i1 %cmp2, label %land.lhs.true3, label %if.end - -land.lhs.true3: ; preds = %lor.lhs.false, %land.lhs.true - %3 = load i32, i32* @b, align 4 - %4 = load i32, i32* @d, align 4 - %cmp4 = icmp eq i32 %3, %4 - br i1 %cmp4, label %return, label %if.end - -if.end: ; preds = %land.lhs.true3, %lor.lhs.false - br label %return - -return: ; preds = %if.end, %land.lhs.true3, %land.lhs.true - %retval.0 = phi i32 [ 0, %if.end ], [ 1, %land.lhs.true3 ], [ 1, %land.lhs.true ] - ret i32 %retval.0 -} - -; (a > 5 && b == c) || (a < 5 && b == d) -define i32 @combine_gt_lt_5() #0 { -; CHECK-LABEL: combine_gt_lt_5 -; CHECK: cmp -; CHECK: b.le -; CHECK: ret -; CHECK-NOT: cmp -; CHECK: b.ge -entry: - %0 = load i32, i32* @a, align 4 - %cmp = icmp sgt i32 %0, 5 - br i1 %cmp, label %land.lhs.true, label %lor.lhs.false - -land.lhs.true: ; preds = %entry - %1 = load i32, i32* @b, align 4 - %2 = load i32, i32* @c, align 4 - %cmp1 = icmp eq i32 %1, %2 - br i1 %cmp1, label %return, label %if.end - -lor.lhs.false: ; preds = %entry - %cmp2 = icmp slt i32 %0, 5 - br i1 %cmp2, label %land.lhs.true3, label %if.end - -land.lhs.true3: ; preds = %lor.lhs.false - %3 = load i32, i32* @b, align 4 - %4 = load i32, i32* @d, align 4 - %cmp4 = icmp eq i32 %3, %4 - br i1 %cmp4, label %return, label %if.end - -if.end: ; preds = %land.lhs.true3, %lor.lhs.false, %land.lhs.true - br label %return - -return: ; preds = %if.end, %land.lhs.true3, %land.lhs.true - %retval.0 = phi i32 [ 0, %if.end ], [ 1, %land.lhs.true3 ], [ 1, %land.lhs.true ] - ret i32 %retval.0 -} - -; (a < 5 && b == c) || (a <= 5 && b == d) -define i32 @combine_lt_ge_5() #0 { -; CHECK-LABEL: combine_lt_ge_5 -; CHECK: cmp -; CHECK: b.ge -; CHECK: ret -; CHECK-NOT: cmp -; CHECK: b.gt -entry: - %0 = load i32, i32* @a, align 4 - %cmp = icmp slt i32 %0, 5 - br i1 %cmp, label %land.lhs.true, label %lor.lhs.false - -land.lhs.true: ; preds = %entry - %1 = load i32, i32* @b, align 4 - %2 = load i32, i32* @c, align 4 - %cmp1 = icmp eq i32 %1, %2 - br i1 %cmp1, label %return, label %land.lhs.true3 - -lor.lhs.false: ; preds = %entry - %cmp2 = icmp slt i32 %0, 6 - br i1 %cmp2, label %land.lhs.true3, label %if.end - -land.lhs.true3: ; preds = %lor.lhs.false, %land.lhs.true - %3 = load i32, i32* @b, align 4 - %4 = load i32, i32* @d, align 4 - %cmp4 = icmp eq i32 %3, %4 - br i1 %cmp4, label %return, label %if.end - -if.end: ; preds = %land.lhs.true3, %lor.lhs.false - br label %return - -return: ; preds = %if.end, %land.lhs.true3, %land.lhs.true - %retval.0 = phi i32 [ 0, %if.end ], [ 1, %land.lhs.true3 ], [ 1, %land.lhs.true ] - ret i32 %retval.0 -} - -; (a < 5 && b == c) || (a > 5 && b == d) -define i32 @combine_lt_gt_5() #0 { -; CHECK-LABEL: combine_lt_gt_5 -; CHECK: cmp -; CHECK: b.ge -; CHECK: ret -; CHECK-NOT: cmp -; CHECK: b.le -entry: - %0 = load i32, i32* @a, align 4 - %cmp = icmp slt i32 %0, 5 - br i1 %cmp, label %land.lhs.true, label %lor.lhs.false - -land.lhs.true: ; preds = %entry - %1 = load i32, i32* @b, align 4 - %2 = load i32, i32* @c, align 4 - %cmp1 = icmp eq i32 %1, %2 - br i1 %cmp1, label %return, label %if.end - -lor.lhs.false: ; preds = %entry - %cmp2 = icmp sgt i32 %0, 5 - br i1 %cmp2, label %land.lhs.true3, label %if.end - -land.lhs.true3: ; preds = %lor.lhs.false - %3 = load i32, i32* @b, align 4 - %4 = load i32, i32* @d, align 4 - %cmp4 = icmp eq i32 %3, %4 - br i1 %cmp4, label %return, label %if.end - -if.end: ; preds = %land.lhs.true3, %lor.lhs.false, %land.lhs.true - br label %return - -return: ; preds = %if.end, %land.lhs.true3, %land.lhs.true - %retval.0 = phi i32 [ 0, %if.end ], [ 1, %land.lhs.true3 ], [ 1, %land.lhs.true ] - ret i32 %retval.0 -} - -; (a > -5 && b == c) || (a < -5 && b == d) -define i32 @combine_gt_lt_n5() #0 { -; CHECK-LABEL: combine_gt_lt_n5 -; CHECK: cmn -; CHECK: b.le -; CHECK: ret -; CHECK-NOT: cmn -; CHECK: b.ge -entry: - %0 = load i32, i32* @a, align 4 - %cmp = icmp sgt i32 %0, -5 - br i1 %cmp, label %land.lhs.true, label %lor.lhs.false - -land.lhs.true: ; preds = %entry - %1 = load i32, i32* @b, align 4 - %2 = load i32, i32* @c, align 4 - %cmp1 = icmp eq i32 %1, %2 - br i1 %cmp1, label %return, label %if.end - -lor.lhs.false: ; preds = %entry - %cmp2 = icmp slt i32 %0, -5 - br i1 %cmp2, label %land.lhs.true3, label %if.end - -land.lhs.true3: ; preds = %lor.lhs.false - %3 = load i32, i32* @b, align 4 - %4 = load i32, i32* @d, align 4 - %cmp4 = icmp eq i32 %3, %4 - br i1 %cmp4, label %return, label %if.end - -if.end: ; preds = %land.lhs.true3, %lor.lhs.false, %land.lhs.true - br label %return - -return: ; preds = %if.end, %land.lhs.true3, %land.lhs.true - %retval.0 = phi i32 [ 0, %if.end ], [ 1, %land.lhs.true3 ], [ 1, %land.lhs.true ] - ret i32 %retval.0 -} - -; (a < -5 && b == c) || (a > -5 && b == d) -define i32 @combine_lt_gt_n5() #0 { -; CHECK-LABEL: combine_lt_gt_n5 -; CHECK: cmn -; CHECK: b.ge -; CHECK: ret -; CHECK-NOT: cmn -; CHECK: b.le -entry: - %0 = load i32, i32* @a, align 4 - %cmp = icmp slt i32 %0, -5 - br i1 %cmp, label %land.lhs.true, label %lor.lhs.false - -land.lhs.true: ; preds = %entry - %1 = load i32, i32* @b, align 4 - %2 = load i32, i32* @c, align 4 - %cmp1 = icmp eq i32 %1, %2 - br i1 %cmp1, label %return, label %if.end - -lor.lhs.false: ; preds = %entry - %cmp2 = icmp sgt i32 %0, -5 - br i1 %cmp2, label %land.lhs.true3, label %if.end - -land.lhs.true3: ; preds = %lor.lhs.false - %3 = load i32, i32* @b, align 4 - %4 = load i32, i32* @d, align 4 - %cmp4 = icmp eq i32 %3, %4 - br i1 %cmp4, label %return, label %if.end - -if.end: ; preds = %land.lhs.true3, %lor.lhs.false, %land.lhs.true - br label %return - -return: ; preds = %if.end, %land.lhs.true3, %land.lhs.true - %retval.0 = phi i32 [ 0, %if.end ], [ 1, %land.lhs.true3 ], [ 1, %land.lhs.true ] - ret i32 %retval.0 -} - -%struct.Struct = type { i64, i64 } - -@glob = internal unnamed_addr global %struct.Struct* null, align 8 - -declare %struct.Struct* @Update(%struct.Struct*) #1 - -; no checks for this case, it just should be processed without errors -define void @combine_non_adjacent_cmp_br(%struct.Struct* nocapture readonly %hdCall) #0 { -entry: - %size = getelementptr inbounds %struct.Struct, %struct.Struct* %hdCall, i64 0, i32 0 - %0 = load i64, i64* %size, align 8 - br label %land.rhs - -land.rhs: - %rp.06 = phi i64 [ %0, %entry ], [ %sub, %while.body ] - %1 = load i64, i64* inttoptr (i64 24 to i64*), align 8 - %cmp2 = icmp sgt i64 %1, 0 - br i1 %cmp2, label %while.body, label %while.end - -while.body: - %2 = load %struct.Struct*, %struct.Struct** @glob, align 8 - %call = tail call %struct.Struct* @Update(%struct.Struct* %2) #2 - %sub = add nsw i64 %rp.06, -2 - %cmp = icmp slt i64 %0, %rp.06 - br i1 %cmp, label %land.rhs, label %while.end - -while.end: - ret void -} - -; undefined external to prevent possible optimizations -declare void @do_something() #1 - -define i32 @do_nothing_if_resultant_opcodes_would_differ() #0 { -; CHECK-LABEL: do_nothing_if_resultant_opcodes_would_differ -; CHECK: cmn -; CHECK: b.gt -; CHECK: cmp -; CHECK: b.gt -entry: - %0 = load i32, i32* @a, align 4 - %cmp4 = icmp slt i32 %0, -1 - br i1 %cmp4, label %while.body.preheader, label %while.end - -while.body.preheader: ; preds = %entry - br label %while.body - -while.body: ; preds = %while.body, %while.body.preheader - %i.05 = phi i32 [ %inc, %while.body ], [ %0, %while.body.preheader ] - tail call void @do_something() #2 - %inc = add nsw i32 %i.05, 1 - %cmp = icmp slt i32 %i.05, 0 - br i1 %cmp, label %while.body, label %while.cond.while.end_crit_edge - -while.cond.while.end_crit_edge: ; preds = %while.body - %.pre = load i32, i32* @a, align 4 - br label %while.end - -while.end: ; preds = %while.cond.while.end_crit_edge, %entry - %1 = phi i32 [ %.pre, %while.cond.while.end_crit_edge ], [ %0, %entry ] - %cmp1 = icmp slt i32 %1, 2 - br i1 %cmp1, label %land.lhs.true, label %if.end - -land.lhs.true: ; preds = %while.end - %2 = load i32, i32* @b, align 4 - %3 = load i32, i32* @d, align 4 - %cmp2 = icmp eq i32 %2, %3 - br i1 %cmp2, label %return, label %if.end - -if.end: ; preds = %land.lhs.true, %while.end - br label %return - -return: ; preds = %if.end, %land.lhs.true - %retval.0 = phi i32 [ 0, %if.end ], [ 123, %land.lhs.true ] - ret i32 %retval.0 -} - -define i32 @do_nothing_if_compares_can_not_be_adjusted_to_each_other() #0 { -; CHECK-LABEL: do_nothing_if_compares_can_not_be_adjusted_to_each_other -; CHECK: cmp -; CHECK: b.gt -; CHECK: cmn -; CHECK: b.lt -entry: - %0 = load i32, i32* @a, align 4 - %cmp4 = icmp slt i32 %0, 1 - br i1 %cmp4, label %while.body.preheader, label %while.end - -while.body.preheader: ; preds = %entry - br label %while.body - -while.body: ; preds = %while.body, %while.body.preheader - %i.05 = phi i32 [ %inc, %while.body ], [ %0, %while.body.preheader ] - tail call void @do_something() #2 - %inc = add nsw i32 %i.05, 1 - %cmp = icmp slt i32 %i.05, 0 - br i1 %cmp, label %while.body, label %while.end.loopexit - -while.end.loopexit: ; preds = %while.body - br label %while.end - -while.end: ; preds = %while.end.loopexit, %entry - %1 = load i32, i32* @c, align 4 - %cmp1 = icmp sgt i32 %1, -3 - br i1 %cmp1, label %land.lhs.true, label %if.end - -land.lhs.true: ; preds = %while.end - %2 = load i32, i32* @b, align 4 - %3 = load i32, i32* @d, align 4 - %cmp2 = icmp eq i32 %2, %3 - br i1 %cmp2, label %return, label %if.end - -if.end: ; preds = %land.lhs.true, %while.end - br label %return - -return: ; preds = %if.end, %land.lhs.true - %retval.0 = phi i32 [ 0, %if.end ], [ 123, %land.lhs.true ] - ret i32 %retval.0 -} - -; Test in the following case, we don't hit 'cmp' and trigger a false positive -; cmp w19, #0 -; cinc w0, w19, gt -; ... -; fcmp d8, #0.0 -; b.gt .LBB0_5 - -define i32 @fcmpri(i32 %argc, i8** nocapture readonly %argv) { - -; CHECK-LABEL: fcmpri: -; CHECK: cmp w0, #2 -; CHECK: b.lt .LBB9_3 -; CHECK-NOT: cmp w0, #1 -; CHECK-NOT: b.le .LBB9_3 - -; CHECK-LABEL-DAG: .LBB9_3 -; CHECK: cmp w19, #0 -; CHECK: fcmp d8, #0.0 -; CHECK-NOT: cmp w19, #1 -; CHECK-NOT: b.ge .LBB9_5 - -entry: - %cmp = icmp sgt i32 %argc, 1 - br i1 %cmp, label %land.lhs.true, label %if.end - -land.lhs.true: ; preds = %entry - %arrayidx = getelementptr inbounds i8*, i8** %argv, i64 1 - %0 = load i8*, i8** %arrayidx, align 8 - %cmp1 = icmp eq i8* %0, null - br i1 %cmp1, label %if.end, label %return - -if.end: ; preds = %land.lhs.true, %entry - %call = call i32 @zoo(i32 1) - %call2 = call double @yoo(i32 -1) - %cmp4 = icmp sgt i32 %call, 0 - %add = zext i1 %cmp4 to i32 - %cond = add nsw i32 %add, %call - %call7 = call i32 @xoo(i32 %cond, i32 2) - %cmp9 = fcmp ogt double %call2, 0.000000e+00 - br i1 %cmp9, label %cond.end14, label %cond.false12 - -cond.false12: ; preds = %if.end - %sub = fadd fast double %call2, -1.000000e+00 - br label %cond.end14 - -cond.end14: ; preds = %if.end, %cond.false12 - %cond15 = phi double [ %sub, %cond.false12 ], [ %call2, %if.end ] - %call16 = call i32 @woo(double %cond15, double -2.000000e+00) - br label %return - -return: ; preds = %land.lhs.true, %cond.end14 - %retval.0 = phi i32 [ 4, %cond.end14 ], [ 3, %land.lhs.true ] - ret i32 %retval.0 -} - -define void @cmp_shifted(i32 %in, i32 %lhs, i32 %rhs) { -; CHECK-LABEL: cmp_shifted: -; CHECK: cmp w0, #2, lsl #12 -; [...] -; CHECK: cmp w0, #1 - - %tst_low = icmp sgt i32 %in, 8191 - br i1 %tst_low, label %true, label %false - -true: - call i32 @zoo(i32 128) - ret void - -false: - %tst = icmp sgt i32 %in, 0 - br i1 %tst, label %truer, label %falser - -truer: - call i32 @zoo(i32 42) - ret void - -falser: - call i32 @zoo(i32 1) - ret void -} - -define i32 @combine_gt_ge_sel(i64 %v, i64* %p) #0 { -; CHECK-LABEL: combine_gt_ge_sel -; CHECK: ldr [[reg1:w[0-9]*]], -; CHECK: cmp [[reg1]], #0 -; CHECK: csel {{.*}}, gt -entry: - %0 = load i32, i32* @a, align 4 - %cmp = icmp sgt i32 %0, 0 - %m = select i1 %cmp, i64 %v, i64 0 - store i64 %m, i64* %p - br i1 %cmp, label %lor.lhs.false, label %land.lhs.true - -land.lhs.true: ; preds = %entry - %1 = load i32, i32* @b, align 4 - %2 = load i32, i32* @c, align 4 - %cmp1 = icmp eq i32 %1, %2 - br i1 %cmp1, label %return, label %land.lhs.true3 - -lor.lhs.false: ; preds = %entry - %cmp2 = icmp sgt i32 %0, 1 - br i1 %cmp2, label %land.lhs.true3, label %if.end - -land.lhs.true3: ; preds = %lor.lhs.false, %land.lhs.true - %3 = load i32, i32* @b, align 4 - %4 = load i32, i32* @d, align 4 - %cmp4 = icmp eq i32 %3, %4 - br i1 %cmp4, label %return, label %if.end - -if.end: ; preds = %land.lhs.true3, %lor.lhs.false - br label %return - -return: ; preds = %if.end, %land.lhs.true3, %land.lhs.true - %retval.0 = phi i32 [ 0, %if.end ], [ 1, %land.lhs.true3 ], [ 1, %land.lhs.true ] - ret i32 %retval.0 -} - -declare i32 @zoo(i32) - -declare double @yoo(i32) - -declare i32 @xoo(i32, i32) - -declare i32 @woo(double, double) |
