diff options
| -rw-r--r-- | llvm/lib/Analysis/LoopUnrollAnalyzer.cpp | 6 | ||||
| -rw-r--r-- | llvm/test/Transforms/LoopUnroll/full-unroll-crashers.ll | 18 |
2 files changed, 19 insertions, 5 deletions
diff --git a/llvm/lib/Analysis/LoopUnrollAnalyzer.cpp b/llvm/lib/Analysis/LoopUnrollAnalyzer.cpp index 413cf343c97..d88ab163557 100644 --- a/llvm/lib/Analysis/LoopUnrollAnalyzer.cpp +++ b/llvm/lib/Analysis/LoopUnrollAnalyzer.cpp @@ -141,11 +141,7 @@ bool UnrolledInstAnalyzer::visitCastInst(CastInst &I) { Constant *COp = dyn_cast<Constant>(I.getOperand(0)); if (!COp) COp = SimplifiedValues.lookup(I.getOperand(0)); - if (COp) { - if (COp->getType() == I.getType()) { - SimplifiedValues[&I] = cast<Constant>(COp); - return true; - } + if (COp && CastInst::castIsValid(I.getOpcode(), COp, I.getType())) { if (Constant *C = ConstantExpr::getCast(I.getOpcode(), COp, I.getType())) { SimplifiedValues[&I] = C; diff --git a/llvm/test/Transforms/LoopUnroll/full-unroll-crashers.ll b/llvm/test/Transforms/LoopUnroll/full-unroll-crashers.ll index 991cb309bf4..54d4bbb82fc 100644 --- a/llvm/test/Transforms/LoopUnroll/full-unroll-crashers.ll +++ b/llvm/test/Transforms/LoopUnroll/full-unroll-crashers.ll @@ -119,3 +119,21 @@ for.inc: for.cond.cleanup: ret void } + +define void @ptrtoint_cast2() { +entry: + br i1 false, label %for.body.lr.ph, label %exit + +for.body.lr.ph: + br label %for.body + +for.body: + %iv = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.body ] + %offset = getelementptr inbounds float, float* null, i32 3 + %bc = bitcast float* %offset to i64* + %inc = add nuw nsw i32 %iv, 1 + br i1 false, label %for.body, label %exit + +exit: + ret void +} |

