[llvm] r331266 - Fix the issue that ComputeValueKnownInPredecessors only handles the case when

Wei Mi via llvm-commits llvm-commits at lists.llvm.org
Tue May 1 10:23:06 PDT 2018


Thanks, that is a better idea. Fixed in r331286.

On Tue, May 1, 2018 at 10:12 AM, Chandler Carruth <chandlerc at google.com> wrote:
> On Tue, May 1, 2018 at 7:50 AM Wei Mi via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
>>
>> Author: wmi
>> Date: Tue May  1 07:47:24 2018
>> New Revision: 331266
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=331266&view=rev
>> Log:
>> Fix the issue that ComputeValueKnownInPredecessors only handles the case
>> when
>> phi is on lhs of a comparison op.
>>
>> For the following testcase,
>> L1:
>>
>>   %t0 = add i32 %m, 7
>>   %t3 = icmp eq i32* %t2, null
>>   br i1 %t3, label %L3, label %L2
>>
>> L2:
>>
>>   %t4 = load i32, i32* %t2, align 4
>>   br label %L3
>>
>> L3:
>>
>>   %t5 = phi i32 [ %t0, %L1 ], [ %t4, %L2 ]
>>   %t6 = icmp eq i32 %t0, %t5
>>   br i1 %t6, label %L4, label %L5
>>
>> We know if we go through the path L1 --> L3, %t6 should always be true.
>> However
>> currently, if the rhs of the eq comparison is phi, JumpThreading fails to
>> evaluate %t6 to true. And we know that Instcombine cannot guarantee always
>> canonicalizing phi to the left hand side of the comparison operation
>> according
>> to the operand priority comparison mechanism in instcombine. The patch
>> handles
>> the case when rhs of the comparison op is a phi.
>>
>> Differential Revision: https://reviews.llvm.org/D46275
>>
>>
>> Modified:
>>     llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp
>>     llvm/trunk/test/Other/pr32085.ll
>>     llvm/trunk/test/Transforms/JumpThreading/phi-known.ll
>>
>> Modified: llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp?rev=331266&r1=331265&r2=331266&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp (original)
>> +++ llvm/trunk/lib/Transforms/Scalar/JumpThreading.cpp Tue May  1 07:47:24
>> 2018
>> @@ -752,6 +752,8 @@ bool JumpThreadingPass::ComputeValueKnow
>>      CmpInst::Predicate Pred = Cmp->getPredicate();
>>
>>      PHINode *PN = dyn_cast<PHINode>(CmpLHS);
>> +    if (!PN)
>> +      PN = dyn_cast<PHINode>(CmpRHS);
>>      if (PN && PN->getParent() == BB) {
>>        const DataLayout &DL = PN->getModule()->getDataLayout();
>>        // We can do this simplification if any comparisons fold to true or
>> false.
>> @@ -762,14 +764,24 @@ bool JumpThreadingPass::ComputeValueKnow
>>          LVI->enableDT();
>>        for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
>>          BasicBlock *PredBB = PN->getIncomingBlock(i);
>> -        Value *LHS = PN->getIncomingValue(i);
>> -        Value *RHS = CmpRHS->DoPHITranslation(BB, PredBB);
>> -
>> +        Value *LHS, *RHS;
>> +        if (PN == CmpLHS) {
>> +          LHS = PN->getIncomingValue(i);
>> +          RHS = CmpRHS->DoPHITranslation(BB, PredBB);
>> +        } else {
>> +          LHS = CmpLHS->DoPHITranslation(BB, PredBB);
>> +          RHS = PN->getIncomingValue(i);
>> +        }
>>          Value *Res = SimplifyCmpInst(Pred, LHS, RHS, {DL});
>>          if (!Res) {
>>            if (!isa<Constant>(RHS))
>>              continue;
>>
>> +          // getPredicateOnEdge call will make no sense if LHS is defined
>> in BB.
>> +          auto LHSInst = dyn_cast<Instruction>(LHS);
>> +          if (LHSInst && LHSInst->getParent() == BB)
>> +            continue;
>> +
>>            LazyValueInfo::Tristate
>>              ResT = LVI->getPredicateOnEdge(Pred, LHS,
>>                                             cast<Constant>(RHS), PredBB,
>> BB,
>>
>> Modified: llvm/trunk/test/Other/pr32085.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Other/pr32085.ll?rev=331266&r1=331265&r2=331266&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/Other/pr32085.ll (original)
>> +++ llvm/trunk/test/Other/pr32085.ll Tue May  1 07:47:24 2018
>> @@ -1,6 +1,7 @@
>>  ; RUN: opt -S -O1 < %s -o %t1.ll
>>  ;; Show that there's no difference after running another simplify CFG
>> -; RUN: opt -S -simplifycfg < %t1.ll -o %t2.ll
>> +; RUN: opt -S -simplifycfg < %t1.ll -o %t2.ll
>> +; RUN: sed -i 's/; preds = .*//g' %t1.ll %t2.ll
>
>
> Rather than using 'sed' with its portability problems, just rinse it through
> a no-op opt run:
> ; RUN: opt -S < %t1.ll -o %t2.ll
> ; RUN: opt -S -simplifycfg < %t1.ll -o %t3.ll
> ; RUN: diff %t2.ll %t3.ll
>
>>
>>  ; RUN: diff %t1.ll %t2.ll
>>
>>  ; Test from LoopSink pass, leaves some single-entry single-exit basic
>> blocks.
>>
>> Modified: llvm/trunk/test/Transforms/JumpThreading/phi-known.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/JumpThreading/phi-known.ll?rev=331266&r1=331265&r2=331266&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/Transforms/JumpThreading/phi-known.ll (original)
>> +++ llvm/trunk/test/Transforms/JumpThreading/phi-known.ll Tue May  1
>> 07:47:24 2018
>> @@ -64,3 +64,41 @@ exit:
>>    ret void
>>  }
>>
>> +; The eq predicate is always true if we go through the path from
>> +; L1 to L3, no matter the phi result %t5 is on the lhs or rhs of
>> +; the predicate.
>> +declare void @goo()
>> +declare void @hoo()
>> +
>> +define void @test3(i32 %m, i32** %t1) {
>> +L1:
>> +  %t0 = add i32 %m, 7
>> +  %t2 = load i32*, i32** %t1, align 8
>> +; CHECK-LABEL: @test3
>> +; CHECK: %t3 = icmp eq i32* %t2, null
>> +; CHECK: br i1 %t3, label %[[LABEL2:.*]], label %[[LABEL1:.*]]
>> +
>> +  %t3 = icmp eq i32* %t2, null
>> +  br i1 %t3, label %L3, label %L2
>> +
>> +; CHECK: [[LABEL1]]:
>> +; CHECK-NEXT: %t4 = load i32, i32* %t2, align 4
>> +L2:
>> +  %t4 = load i32, i32* %t2, align 4
>> +  br label %L3
>> +
>> +L3:
>> +  %t5 = phi i32 [ %t0, %L1 ], [ %t4, %L2 ]
>> +  %t6 = icmp eq i32 %t0, %t5
>> +  br i1 %t6, label %L4, label %L5
>> +
>> +; CHECK: [[LABEL2]]:
>> +; CHECK-NEXT: call void @goo()
>> +L4:
>> +  call void @goo()
>> +  ret void
>> +
>> +L5:
>> +  call void @hoo()
>> +  ret void
>> +}
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list