1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-25 05:52:53 +02:00
llvm-mirror/test/Transforms/InstCombine/bitreverse-recognize.ll
James Molloy d8003c7bf6 [InstCombine] Make MatchBSwap also match bit reversals
MatchBSwap has most of the functionality to match bit reversals already. If we switch it from looking at bytes to individual bits and remove a few early exits, we can extend the main recursive function to match any sequence of ORs, ANDs and shifts that assemble a value from different parts of another, base value. Once we have this bit->bit mapping, we can very simply detect if it is appropriate for a bswap or bitreverse.

llvm-svn: 255334
2015-12-11 10:04:51 +00:00

114 lines
2.6 KiB
LLVM

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