#endif
 
+static inline bool slice_addr_is_low(unsigned long addr)
+{
+       u64 tmp = (u64)addr;
+
+       return tmp < SLICE_LOW_TOP;
+}
+
 static void slice_range_to_mask(unsigned long start, unsigned long len,
                                struct slice_mask *ret)
 {
        if (SLICE_NUM_HIGH)
                bitmap_zero(ret->high_slices, SLICE_NUM_HIGH);
 
-       if (start < SLICE_LOW_TOP) {
+       if (slice_addr_is_low(start)) {
                unsigned long mend = min(end,
                                         (unsigned long)(SLICE_LOW_TOP - 1));
 
                        - (1u << GET_LOW_SLICE_INDEX(start));
        }
 
-       if ((start + len) > SLICE_LOW_TOP) {
+       if (SLICE_NUM_HIGH && !slice_addr_is_low(end)) {
                unsigned long start_index = GET_HIGH_SLICE_INDEX(start);
                unsigned long align_end = ALIGN(end, (1UL << SLICE_HIGH_SHIFT));
                unsigned long count = GET_HIGH_SLICE_INDEX(align_end) - start_index;
                if (!slice_low_has_vma(mm, i))
                        ret->low_slices |= 1u << i;
 
-       if (high_limit <= SLICE_LOW_TOP)
+       if (slice_addr_is_low(high_limit - 1))
                return;
 
        for (i = 0; i < GET_HIGH_SLICE_INDEX(high_limit); i++)
        unsigned long end = start + len - 1;
        u64 low_slices = 0;
 
-       if (start < SLICE_LOW_TOP) {
+       if (slice_addr_is_low(start)) {
                unsigned long mend = min(end,
                                         (unsigned long)(SLICE_LOW_TOP - 1));
 
        if ((low_slices & available->low_slices) != low_slices)
                return false;
 
-       if (SLICE_NUM_HIGH && ((start + len) > SLICE_LOW_TOP)) {
+       if (SLICE_NUM_HIGH && !slice_addr_is_low(end)) {
                unsigned long start_index = GET_HIGH_SLICE_INDEX(start);
                unsigned long align_end = ALIGN(end, (1UL << SLICE_HIGH_SHIFT));
                unsigned long count = GET_HIGH_SLICE_INDEX(align_end) - start_index;
                                 int end, unsigned long *boundary_addr)
 {
        unsigned long slice;
-       if (addr < SLICE_LOW_TOP) {
+       if (slice_addr_is_low(addr)) {
                slice = GET_LOW_SLICE_INDEX(addr);
                *boundary_addr = (slice + end) << SLICE_LOW_SHIFT;
                return !!(available->low_slices & (1u << slice));
 
        VM_BUG_ON(radix_enabled());
 
-       if (addr < SLICE_LOW_TOP) {
+       if (slice_addr_is_low(addr)) {
                psizes = mm->context.low_slices_psize;
                index = GET_LOW_SLICE_INDEX(addr);
        } else {