diff --git a/llvm/test/Transforms/InstCombine/known-bits.ll b/llvm/test/Transforms/InstCombine/known-bits.ll index cb404c0b7f889f..c00bdb78709539 100644 --- a/llvm/test/Transforms/InstCombine/known-bits.ll +++ b/llvm/test/Transforms/InstCombine/known-bits.ll @@ -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)