59 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -S -passes=instcombine | FileCheck %s3 4declare i8 @llvm.bitreverse.i8(i8)5declare i32 @llvm.bitreverse.i32(i32)6 7define i1 @test1(i32 %arg) {8; CHECK-LABEL: @test1(9; CHECK-NEXT: ret i1 true10;11 %a = or i32 %arg, 429490176012 %b = call i32 @llvm.bitreverse.i32(i32 %a)13 %and = and i32 %b, 6553514 %res = icmp eq i32 %and, 6553515 ret i1 %res16}17 18define i1 @test2(i32 %arg) {19; CHECK-LABEL: @test2(20; CHECK-NEXT: ret i1 true21;22 %a = or i32 %arg, 123 %b = call i32 @llvm.bitreverse.i32(i32 %a)24 %c = and i32 %b, 214748364825 %d = call i32 @llvm.bitreverse.i32(i32 %c)26 %res = icmp eq i32 %d, 127 ret i1 %res28}29 30define i1 @test3(i32 %arg) {31; CHECK-LABEL: @test3(32; CHECK-NEXT: ret i1 false33;34 %a = or i32 %arg, 6553635 %b = call i32 @llvm.bitreverse.i32(i32 %a)36 %and = and i32 %b, 3276837 %res = icmp eq i32 %and, 038 ret i1 %res39}40 41; known bits for the bitreverse will say the result is in the range [0, 64)42; but the metadata says [0, 16). So make sure the range metadata wins.43; add %reverse, 1111 000044; should become45; or %reverse, 1111 000046 47define i8 @add_bitreverse(i8 %a) {48; CHECK-LABEL: @add_bitreverse(49; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[A:%.*]], 1550; CHECK-NEXT: [[C:%.*]] = call i8 @llvm.bitreverse.i8(i8 [[TMP1]])51; CHECK-NEXT: ret i8 [[C]]52;53 %b = and i8 %a, 25254 %reverse = call i8 @llvm.bitreverse.i8(i8 %b), !range !155 %c = add i8 %reverse, -1656 ret i8 %c57}58!1 = !{i8 0, i8 16}59