Index: lib/Analysis/ConstantFolding.cpp =================================================================== --- lib/Analysis/ConstantFolding.cpp +++ lib/Analysis/ConstantFolding.cpp @@ -1768,7 +1768,8 @@ } if (isa(Operands[0])) { - if (IntrinsicID == Intrinsic::bswap) + if (IntrinsicID == Intrinsic::bswap || + IntrinsicID == Intrinsic::bitreverse) return Operands[0]; return nullptr; } Index: test/Transforms/InstCombine/bitreverse-fold.ll =================================================================== --- test/Transforms/InstCombine/bitreverse-fold.ll +++ test/Transforms/InstCombine/bitreverse-fold.ll @@ -37,6 +37,13 @@ ret i32 %x } +; CHECK-LABEL: @reverse_undef_i32( +; CHECK-NEXT: ret i32 undef +define i32 @reverse_undef_i32() { + %x = call i32 @llvm.bitreverse.i32(i32 undef) + ret i32 %x +} + ; CHECK-LABEL: @reverse_false_i1( ; CHECK-NEXT: ret i1 false define i1 @reverse_false_i1() { @@ -51,6 +58,13 @@ ret i1 %x } +; CHECK-LABEL: @reverse_undef_i1( +; CHECK-NEXT: ret i1 undef +define i1 @reverse_undef_i1() { + %x = call i1 @llvm.bitreverse.i1(i1 undef) + ret i1 %x +} + ; CHECK-LABEL: @reverse_false_v2i1( ; CHECK-NEXT: ret <2 x i1> zeroinitializer define <2 x i1> @reverse_false_v2i1() {