Skip to content

Commit

Permalink
[ValueTracking] Add tests for computing knownbits from `(icmp upred (…
Browse files Browse the repository at this point in the history
…add/sub nuw X, Y), C)`; NFC
  • Loading branch information
goldsteinn committed May 16, 2024
1 parent 525bd66 commit 80a0a06
Showing 1 changed file with 276 additions and 0 deletions.
276 changes: 276 additions & 0 deletions llvm/test/Transforms/InstCombine/known-bits.ll
Original file line number Diff line number Diff line change
Expand Up @@ -1698,5 +1698,281 @@ define i32 @test_none(float nofpclass(all) %x) {
ret i32 %and
}

define i8 @test_icmp_add(i8 %n, i8 %n2, i8 %other) {
; CHECK-LABEL: @test_icmp_add(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[N_ADD:%.*]] = add nuw i8 [[N:%.*]], [[N2:%.*]]
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[N_ADD]], 32
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
; CHECK: if.then:
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
; CHECK-NEXT: ret i8 [[R]]
; CHECK: if.else:
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
;
entry:
%n_add = add nuw i8 %n, %n2
%cmp = icmp ult i8 %n_add, 32
br i1 %cmp, label %if.then, label %if.else

if.then:
%r = and i8 %n, 32
ret i8 %r

if.else:
ret i8 %other
}

define i8 @test_icmp_add_fail_nsw(i8 %n, i8 %n2, i8 %other) {
; CHECK-LABEL: @test_icmp_add_fail_nsw(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[N_ADD:%.*]] = add nsw i8 [[N:%.*]], [[N2:%.*]]
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[N_ADD]], 32
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
; CHECK: if.then:
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
; CHECK-NEXT: ret i8 [[R]]
; CHECK: if.else:
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
;
entry:
%n_add = add nsw i8 %n, %n2
%cmp = icmp ult i8 %n_add, 32
br i1 %cmp, label %if.then, label %if.else

if.then:
%r = and i8 %n, 32
ret i8 %r

if.else:
ret i8 %other
}

define i8 @test_icmp_add2(i8 %n, i8 %n2, i8 %other) {
; CHECK-LABEL: @test_icmp_add2(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[N_ADD:%.*]] = add nuw nsw i8 [[N:%.*]], [[N2:%.*]]
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_ADD]], 14
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
; CHECK: if.then:
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
; CHECK: if.else:
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
; CHECK-NEXT: ret i8 [[R]]
;
entry:
%n_add = add nsw nuw i8 %n, %n2
%cmp = icmp uge i8 %n_add, 15
br i1 %cmp, label %if.then, label %if.else

if.then:
ret i8 %other
if.else:
%r = and i8 %n, 32
ret i8 %r

}

define i8 @test_icmp_add_fail_bad_range(i8 %n, i8 %n2, i8 %other) {
; CHECK-LABEL: @test_icmp_add_fail_bad_range(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[N_ADD:%.*]] = add nuw i8 [[N:%.*]], [[N2:%.*]]
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[N_ADD]], 33
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
; CHECK: if.then:
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
; CHECK-NEXT: ret i8 [[R]]
; CHECK: if.else:
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
;
entry:
%n_add = add nuw i8 %n, %n2
%cmp = icmp ule i8 %n_add, 32
br i1 %cmp, label %if.then, label %if.else

if.then:
%r = and i8 %n, 32
ret i8 %r

if.else:
ret i8 %other
}

define i8 @test_icmp_add_fail_bad_pred(i8 %n, i8 %n2, i8 %other) {
; CHECK-LABEL: @test_icmp_add_fail_bad_pred(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[N_ADD:%.*]] = add nuw i8 [[N:%.*]], [[N2:%.*]]
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_ADD]], 32
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
; CHECK: if.then:
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
; CHECK-NEXT: ret i8 [[R]]
; CHECK: if.else:
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
;
entry:
%n_add = add nuw i8 %n, %n2
%cmp = icmp ugt i8 %n_add, 32
br i1 %cmp, label %if.then, label %if.else

if.then:
%r = and i8 %n, 32
ret i8 %r

if.else:
ret i8 %other
}

define i8 @test_icmp_sub(i8 %n, i8 %n2, i8 %other) {
; CHECK-LABEL: @test_icmp_sub(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[N_SUB:%.*]] = sub nuw i8 [[N:%.*]], [[N2:%.*]]
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_SUB]], -33
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
; CHECK: if.then:
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
; CHECK-NEXT: ret i8 [[R]]
; CHECK: if.else:
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
;
entry:
%n_sub = sub nuw i8 %n, %n2
%cmp = icmp ugt i8 %n_sub, 223
br i1 %cmp, label %if.then, label %if.else

if.then:
%r = and i8 %n, 32
ret i8 %r

if.else:
ret i8 %other
}

define i8 @test_icmp_sub_fail_wrong_arg(i8 %n, i8 %n2, i8 %other) {
; CHECK-LABEL: @test_icmp_sub_fail_wrong_arg(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[N_SUB:%.*]] = sub nuw i8 [[N:%.*]], [[N2:%.*]]
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_SUB]], -33
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
; CHECK: if.then:
; CHECK-NEXT: [[R:%.*]] = and i8 [[N2]], 32
; CHECK-NEXT: ret i8 [[R]]
; CHECK: if.else:
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
;
entry:
%n_sub = sub nuw i8 %n, %n2
%cmp = icmp ugt i8 %n_sub, 223
br i1 %cmp, label %if.then, label %if.else

if.then:
%r = and i8 %n2, 32
ret i8 %r

if.else:
ret i8 %other
}

define i8 @test_icmp_sub2(i8 %n, i8 %n2, i8 %other) {
; CHECK-LABEL: @test_icmp_sub2(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[N_SUB:%.*]] = sub nuw i8 [[N:%.*]], [[N2:%.*]]
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[N_SUB]], -31
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
; CHECK: if.then:
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
; CHECK: if.else:
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
; CHECK-NEXT: ret i8 [[R]]
;
entry:
%n_sub = sub nuw i8 %n, %n2
%cmp = icmp ule i8 %n_sub, 224
br i1 %cmp, label %if.then, label %if.else

if.then:
ret i8 %other
if.else:
%r = and i8 %n, 32
ret i8 %r

}

define i8 @test_icmp_sub2_fail_nsw(i8 %n, i8 %n2, i8 %other) {
; CHECK-LABEL: @test_icmp_sub2_fail_nsw(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[N_SUB:%.*]] = sub nsw i8 [[N:%.*]], [[N2:%.*]]
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[N_SUB]], -31
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
; CHECK: if.then:
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
; CHECK: if.else:
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
; CHECK-NEXT: ret i8 [[R]]
;
entry:
%n_sub = sub nsw i8 %n, %n2
%cmp = icmp ule i8 %n_sub, 224
br i1 %cmp, label %if.then, label %if.else

if.then:
ret i8 %other
if.else:
%r = and i8 %n, 32
ret i8 %r

}


define i8 @test_icmp_sub_fail_bad_range(i8 %n, i8 %n2, i8 %other) {
; CHECK-LABEL: @test_icmp_sub_fail_bad_range(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[N_SUB:%.*]] = sub nuw i8 [[N:%.*]], [[N2:%.*]]
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_SUB]], -34
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
; CHECK: if.then:
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
; CHECK-NEXT: ret i8 [[R]]
; CHECK: if.else:
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
;
entry:
%n_sub = sub nuw i8 %n, %n2
%cmp = icmp uge i8 %n_sub, 223
br i1 %cmp, label %if.then, label %if.else

if.then:
%r = and i8 %n, 32
ret i8 %r

if.else:
ret i8 %other
}

define i8 @test_icmp_sub_fail_bad_pred(i8 %n, i8 %n2, i8 %other) {
; CHECK-LABEL: @test_icmp_sub_fail_bad_pred(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[N_SUB:%.*]] = sub nuw i8 [[N:%.*]], [[N2:%.*]]
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[N_SUB]], 31
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
; CHECK: if.then:
; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
; CHECK-NEXT: ret i8 [[R]]
; CHECK: if.else:
; CHECK-NEXT: ret i8 [[OTHER:%.*]]
;
entry:
%n_sub = sub nuw i8 %n, %n2
%cmp = icmp sge i8 %n_sub, 32
br i1 %cmp, label %if.then, label %if.else

if.then:
%r = and i8 %n, 32
ret i8 %r

if.else:
ret i8 %other
}

declare void @use(i1)
declare void @sink(i8)

0 comments on commit 80a0a06

Please sign in to comment.