xref: /llvm-project/llvm/test/Transforms/SCCP/range-mul-nuw-nsw-flags.ll (revision e897b0bbe908ea17188f0b1ed96e6b6c8f8954d8)
1*e897b0bbSAntonio Frighetto; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*e897b0bbSAntonio Frighetto; RUN: opt -passes=ipsccp -S %s | FileCheck %s
3*e897b0bbSAntonio Frighetto
4*e897b0bbSAntonio Frighettodefine i1 @range_from_mul_nuw_nsw(i32 %a) {
5*e897b0bbSAntonio Frighetto; CHECK-LABEL: @range_from_mul_nuw_nsw(
6*e897b0bbSAntonio Frighetto; CHECK-NEXT:  entry:
7*e897b0bbSAntonio Frighetto; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[A:%.*]], 0
8*e897b0bbSAntonio Frighetto; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
9*e897b0bbSAntonio Frighetto; CHECK:       then:
10*e897b0bbSAntonio Frighetto; CHECK-NEXT:    [[MUL:%.*]] = mul nuw nsw i32 [[A]], 10000
11*e897b0bbSAntonio Frighetto; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[MUL]], -5000
12*e897b0bbSAntonio Frighetto; CHECK-NEXT:    ret i1 false
13*e897b0bbSAntonio Frighetto; CHECK:       else:
14*e897b0bbSAntonio Frighetto; CHECK-NEXT:    ret i1 false
15*e897b0bbSAntonio Frighetto;
16*e897b0bbSAntonio Frighettoentry:
17*e897b0bbSAntonio Frighetto  %cmp = icmp ne i32 %a, 0
18*e897b0bbSAntonio Frighetto  br i1 %cmp, label %then, label %else
19*e897b0bbSAntonio Frighettothen:
20*e897b0bbSAntonio Frighetto  %mul = mul nuw nsw i32 %a, 10000 ; Refined range via mul_nuw: [10000, 0)
21*e897b0bbSAntonio Frighetto  %add = add nsw i32 %mul, -5000   ; Range: [5000, UINT_MAX - 5000 + 1)
22*e897b0bbSAntonio Frighetto  %cond = icmp ult i32 %add, 4999
23*e897b0bbSAntonio Frighetto  ret i1 %cond
24*e897b0bbSAntonio Frighettoelse:
25*e897b0bbSAntonio Frighetto  ret i1 0
26*e897b0bbSAntonio Frighetto}
27