From 0638609d66d05b5aaa18e9dafa844765d9ce88e3 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Tue, 11 Mar 2014 15:07:32 +0000 Subject: [PATCH] Fix crash in PRE. After r203553 overflow intrinsics and their non-intrinsic (normal) instruction get hashed to the same value. This patch prevents PRE from moving an instruction into a predecessor block, and trying to add a phi node that gets two different types (the intrinsic result and the non-intrinsic result), resulting in a failing assert. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203574 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/GVN.cpp | 2 ++ test/Transforms/GVN/overflow.ll | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+) 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 -- 2.34.1