diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp index c4a9a5a61ee..53c120530f7 100644 --- a/lib/Transforms/Scalar/GVN.cpp +++ b/lib/Transforms/Scalar/GVN.cpp @@ -2550,6 +2550,8 @@ bool GVN::performPRE(Function &F) { predMap.push_back(std::make_pair(static_cast(0), P)); PREPred = P; ++NumWithout; + } else if (predV->getType() != CurInst->getType()) { + continue; } else if (predV == CurInst) { /* CurInst dominates this predecessor. */ NumWithout = 2; diff --git a/test/Transforms/GVN/overflow.ll b/test/Transforms/GVN/overflow.ll index 4d5ac66dc3f..8c00573beae 100644 --- a/test/Transforms/GVN/overflow.ll +++ b/test/Transforms/GVN/overflow.ll @@ -39,5 +39,29 @@ if.end: ; preds = %entry ; CHECK: ret i32 %sadd3.repl } +; Check if PRE does not crash +define i32 @pre(i32 %a, i32 %b) nounwind ssp uwtable { +entry: + %cmp = icmp sgt i32 %a, 42 + br i1 %cmp, label %if.then, label %if.end3 +if.then: ; preds = %entry + %add = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %a, i32 %b) + %add1 = extractvalue {i32, i1} %add, 0 + %o = extractvalue {i32, i1} %add, 1 + %o32 = zext i1 %o to i32 + %add32 = add i32 %add1, %o32 + %cmp1 = icmp sgt i32 %add1, 42 + br i1 %cmp1, label %if.then2, label %if.end3 + +if.then2: ; preds = %if.then + call void @abort() noreturn + unreachable + +if.end3: ; preds = %if.end, %entry + %add4 = add i32 %a, %b + ret i32 %add4 +} + +declare void @abort() noreturn declare { i32, i1 } @llvm.sadd.with.overflow.i32(i32, i32) nounwind readnone