Index: lib/Transforms/Scalar/NewGVN.cpp =================================================================== --- lib/Transforms/Scalar/NewGVN.cpp +++ lib/Transforms/Scalar/NewGVN.cpp @@ -1628,15 +1628,15 @@ if (PBranch->TrueEdge) { // If we know the previous predicate is true and we are in the true // edge then we may be implied true or false. - if (CmpInst::isImpliedTrueByMatchingCmp(OurPredicate, - BranchPredicate)) { + if (CmpInst::isImpliedTrueByMatchingCmp(BranchPredicate, + OurPredicate)) { addPredicateUsers(PI, I); return createConstantExpression( ConstantInt::getTrue(CI->getType())); } - if (CmpInst::isImpliedFalseByMatchingCmp(OurPredicate, - BranchPredicate)) { + if (CmpInst::isImpliedFalseByMatchingCmp(BranchPredicate, + OurPredicate)) { addPredicateUsers(PI, I); return createConstantExpression( ConstantInt::getFalse(CI->getType())); Index: test/Transforms/NewGVN/pr32852.ll =================================================================== --- /dev/null +++ test/Transforms/NewGVN/pr32852.ll @@ -0,0 +1,24 @@ +; Make sure GVN doesn't incorrectly think the branch terminating +; bb2 has a constant condition. +; RUN: opt -S -newgvn %s | FileCheck %s + +@a = common global i32 0 +@.str = private unnamed_addr constant [3 x i8] c"0\0A\00" + +define void @main() { +bb: + %tmp = load i32, i32* @a + %tmp1 = icmp sge i32 %tmp, 0 + br i1 %tmp1, label %bb2, label %bb7 +bb2: + %tmp4 = icmp sgt i32 %tmp, 0 +; CHECK: br i1 %tmp4, label %bb5, label %bb7 + br i1 %tmp4, label %bb5, label %bb7 +bb5: + %tmp6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0)) + br label %bb7 +bb7: + ret void +} + +declare i32 @printf(i8*, ...)