1; RUN: opt -S -disable-output -passes="print<demanded-bits>" < %s 2>&1 | FileCheck %s 2 3; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_bswap': 4; CHECK-DAG: DemandedBits: 0xff000000 for %1 = or i32 %x, 1 5; CHECK-DAG: DemandedBits: 0xff for %2 = call i32 @llvm.bswap.i32(i32 %1) 6; CHECK-DAG: DemandedBits: 0xff for %3 = trunc i32 %2 to i8 7define i8 @test_bswap(i32 %x) { 8 %1 = or i32 %x, 1 9 %2 = call i32 @llvm.bswap.i32(i32 %1) 10 %3 = trunc i32 %2 to i8 11 ret i8 %3 12} 13declare i32 @llvm.bswap.i32(i32) 14 15; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_bitreverse': 16; CHECK-DAG: DemandedBits: 0xff000000 for %1 = or i32 %x, 1 17; CHECK-DAG: DemandedBits: 0xff for %2 = call i32 @llvm.bitreverse.i32(i32 %1) 18; CHECK-DAG: DemandedBits: 0xff for %3 = trunc i32 %2 to i8 19define i8 @test_bitreverse(i32 %x) { 20 %1 = or i32 %x, 1 21 %2 = call i32 @llvm.bitreverse.i32(i32 %1) 22 %3 = trunc i32 %2 to i8 23 ret i8 %3 24} 25declare i32 @llvm.bitreverse.i32(i32) 26 27; Funnel shifts 28declare i32 @llvm.fshl.i32(i32, i32, i32) 29declare i33 @llvm.fshr.i33(i33, i33, i33) 30 31; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_fshl': 32; CHECK-DAG: DemandedBits: 0xff for %x2 = or i32 %x, 1 33; CHECK-DAG: DemandedBits: 0xff000000 for %y2 = or i32 %y, 1 34; CHECK-DAG: DemandedBits: 0xffff for %z = call i32 @llvm.fshl.i32(i32 %x2, i32 %y2, i32 8) 35; CHECK-DAG: DemandedBits: 0xffffffff for %r = and i32 %z, 65535 36define i32 @test_fshl(i32 %x, i32 %y) { 37 %x2 = or i32 %x, 1 38 %y2 = or i32 %y, 1 39 %z = call i32 @llvm.fshl.i32(i32 %x2, i32 %y2, i32 8) 40 %r = and i32 %z, 65535 41 ret i32 %r 42} 43 44; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_fshr': 45; CHECK-DAG: DemandedBits: 0xff for %x2 = or i33 %x, 1 46; CHECK-DAG: DemandedBits: 0x1fe000000 for %y2 = or i33 %y, 1 47; CHECK-DAG: DemandedBits: 0xffff for %z = call i33 @llvm.fshr.i33(i33 %x2, i33 %y2, i33 25) 48; CHECK-DAG: DemandedBits: 0x1ffffffff for %r = and i33 %z, 65535 49define i33 @test_fshr(i33 %x, i33 %y) { 50 %x2 = or i33 %x, 1 51 %y2 = or i33 %y, 1 52 %z = call i33 @llvm.fshr.i33(i33 %x2, i33 %y2, i33 25) 53 %r = and i33 %z, 65535 54 ret i33 %r 55} 56 57; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_fshl_zero_shift': 58; CHECK-DAG: DemandedBits: 0xffff for %x2 = or i32 %x, 1 59; CHECK-DAG: DemandedBits: 0x0 for %y2 = or i32 %y, 1 60; CHECK-DAG: DemandedBits: 0xffff for %z = call i32 @llvm.fshl.i32(i32 %x2, i32 %y2, i32 0) 61; CHECK-DAG: DemandedBits: 0xffffffff for %r = and i32 %z, 65535 62define i32 @test_fshl_zero_shift(i32 %x, i32 %y) { 63 %x2 = or i32 %x, 1 64 %y2 = or i32 %y, 1 65 %z = call i32 @llvm.fshl.i32(i32 %x2, i32 %y2, i32 0) 66 %r = and i32 %z, 65535 67 ret i32 %r 68} 69 70; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_fshr_full_shift': 71; CHECK-DAG: DemandedBits: 0x0 for %x2 = or i33 %x, 1 72; CHECK-DAG: DemandedBits: 0xffff for %y2 = or i33 %y, 1 73; CHECK-DAG: DemandedBits: 0xffff for %z = call i33 @llvm.fshr.i33(i33 %x2, i33 %y2, i33 33) 74; CHECK-DAG: DemandedBits: 0x1ffffffff for %r = and i33 %z, 65535 75define i33 @test_fshr_full_shift(i33 %x, i33 %y) { 76 %x2 = or i33 %x, 1 77 %y2 = or i33 %y, 1 78 %z = call i33 @llvm.fshr.i33(i33 %x2, i33 %y2, i33 33) 79 %r = and i33 %z, 65535 80 ret i33 %r 81} 82 83; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_fshl_pow2_bitwidth': 84; CHECK-DAG: DemandedBits: 0xffffffff for %x2 = or i32 %x, 1 85; CHECK-DAG: DemandedBits: 0xffffffff for %y2 = or i32 %y, 1 86; CHECK-DAG: DemandedBits: 0x1f for %z2 = or i32 %z, 1 87; CHECK-DAG: DemandedBits: 0xffff for %f = call i32 @llvm.fshl.i32(i32 %x2, i32 %y2, i32 %z2) 88; CHECK-DAG: DemandedBits: 0xffffffff for %r = and i32 %f, 65535 89define i32 @test_fshl_pow2_bitwidth(i32 %x, i32 %y, i32 %z) { 90 %x2 = or i32 %x, 1 91 %y2 = or i32 %y, 1 92 %z2 = or i32 %z, 1 93 %f = call i32 @llvm.fshl.i32(i32 %x2, i32 %y2, i32 %z2) 94 %r = and i32 %f, 65535 95 ret i32 %r 96} 97 98; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_fshr_non_pow2_bitwidth': 99; CHECK-DAG: DemandedBits: 0x1ffffffff for %x2 = or i33 %x, 1 100; CHECK-DAG: DemandedBits: 0x1ffffffff for %y2 = or i33 %y, 1 101; CHECK-DAG: DemandedBits: 0x1ffffffff for %z2 = or i33 %z, 1 102; CHECK-DAG: DemandedBits: 0xffff for %f = call i33 @llvm.fshr.i33(i33 %x2, i33 %y2, i33 %z2) 103; CHECK-DAG: DemandedBits: 0x1ffffffff for %r = and i33 %f, 65535 104define i33 @test_fshr_non_pow2_bitwidth(i33 %x, i33 %y, i33 %z) { 105 %x2 = or i33 %x, 1 106 %y2 = or i33 %y, 1 107 %z2 = or i33 %z, 1 108 %f = call i33 @llvm.fshr.i33(i33 %x2, i33 %y2, i33 %z2) 109 %r = and i33 %f, 65535 110 ret i33 %r 111} 112