[PATCH] D87149: [InstCombine] erase instructions leading up to unreachable
Roman Lebedev via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 18 10:07:07 PDT 2020
lebedev.ri added a comment.
In D87149#2282224 <https://reviews.llvm.org/D87149#2282224>, @spatel wrote:
> In D87149#2281145 <https://reviews.llvm.org/D87149#2281145>, @uabelho wrote:
>
>> Hi!
>>
>> We've run into a case where instcombine crashes with this patch:
>>
>> opt -o /dev/null bbi-47401.ll -instcombine
>>
>> on
>>
>> @c = external global i16*, align 1
>>
>> define void @main() {
>> entry:
>> br label %for.cond
>>
>> for.cond: ; preds = %g.exit, %entry
>> %conv1 = phi double [ %conv, %g.exit ], [ undef, %entry ]
>> br i1 undef, label %for.end, label %for.body
>>
>> for.body: ; preds = %for.cond
>> %0 = load i16*, i16** @c, align 1
>> %1 = load i16, i16* %0, align 1
>> %conv = sitofp i16 %1 to double
>> unreachable
>>
>> g.exit: ; No predecessors!
>> br label %for.cond
>>
>> for.end: ; preds = %for.cond
>> %conv1.lcssa = phi double [ %conv1, %for.cond ]
>> store double %conv1.lcssa, double* undef, align 1
>> ret void
>> }
>>
>> results in
>>
>> opt: ../lib/Transforms/InstCombine/InstCombineInternal.h:448: virtual llvm::Instruction *llvm::InstCombinerImpl::eraseInstFromFunction(llvm::Instruction &): Assertion `I.use_empty() && "Cannot erase instruction that is used!"' failed.
>>
>> I suppose it's the dead block %g.exit that messes up things.
>
> We had a use_empty() guard in an earlier draft of this patch and decided that could not happen. :)
> https://reviews.llvm.org/D87149#2259207
> Thanks for the test case!
Unreachable BB's were the obvious potential source for non-empty use-count, but i thought instcombine didn't combine instructions in unreachable blocks.
Maybe that is the bug?
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D87149/new/
https://reviews.llvm.org/D87149
More information about the llvm-commits
mailing list