diff --git a/llvm/lib/IR/DIExpressionOptimizer.cpp b/llvm/lib/IR/DIExpressionOptimizer.cpp index 2bb8eac348c8e..be9e13a34235a 100644 --- a/llvm/lib/IR/DIExpressionOptimizer.cpp +++ b/llvm/lib/IR/DIExpressionOptimizer.cpp @@ -59,12 +59,14 @@ foldOperationIfPossible(uint64_t Const1, uint64_t Const2, return Const1 - Const2; } case dwarf::DW_OP_shl: { - if ((uint64_t)countl_zero(Const1) < Const2) + if (Const2 >= std::numeric_limits::digits || + static_cast(countl_zero(Const1)) < Const2) return std::nullopt; return Const1 << Const2; } case dwarf::DW_OP_shr: { - if ((uint64_t)countr_zero(Const1) < Const2) + if (Const2 >= std::numeric_limits::digits || + static_cast(countr_zero(Const1)) < Const2) return std::nullopt; return Const1 >> Const2; } diff --git a/llvm/unittests/IR/MetadataTest.cpp b/llvm/unittests/IR/MetadataTest.cpp index fbdab1975df72..628221339c89b 100644 --- a/llvm/unittests/IR/MetadataTest.cpp +++ b/llvm/unittests/IR/MetadataTest.cpp @@ -3541,12 +3541,12 @@ TEST_F(DIExpressionTest, Fold) { ResExpr = DIExpression::get(Context, ResOps); EXPECT_EQ(E, ResExpr); - // Test a left shift greater than 64. + // Test a left shift greater than 63. Ops.clear(); Ops.push_back(dwarf::DW_OP_constu); Ops.push_back(1); Ops.push_back(dwarf::DW_OP_constu); - Ops.push_back(65); + Ops.push_back(64); Ops.push_back(dwarf::DW_OP_shl); Expr = DIExpression::get(Context, Ops); E = Expr->foldConstantMath(); @@ -3554,17 +3554,17 @@ TEST_F(DIExpressionTest, Fold) { ResOps.push_back(dwarf::DW_OP_constu); ResOps.push_back(1); ResOps.push_back(dwarf::DW_OP_constu); - ResOps.push_back(65); + ResOps.push_back(64); ResOps.push_back(dwarf::DW_OP_shl); ResExpr = DIExpression::get(Context, ResOps); EXPECT_EQ(E, ResExpr); - // Test a right shift greater than 64. + // Test a right shift greater than 63. Ops.clear(); Ops.push_back(dwarf::DW_OP_constu); Ops.push_back(1); Ops.push_back(dwarf::DW_OP_constu); - Ops.push_back(65); + Ops.push_back(64); Ops.push_back(dwarf::DW_OP_shr); Expr = DIExpression::get(Context, Ops); E = Expr->foldConstantMath(); @@ -3572,7 +3572,7 @@ TEST_F(DIExpressionTest, Fold) { ResOps.push_back(dwarf::DW_OP_constu); ResOps.push_back(1); ResOps.push_back(dwarf::DW_OP_constu); - ResOps.push_back(65); + ResOps.push_back(64); ResOps.push_back(dwarf::DW_OP_shr); ResExpr = DIExpression::get(Context, ResOps); EXPECT_EQ(E, ResExpr);