xref: /llvm-project/llvm/test/Transforms/SCCP/pr79696.ll (revision d9e92765c5f9b0fa7adafa769dd13d37b6bca038)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2; RUN: opt < %s -passes=ipsccp -S | FileCheck %s
3
4; Tests from PR79696
5
6define i1 @constant_range_xor(i64 %a) {
7; CHECK-LABEL: define i1 @constant_range_xor(
8; CHECK-SAME: i64 [[A:%.*]]) {
9; CHECK-NEXT:  entry:
10; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i64 [[A]], 8192
11; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
12; CHECK:       then:
13; CHECK-NEXT:    [[CTLZ:%.*]] = call i64 @llvm.ctlz.i64(i64 [[A]], i1 true)
14; CHECK-NEXT:    [[CONV:%.*]] = xor i64 [[CTLZ]], 63
15; CHECK-NEXT:    ret i1 false
16; CHECK:       else:
17; CHECK-NEXT:    ret i1 false
18;
19entry:
20  %cmp = icmp ugt i64 %a, 8192
21  br i1 %cmp, label %then, label %else
22then:
23  %ctlz = call i64 @llvm.ctlz.i64(i64 %a, i1 true) ;[0, 50]
24  %conv = xor i64 %ctlz, 63                        ;[13, 63]
25  %cmp1 = icmp ult i64 %conv, 13
26  ret i1 %cmp1
27else:
28  ret i1 false
29}
30
31define i1 @constant_range_xor_negative(i64 %a) {
32; CHECK-LABEL: define i1 @constant_range_xor_negative(
33; CHECK-SAME: i64 [[A:%.*]]) {
34; CHECK-NEXT:  entry:
35; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i64 [[A]], 8192
36; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
37; CHECK:       then:
38; CHECK-NEXT:    [[CTLZ:%.*]] = call i64 @llvm.ctlz.i64(i64 [[A]], i1 true)
39; CHECK-NEXT:    [[CONV:%.*]] = xor i64 [[CTLZ]], 62
40; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i64 [[CONV]], 13
41; CHECK-NEXT:    ret i1 [[CMP1]]
42; CHECK:       else:
43; CHECK-NEXT:    ret i1 false
44;
45entry:
46  %cmp = icmp ugt i64 %a, 8192
47  br i1 %cmp, label %then, label %else
48then:
49  %ctlz = call i64 @llvm.ctlz.i64(i64 %a, i1 true) ;[0, 50]
50  %conv = xor i64 %ctlz, 62                        ;[12, 63]
51  %cmp1 = icmp ult i64 %conv, 13
52  ret i1 %cmp1
53else:
54  ret i1 false
55}
56