mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-25 12:04:36 +00:00
[NewGVN] Don't derive incorrect implications.
In the testcase attached, we believe %tmp1 implies %tmp4. where: br i1 %tmp1, label %bb2, label %bb7 br i1 %tmp4, label %bb5, label %bb7 because Wwhile looking at PredicateInfo stuffs we end up calling isImpliedTrueByMatchingCmp() with the arguments backwards. Differential Revision: https://reviews.llvm.org/D32718 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@301849 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5ef20bbe9c
commit
f1457bf082
@ -1628,15 +1628,15 @@ const Expression *NewGVN::performSymbolicCmpEvaluation(Instruction *I) {
|
||||
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()));
|
||||
|
24
test/Transforms/NewGVN/pr32852.ll
Normal file
24
test/Transforms/NewGVN/pr32852.ll
Normal file
@ -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
|
||||
@patatino = private unnamed_addr constant [3 x i8] c"0\0A\00"
|
||||
|
||||
define void @tinkywinky() {
|
||||
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]* @patatino, i32 0, i32 0))
|
||||
br label %bb7
|
||||
bb7:
|
||||
ret void
|
||||
}
|
||||
|
||||
declare i32 @printf(i8*, ...)
|
Loading…
x
Reference in New Issue
Block a user