Index: llvm/lib/Transforms/Utils/Local.cpp =================================================================== --- llvm/lib/Transforms/Utils/Local.cpp +++ llvm/lib/Transforms/Utils/Local.cpp @@ -3391,6 +3391,11 @@ if (DemandedBW > ITy->getScalarSizeInBits()) return false; + // Check that the bswap/bitreverse will have legal bit width. + auto &DL = I->getModule()->getDataLayout(); + if (DL.isIllegalInteger(DemandedBW)) + return false; + // Now, is the bit permutation correct for a bswap or a bitreverse? We can // only byteswap values with an even number of bytes. APInt DemandedMask = APInt::getAllOnes(DemandedBW); Index: llvm/test/Transforms/InstCombine/bitreverse.ll =================================================================== --- llvm/test/Transforms/InstCombine/bitreverse.ll +++ llvm/test/Transforms/InstCombine/bitreverse.ll @@ -261,6 +261,17 @@ ret i8 %10 } +define i32 @illegal_width(i32 %x) { +; CHECK-LABEL: @illegal_width +; CHECK-NOT: call i9 @llvm.bitreverse.i9 + %b0 = and i32 %x, 1 + %b1 = and i32 %x, 2 + %shift1 = mul nuw nsw i32 %b1, 64 + %shift0 = shl nuw nsw i32 %b0, 8 + %reverse = add i32 %shift0, %shift1 + ret i32 %reverse +} + define i4 @shuf_4bits(<4 x i1> %x) { ; CHECK-LABEL: @shuf_4bits( ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i1> [[X:%.*]] to i4