; 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 }