Skip to content

Commit

Permalink
[CVP] Add baseline tests of abs(lhs) < abs(rhs) in srem
Browse files Browse the repository at this point in the history
  • Loading branch information
luxufan committed Jan 3, 2023
1 parent 6fed2c9 commit 6186928
Showing 1 changed file with 175 additions and 0 deletions.
175 changes: 175 additions & 0 deletions llvm/test/Transforms/CorrelatedValuePropagation/srem.ll
Expand Up @@ -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
}

0 comments on commit 6186928

Please sign in to comment.