1e0dd708fSSimon Pilgrim; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2e0dd708fSSimon Pilgrim; RUN: opt < %s -loop-unroll -codegenprepare -S -mtriple=x86_64-- -mattr=+xop | FileCheck %s 3e0dd708fSSimon Pilgrim 4e0dd708fSSimon Pilgrimdefine i32 @bitreverse_i32(i32 %a) { 5e0dd708fSSimon Pilgrim; CHECK-LABEL: @bitreverse_i32( 6e0dd708fSSimon Pilgrim; CHECK-NEXT: entry: 7e0dd708fSSimon Pilgrim; CHECK-NEXT: [[REV:%.*]] = call i32 @llvm.bitreverse.i32(i32 [[A:%.*]]) 8e0dd708fSSimon Pilgrim; CHECK-NEXT: ret i32 [[REV]] 9e0dd708fSSimon Pilgrim; 10e0dd708fSSimon Pilgrimentry: 11e0dd708fSSimon Pilgrim br label %for.body 12e0dd708fSSimon Pilgrim 13e0dd708fSSimon Pilgrimfor.cond.cleanup: ; preds = %for.body 14e0dd708fSSimon Pilgrim ret i32 %or 15e0dd708fSSimon Pilgrim 16e0dd708fSSimon Pilgrimfor.body: ; preds = %for.body, %entry 17e0dd708fSSimon Pilgrim %i.08 = phi i32 [ 0, %entry ], [ %inc, %for.body ] 18e0dd708fSSimon Pilgrim %b.07 = phi i32 [ 0, %entry ], [ %or, %for.body ] 19e0dd708fSSimon Pilgrim %shr = lshr i32 %a, %i.08 20e0dd708fSSimon Pilgrim %and = and i32 %shr, 1 21e0dd708fSSimon Pilgrim %sub = sub nuw nsw i32 31, %i.08 22e0dd708fSSimon Pilgrim %shl = shl i32 %and, %sub 23e0dd708fSSimon Pilgrim %or = or i32 %shl, %b.07 24e0dd708fSSimon Pilgrim %inc = add nuw nsw i32 %i.08, 1 25e0dd708fSSimon Pilgrim %exitcond = icmp eq i32 %inc, 32 26e0dd708fSSimon Pilgrim br i1 %exitcond, label %for.cond.cleanup, label %for.body, !llvm.loop !3 27e0dd708fSSimon Pilgrim} 28e0dd708fSSimon Pilgrim 29e0dd708fSSimon Pilgrim; PR40058 30e0dd708fSSimon Pilgrimdefine i64 @bitreverse_i64(i64 %0) { 31e0dd708fSSimon Pilgrim; CHECK-LABEL: @bitreverse_i64( 32*2bb41851SSimon Pilgrim; CHECK-NEXT: [[REV:%.*]] = call i64 @llvm.bitreverse.i64(i64 [[TMP0:%.*]]) 33*2bb41851SSimon Pilgrim; CHECK-NEXT: ret i64 [[REV]] 34e0dd708fSSimon Pilgrim; 35e0dd708fSSimon Pilgrim %2 = lshr i64 %0, 1 36e0dd708fSSimon Pilgrim %3 = and i64 %2, 6148914691236517205 37e0dd708fSSimon Pilgrim %4 = shl i64 %0, 1 38e0dd708fSSimon Pilgrim %5 = and i64 %4, -6148914691236517206 39e0dd708fSSimon Pilgrim %6 = or i64 %3, %5 40e0dd708fSSimon Pilgrim %7 = lshr i64 %6, 2 41e0dd708fSSimon Pilgrim %8 = and i64 %7, 3689348814741910323 42e0dd708fSSimon Pilgrim %9 = shl i64 %6, 2 43e0dd708fSSimon Pilgrim %10 = and i64 %9, -3689348814741910324 44e0dd708fSSimon Pilgrim %11 = or i64 %8, %10 45e0dd708fSSimon Pilgrim %12 = lshr i64 %11, 4 46e0dd708fSSimon Pilgrim %13 = and i64 %12, 1085102592571150095 47e0dd708fSSimon Pilgrim %14 = shl i64 %11, 4 48e0dd708fSSimon Pilgrim %15 = and i64 %14, -1085102592571150096 49e0dd708fSSimon Pilgrim %16 = or i64 %13, %15 50e0dd708fSSimon Pilgrim %17 = lshr i64 %16, 8 51e0dd708fSSimon Pilgrim %18 = and i64 %17, 71777214294589695 52e0dd708fSSimon Pilgrim %19 = shl i64 %16, 8 53e0dd708fSSimon Pilgrim %20 = and i64 %19, -71777214294589696 54e0dd708fSSimon Pilgrim %21 = or i64 %18, %20 55e0dd708fSSimon Pilgrim %22 = lshr i64 %21, 16 56e0dd708fSSimon Pilgrim %23 = and i64 %22, 281470681808895 57e0dd708fSSimon Pilgrim %24 = shl i64 %21, 16 58e0dd708fSSimon Pilgrim %25 = and i64 %24, -281470681808896 59e0dd708fSSimon Pilgrim %26 = or i64 %23, %25 60e0dd708fSSimon Pilgrim %27 = tail call i64 @llvm.fshl.i64(i64 %26, i64 %26, i64 32) 61e0dd708fSSimon Pilgrim ret i64 %27 62e0dd708fSSimon Pilgrim} 63e0dd708fSSimon Pilgrimdeclare i64 @llvm.fshl.i64(i64, i64, i64) 64e0dd708fSSimon Pilgrim 65e0dd708fSSimon Pilgrim!llvm.module.flags = !{!0, !1} 66e0dd708fSSimon Pilgrim!llvm.ident = !{!2} 67e0dd708fSSimon Pilgrim 68e0dd708fSSimon Pilgrim!0 = !{i32 1, !"wchar_size", i32 4} 69e0dd708fSSimon Pilgrim!1 = !{i32 1, !"min_enum_size", i32 4} 70e0dd708fSSimon Pilgrim!2 = !{!"clang version 3.8.0"} 71e0dd708fSSimon Pilgrim!3 = distinct !{!3, !4} 72e0dd708fSSimon Pilgrim!4 = !{!"llvm.loop.unroll.full"} 73