From 6186928e60300cb5a345a598ee4194044ac5c4ae Mon Sep 17 00:00:00 2001 From: luxufan Date: Wed, 21 Dec 2022 00:04:18 +0800 Subject: [PATCH] [CVP] Add baseline tests of abs(lhs) < abs(rhs) in srem --- .../Transforms/CorrelatedValuePropagation/srem.ll | 175 +++++++++++++++++++++ 1 file changed, 175 insertions(+) diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/srem.ll b/llvm/test/Transforms/CorrelatedValuePropagation/srem.ll index dd2e596..5c21756 100644 --- a/llvm/test/Transforms/CorrelatedValuePropagation/srem.ll +++ b/llvm/test/Transforms/CorrelatedValuePropagation/srem.ll @@ -512,3 +512,178 @@ entry: %div = srem i64 %x, %y ret i64 %div } + +define dso_local i8 @abs_x_lt_abs_y_positive(i8 %x, i8 %y) { +; CHECK-LABEL: @abs_x_lt_abs_y_positive( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[X_CMP:%.*]] = icmp slt i8 [[X:%.*]], 10 +; CHECK-NEXT: [[X_CMP2:%.*]] = icmp sgt i8 [[X]], -10 +; CHECK-NEXT: [[AND_X:%.*]] = and i1 [[X_CMP]], [[X_CMP2]] +; CHECK-NEXT: [[Y_CMP:%.*]] = icmp sge i8 [[Y:%.*]], 10 +; CHECK-NEXT: [[AND_COND:%.*]] = and i1 [[AND_X]], [[Y_CMP]] +; CHECK-NEXT: br i1 [[AND_COND]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]] +; CHECK: if.else: +; CHECK-NEXT: [[REM:%.*]] = srem i8 [[X]], [[Y]] +; CHECK-NEXT: ret i8 [[REM]] +; CHECK: if.then: +; CHECK-NEXT: ret i8 0 +; +entry: + %x.cmp = icmp slt i8 %x, 10 + %x.cmp2 = icmp sgt i8 %x, -10 + %and.x = and i1 %x.cmp, %x.cmp2 + %y.cmp = icmp sge i8 %y, 10 + %and.cond = and i1 %and.x, %y.cmp + br i1 %and.cond, label %if.else, label %if.then + +if.else: ; preds = %entry + %rem = srem i8 %x, %y + ret i8 %rem + +if.then: ; preds = %entry, %if.then6, %if.end4 + ret i8 0 +} + +define dso_local i8 @abs_x_lt_abs_y_positive_unsigned_cmp(i8 %x, i8 %y) { +; CHECK-LABEL: @abs_x_lt_abs_y_positive_unsigned_cmp( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[X_CMP:%.*]] = icmp slt i8 [[X:%.*]], 10 +; CHECK-NEXT: [[X_CMP2:%.*]] = icmp sgt i8 [[X]], -10 +; CHECK-NEXT: [[AND_X:%.*]] = and i1 [[X_CMP]], [[X_CMP2]] +; CHECK-NEXT: [[Y_CMP:%.*]] = icmp uge i8 [[Y:%.*]], 10 +; CHECK-NEXT: [[Y_CMP2:%.*]] = icmp ule i8 [[Y]], 20 +; CHECK-NEXT: [[AND_Y:%.*]] = and i1 [[Y_CMP]], [[Y_CMP2]] +; CHECK-NEXT: [[AND_COND:%.*]] = and i1 [[AND_X]], [[AND_Y]] +; CHECK-NEXT: br i1 [[AND_COND]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]] +; CHECK: if.else: +; CHECK-NEXT: [[REM:%.*]] = srem i8 [[X]], [[Y]] +; CHECK-NEXT: ret i8 [[REM]] +; CHECK: if.then: +; CHECK-NEXT: ret i8 0 +; +entry: + %x.cmp = icmp slt i8 %x, 10 + %x.cmp2 = icmp sgt i8 %x, -10 + %and.x = and i1 %x.cmp, %x.cmp2 + %y.cmp = icmp uge i8 %y, 10 + %y.cmp2 = icmp ule i8 %y, 20 + %and.y = and i1 %y.cmp, %y.cmp2 + %and.cond = and i1 %and.x, %and.y + br i1 %and.cond, label %if.else, label %if.then + +if.else: ; preds = %entry + %rem = srem i8 %x, %y + ret i8 %rem + +if.then: ; preds = %entry, %if.then6, %if.end4 + ret i8 0 +} + +define dso_local i8 @abs_x_lt_abs_y_negative(i8 %x, i8 %y) { +; CHECK-LABEL: @abs_x_lt_abs_y_negative( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[X_CMP:%.*]] = icmp slt i8 [[X:%.*]], 10 +; CHECK-NEXT: [[X_CMP2:%.*]] = icmp sgt i8 [[X]], -10 +; CHECK-NEXT: [[AND_X:%.*]] = and i1 [[X_CMP]], [[X_CMP2]] +; CHECK-NEXT: [[Y_CMP:%.*]] = icmp sge i8 [[Y:%.*]], -20 +; CHECK-NEXT: [[Y_CMP2:%.*]] = icmp sle i8 [[Y]], -11 +; CHECK-NEXT: [[AND_Y:%.*]] = and i1 [[Y_CMP]], [[Y_CMP2]] +; CHECK-NEXT: [[AND_COND:%.*]] = and i1 [[AND_X]], [[AND_Y]] +; CHECK-NEXT: br i1 [[AND_COND]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]] +; CHECK: if.else: +; CHECK-NEXT: [[REM:%.*]] = srem i8 [[X]], [[Y]] +; CHECK-NEXT: ret i8 [[REM]] +; CHECK: if.then: +; CHECK-NEXT: ret i8 0 +; +entry: + %x.cmp = icmp slt i8 %x, 10 + %x.cmp2 = icmp sgt i8 %x, -10 + %and.x = and i1 %x.cmp, %x.cmp2 + %y.cmp = icmp sge i8 %y, -20 + %y.cmp2 = icmp sle i8 %y, -11 + %and.y = and i1 %y.cmp, %y.cmp2 + %and.cond = and i1 %and.x, %and.y + br i1 %and.cond, label %if.else, label %if.then + +if.else: ; preds = %entry + %rem = srem i8 %x, %y + ret i8 %rem + +if.then: ; preds = %entry, %if.then6, %if.end4 + ret i8 0 +} + +; Negative test: abs(x) less than or equal abs(y) + +define dso_local i8 @abs_x_lte_abs_y(i8 %x, i8 %y) { +; CHECK-LABEL: @abs_x_lte_abs_y( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[X_CMP:%.*]] = icmp slt i8 [[X:%.*]], 10 +; CHECK-NEXT: [[X_CMP2:%.*]] = icmp sgt i8 [[X]], -10 +; CHECK-NEXT: [[AND_X:%.*]] = and i1 [[X_CMP]], [[X_CMP2]] +; CHECK-NEXT: [[Y_CMP:%.*]] = icmp sge i8 [[Y:%.*]], -20 +; CHECK-NEXT: [[Y_CMP2:%.*]] = icmp sle i8 [[Y]], -9 +; CHECK-NEXT: [[AND_Y:%.*]] = and i1 [[Y_CMP]], [[Y_CMP2]] +; CHECK-NEXT: [[AND_COND:%.*]] = and i1 [[AND_X]], [[AND_Y]] +; CHECK-NEXT: br i1 [[AND_COND]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]] +; CHECK: if.else: +; CHECK-NEXT: [[REM:%.*]] = srem i8 [[X]], [[Y]] +; CHECK-NEXT: ret i8 [[REM]] +; CHECK: if.then: +; CHECK-NEXT: ret i8 0 +; +entry: + %x.cmp = icmp slt i8 %x, 10 + %x.cmp2 = icmp sgt i8 %x, -10 + %and.x = and i1 %x.cmp, %x.cmp2 + %y.cmp = icmp sge i8 %y, -20 + %y.cmp2 = icmp sle i8 %y, -9 + %and.y = and i1 %y.cmp, %y.cmp2 + %and.cond = and i1 %and.x, %and.y + br i1 %and.cond, label %if.else, label %if.then + +if.else: ; preds = %entry + %rem = srem i8 %x, %y + ret i8 %rem + +if.then: ; preds = %entry, %if.then6, %if.end4 + ret i8 0 +} + +; Negative test: abs(x) has unknown predication with abs(y) + +define dso_local i8 @abs_x_unknown_abs_y(i8 %x, i8 %y) { +; CHECK-LABEL: @abs_x_unknown_abs_y( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[X_CMP:%.*]] = icmp slt i8 [[X:%.*]], 10 +; CHECK-NEXT: [[X_CMP2:%.*]] = icmp sgt i8 [[X]], -10 +; CHECK-NEXT: [[AND_X:%.*]] = and i1 [[X_CMP]], [[X_CMP2]] +; CHECK-NEXT: [[Y_CMP:%.*]] = icmp sge i8 [[Y:%.*]], -20 +; CHECK-NEXT: [[Y_CMP2:%.*]] = icmp sle i8 [[Y]], -9 +; CHECK-NEXT: [[AND_Y:%.*]] = and i1 [[Y_CMP]], [[Y_CMP2]] +; CHECK-NEXT: [[AND_COND:%.*]] = and i1 [[AND_X]], [[AND_Y]] +; CHECK-NEXT: br i1 [[AND_COND]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]] +; CHECK: if.else: +; CHECK-NEXT: [[REM:%.*]] = srem i8 [[X]], [[Y]] +; CHECK-NEXT: ret i8 [[REM]] +; CHECK: if.then: +; CHECK-NEXT: ret i8 0 +; +entry: + %x.cmp = icmp slt i8 %x, 10 + %x.cmp2 = icmp sgt i8 %x, -10 + %and.x = and i1 %x.cmp, %x.cmp2 + %y.cmp = icmp sge i8 %y, -20 + %y.cmp2 = icmp sle i8 %y, -9 + %and.y = and i1 %y.cmp, %y.cmp2 + %and.cond = and i1 %and.x, %and.y + br i1 %and.cond, label %if.else, label %if.then + +if.else: ; preds = %entry + %rem = srem i8 %x, %y + ret i8 %rem + +if.then: ; preds = %entry, %if.then6, %if.end4 + ret i8 0 +} -- 2.7.4