diff --git a/llvm/lib/Analysis/LazyValueInfo.cpp b/llvm/lib/Analysis/LazyValueInfo.cpp index b30e6a6a367c50..4209ee4a779539 100644 --- a/llvm/lib/Analysis/LazyValueInfo.cpp +++ b/llvm/lib/Analysis/LazyValueInfo.cpp @@ -1370,6 +1370,7 @@ LazyValueInfoImpl::getEdgeValueLocal(Value *Val, BasicBlock *BBFrom, // If V is the condition of the branch itself, then we know exactly what // it is. + // NB: The condition on a `br` can't be a vector type. if (Condition == Val) return ValueLatticeElement::get(ConstantInt::get( Type::getInt1Ty(Val->getContext()), isTrueDest)); @@ -1723,7 +1724,7 @@ Constant *LazyValueInfo::getConstant(Value *V, Instruction *CxtI) { if (Result.isConstantRange()) { const ConstantRange &CR = Result.getConstantRange(); if (const APInt *SingleVal = CR.getSingleElement()) - return ConstantInt::get(V->getContext(), *SingleVal); + return ConstantInt::get(V->getType(), *SingleVal); } return nullptr; } @@ -1758,7 +1759,7 @@ Constant *LazyValueInfo::getConstantOnEdge(Value *V, BasicBlock *FromBB, if (Result.isConstantRange()) { const ConstantRange &CR = Result.getConstantRange(); if (const APInt *SingleVal = CR.getSingleElement()) - return ConstantInt::get(V->getContext(), *SingleVal); + return ConstantInt::get(V->getType(), *SingleVal); } return nullptr; } diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/vectors.ll b/llvm/test/Transforms/CorrelatedValuePropagation/vectors.ll index 0024b0a5c75c96..caaed628ed43ec 100644 --- a/llvm/test/Transforms/CorrelatedValuePropagation/vectors.ll +++ b/llvm/test/Transforms/CorrelatedValuePropagation/vectors.ll @@ -220,3 +220,24 @@ define <2 x i16> @and_with_poison(<2 x i8> %a) { %res = and <2 x i16> %zext, ret <2 x i16> %res } + + + +define <4 x i64> @issue_97674_getConstantOnEdge(i1 %cond) { +entry: + br i1 %cond, label %if.then, label %if.end + +if.then: + %folds = add <4 x i64> zeroinitializer, + br label %if.end + +if.end: + %r = phi <4 x i64> [ %folds, %if.then ], [ zeroinitializer, %entry ] + ret <4 x i64> %r +} + +define <4 x i64> @issue_97674_getConstant() { +entry: + %folds = add <4 x i64> zeroinitializer, zeroinitializer + ret <4 x i64> %folds +}