[llvm] r290844 - [InstCombine] use combineMetadataForCSE instead of copying it; NFCI

Davide Italiano via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 3 07:53:14 PST 2017


On Tue, Jan 3, 2017 at 7:21 AM, Sanjay Patel <spatel at rotateright.com> wrote:
>
>
> On Tue, Jan 3, 2017 at 4:29 AM, Davide Italiano <davide at freebsd.org> wrote:
>>
>> On Mon, Jan 2, 2017 at 3:25 PM, Sanjay Patel via llvm-commits
>> <llvm-commits at lists.llvm.org> wrote:
>> > Author: spatel
>> > Date: Mon Jan  2 17:25:28 2017
>> > New Revision: 290844
>> >
>> > URL: http://llvm.org/viewvc/llvm-project?rev=290844&view=rev
>> > Log:
>> > [InstCombine] use combineMetadataForCSE instead of copying it; NFCI
>> >
>> > Modified:
>> >     llvm/trunk/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp
>> >
>> > Modified:
>> > llvm/trunk/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp?rev=290844&r1=290843&r2=290844&view=diff
>> >
>> > ==============================================================================
>> > --- llvm/trunk/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp
>> > (original)
>> > +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp
>> > Mon Jan  2 17:25:28 2017
>> > @@ -850,20 +850,10 @@ Instruction *InstCombiner::visitLoadInst
>> >    // separated by a few arithmetic operations.
>> >    BasicBlock::iterator BBI(LI);
>> >    bool IsLoadCSE = false;
>> > -  if (Value *AvailableVal =
>> > -      FindAvailableLoadedValue(&LI, LI.getParent(), BBI,
>> > -                               DefMaxInstsToScan, AA, &IsLoadCSE)) {
>> > -    if (IsLoadCSE) {
>> > -      LoadInst *NLI = cast<LoadInst>(AvailableVal);
>> > -      unsigned KnownIDs[] = {
>> > -          LLVMContext::MD_tbaa,            LLVMContext::MD_alias_scope,
>> > -          LLVMContext::MD_noalias,         LLVMContext::MD_range,
>> > -          LLVMContext::MD_invariant_load,  LLVMContext::MD_nonnull,
>> > -          LLVMContext::MD_invariant_group, LLVMContext::MD_align,
>> > -          LLVMContext::MD_dereferenceable,
>> > -          LLVMContext::MD_dereferenceable_or_null};
>> > -      combineMetadata(NLI, &LI, KnownIDs);
>> > -    };
>> > +  if (Value *AvailableVal = FindAvailableLoadedValue(
>> > +          &LI, LI.getParent(), BBI, DefMaxInstsToScan, AA, &IsLoadCSE))
>> > {
>> > +    if (IsLoadCSE)
>> > +      combineMetadataForCSE(cast<LoadInst>(AvailableVal), &LI);
>> >
>>
>> We have still a lot of places where we have fundamentally the same'ish
>> version of this code in the tree
>> (GVN/GVNHoist/SimplifyCFG/BBVectorize), is it possible to convert to
>> `combineMetadataForCSE` (or there's some caveat here I'm missing)?
>
>
>
> Add VectorUtils.cpp -> llvm::propagateMetadata() to the list; that's used by
> the Loop and SLP vectorizers. I've never looked at this closely (I'm here in
> the context of PR28430), so I'm not sure what, if any, differences these
> callers expect. It's also seems like combineMetadataForCSE is not behaving
> ideally. For example, I got here because:
>
> define i8* @isa_impl_wrap(i8** %x) {
>   %t2 = alloca i8*
>   %t4 = load i8*, i8** %x
>   store i8* %t4, i8** %t2
>   %t6 = load i8*, i8** %t2, !nonnull !0   <--- we should preserve that to
> optimize dyn_cast
>   ret i8* %t6
> }
> !0 = !{}
>
> $ ./opt -instcombine cse_nonnull.ll -S
> ...
> define i8* @isa_impl_wrap(i8** %x) {
>   %t4 = load i8*, i8** %x, align 8   <--- but it's gone now
>   ret i8* %t4
> }
>

Isn't this because we're combining %t4 and %t6 and we can set
`!nonnull` if both instructions have the !nonnull metadata?

>From `llvm::combineMetadata()`:
      case LLVMContext::MD_nonnull:
        // Only set the !nonnull if it is present in both instructions.
        K->setMetadata(Kind, JMD);

-- 
Davide

"There are no solved problems; there are only problems that are more
or less solved" -- Henri Poincare


More information about the llvm-commits mailing list