blob: fbd5cb6d139cf687d08eddaa5242cb23b127130d [file] [log] [blame] [edit]
; RUN: opt < %s -instcombine -S | FileCheck %s
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.10.0"
define zeroext i8 @f_u8(i8 zeroext %a) {
; CHECK-LABEL: @f_u8
; CHECK-NEXT: %[[A:.*]] = call i8 @llvm.bitreverse.i8(i8 %a)
; CHECK-NEXT: ret i8 %[[A]]
%1 = shl i8 %a, 7
%2 = shl i8 %a, 5
%3 = and i8 %2, 64
%4 = shl i8 %a, 3
%5 = and i8 %4, 32
%6 = shl i8 %a, 1
%7 = and i8 %6, 16
%8 = lshr i8 %a, 1
%9 = and i8 %8, 8
%10 = lshr i8 %a, 3
%11 = and i8 %10, 4
%12 = lshr i8 %a, 5
%13 = and i8 %12, 2
%14 = lshr i8 %a, 7
%15 = or i8 %14, %1
%16 = or i8 %15, %3
%17 = or i8 %16, %5
%18 = or i8 %17, %7
%19 = or i8 %18, %9
%20 = or i8 %19, %11
%21 = or i8 %20, %13
ret i8 %21
}
; The ANDs with 32 and 64 have been swapped here, so the sequence does not
; completely match a bitreverse.
define zeroext i8 @f_u8_fail(i8 zeroext %a) {
; CHECK-LABEL: @f_u8_fail
; CHECK-NOT: call
; CHECK: ret i8
%1 = shl i8 %a, 7
%2 = shl i8 %a, 5
%3 = and i8 %2, 32
%4 = shl i8 %a, 3
%5 = and i8 %4, 64
%6 = shl i8 %a, 1
%7 = and i8 %6, 16
%8 = lshr i8 %a, 1
%9 = and i8 %8, 8
%10 = lshr i8 %a, 3
%11 = and i8 %10, 4
%12 = lshr i8 %a, 5
%13 = and i8 %12, 2
%14 = lshr i8 %a, 7
%15 = or i8 %14, %1
%16 = or i8 %15, %3
%17 = or i8 %16, %5
%18 = or i8 %17, %7
%19 = or i8 %18, %9
%20 = or i8 %19, %11
%21 = or i8 %20, %13
ret i8 %21
}
define zeroext i16 @f_u16(i16 zeroext %a) {
; CHECK-LABEL: @f_u16
; CHECK-NEXT: %[[A:.*]] = call i16 @llvm.bitreverse.i16(i16 %a)
; CHECK-NEXT: ret i16 %[[A]]
%1 = shl i16 %a, 15
%2 = shl i16 %a, 13
%3 = and i16 %2, 16384
%4 = shl i16 %a, 11
%5 = and i16 %4, 8192
%6 = shl i16 %a, 9
%7 = and i16 %6, 4096
%8 = shl i16 %a, 7
%9 = and i16 %8, 2048
%10 = shl i16 %a, 5
%11 = and i16 %10, 1024
%12 = shl i16 %a, 3
%13 = and i16 %12, 512
%14 = shl i16 %a, 1
%15 = and i16 %14, 256
%16 = lshr i16 %a, 1
%17 = and i16 %16, 128
%18 = lshr i16 %a, 3
%19 = and i16 %18, 64
%20 = lshr i16 %a, 5
%21 = and i16 %20, 32
%22 = lshr i16 %a, 7
%23 = and i16 %22, 16
%24 = lshr i16 %a, 9
%25 = and i16 %24, 8
%26 = lshr i16 %a, 11
%27 = and i16 %26, 4
%28 = lshr i16 %a, 13
%29 = and i16 %28, 2
%30 = lshr i16 %a, 15
%31 = or i16 %30, %1
%32 = or i16 %31, %3
%33 = or i16 %32, %5
%34 = or i16 %33, %7
%35 = or i16 %34, %9
%36 = or i16 %35, %11
%37 = or i16 %36, %13
%38 = or i16 %37, %15
%39 = or i16 %38, %17
%40 = or i16 %39, %19
%41 = or i16 %40, %21
%42 = or i16 %41, %23
%43 = or i16 %42, %25
%44 = or i16 %43, %27
%45 = or i16 %44, %29
ret i16 %45
}