[llvm] r176768 - LoopVectorizer: Ignore dbg.value instructions

Andrew Trick atrick at apple.com
Tue Mar 12 14:12:05 PDT 2013


On Mar 10, 2013, at 12:21 PM, Arnold <aschwaighofer at apple.com> wrote:

> Yes, we do with any potentially vectorizable but unrecognized call. 
> 
> It is especially bad for -g. If you turn on debugging you will get a dbg.value for the induction variable turning off vectorization for at lot of loops I have seen. :(

Hal is alluding to a recent thread where he and I both expressed a desire for a uniform API for meta-intrinsics--intrinsics that are not required for correctness, generate no code, and should not block optimization or affect heuristics. It's not maintainable to update all passes to recognize all variants.

-Andy

> On Mar 9, 2013, at 6:00 PM, Hal Finkel <hfinkel at anl.gov> wrote:
> 
>> Arnold,
>> 
>> Out of curiosity, do we have a similar issue with llvm.lifetime/llvm.invariant (and the annotation) intrinsics? (I believe that I have a similar problem in the BBVectorizer with all of these).
>> 
>> Thanks again,
>> Hal
>> 
>> ----- Original Message -----
>>> From: "Arnold Schwaighofer" <aschwaighofer at apple.com>
>>> To: "Benjamin Kramer" <benny.kra at gmail.com>
>>> Cc: "LLVM Commits" <llvm-commits at cs.uiuc.edu>
>>> Sent: Saturday, March 9, 2013 10:28:39 AM
>>> Subject: Re: [llvm] r176768 - LoopVectorizer: Ignore dbg.value instructions
>>> 
>>> r176769
>>> 
>>> On Mar 9, 2013, at 10:13 AM, Arnold Schwaighofer
>>> <aschwaighofer at apple.com> wrote:
>>> 
>>>> I was assuming that they would not occur in a loop as they are used
>>>> to annotate allocas. But I guess it can't  hurt to be more
>>>> inclusive.
>>>> 
>>>> On Mar 9, 2013, at 10:06 AM, Benjamin Kramer <benny.kra at gmail.com>
>>>> wrote:
>>>> 
>>>>> 
>>>>> On 09.03.2013, at 16:56, Arnold Schwaighofer
>>>>> <aschwaighofer at apple.com> wrote:
>>>>> 
>>>>>> Author: arnolds
>>>>>> Date: Sat Mar  9 09:56:34 2013
>>>>>> New Revision: 176768
>>>>>> 
>>>>>> URL: http://llvm.org/viewvc/llvm-project?rev=176768&view=rev
>>>>>> Log:
>>>>>> LoopVectorizer: Ignore dbg.value instructions
>>>>>> 
>>>>>> We want vectorization to happen at -g. Ignore calls to the
>>>>>> dbg.value intrinsic
>>>>>> and don't transfer them to the vectorized code.
>>>>> 
>>>>> Should this also ignore dbg.declare intrinsics? (There's a
>>>>> DbgInfoIntrinsic wrapper that matches both)
>>>>> 
>>>>> - Ben
>>>>>> 
>>>>>> radar://13378964
>>>>>> 
>>>>>> Added:
>>>>>> llvm/trunk/test/Transforms/LoopVectorize/dbg.value.ll
>>>>>> Modified:
>>>>>> llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp
>>>>>> 
>>>>>> Modified: llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp
>>>>>> URL:
>>>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp?rev=176768&r1=176767&r2=176768&view=diff
>>>>>> ==============================================================================
>>>>>> --- llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp
>>>>>> (original)
>>>>>> +++ llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp Sat Mar
>>>>>> 9 09:56:34 2013
>>>>>> @@ -2088,6 +2088,10 @@ InnerLoopVectorizer::vectorizeBlockInLoo
>>>>>> }
>>>>>> 
>>>>>> case Instruction::Call: {
>>>>>> +      // Ignore dbg.value instructions.
>>>>>> +      if (isa<DbgValueInst>(it))
>>>>>> +        break;
>>>>>> +
>>>>>> Module *M = BB->getParent()->getParent();
>>>>>> CallInst *CI = cast<CallInst>(it);
>>>>>> Intrinsic::ID ID = getIntrinsicIDForCall(CI, TLI);
>>>>>> @@ -2324,9 +2328,10 @@ bool LoopVectorizationLegality::canVecto
>>>>>>   return false;
>>>>>> }// end of PHI handling
>>>>>> 
>>>>>> -      // We still don't handle functions.
>>>>>> +      // We still don't handle functions. However, we can ignore
>>>>>> dbg.value
>>>>>> +      // calls and we do handle certain intrinsic and libm
>>>>>> functions.
>>>>>> CallInst *CI = dyn_cast<CallInst>(it);
>>>>>> -      if (CI && !getIntrinsicIDForCall(CI, TLI)) {
>>>>>> +      if (CI && !getIntrinsicIDForCall(CI, TLI) &&
>>>>>> !isa<DbgValueInst>(CI)) {
>>>>>>   DEBUG(dbgs() << "LV: Found a call site.\n");
>>>>>>   return false;
>>>>>> }
>>>>>> @@ -3263,6 +3268,10 @@ unsigned LoopVectorizationCostModel::exp
>>>>>> 
>>>>>> // For each instruction in the old loop.
>>>>>> for (BasicBlock::iterator it = BB->begin(), e = BB->end(); it
>>>>>> != e; ++it) {
>>>>>> +      // Skip dbg.value instructions.
>>>>>> +      if (isa<DbgValueInst>(it))
>>>>>> +        continue;
>>>>>> +
>>>>>> unsigned C = getInstructionCost(it, VF);
>>>>>> Cost += C;
>>>>>> DEBUG(dbgs() << "LV: Found an estimated cost of "<< C <<" for
>>>>>> VF " <<
>>>>>> 
>>>>>> Added: llvm/trunk/test/Transforms/LoopVectorize/dbg.value.ll
>>>>>> URL:
>>>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopVectorize/dbg.value.ll?rev=176768&view=auto
>>>>>> ==============================================================================
>>>>>> --- llvm/trunk/test/Transforms/LoopVectorize/dbg.value.ll (added)
>>>>>> +++ llvm/trunk/test/Transforms/LoopVectorize/dbg.value.ll Sat Mar
>>>>>> 9 09:56:34 2013
>>>>>> @@ -0,0 +1,70 @@
>>>>>> +; RUN: opt < %s -S -loop-vectorize -force-vector-unroll=1
>>>>>> -force-vector-width=4 -dce -instcombine | FileCheck %s
>>>>>> +; Make sure we vectorize with debugging turned on.
>>>>>> +
>>>>>> +target datalayout =
>>>>>> "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
>>>>>> +target triple = "x86_64-apple-macosx10.8.0"
>>>>>> +
>>>>>> + at A = global [1024 x i32] zeroinitializer, align 16
>>>>>> + at B = global [1024 x i32] zeroinitializer, align 16
>>>>>> + at C = global [1024 x i32] zeroinitializer, align 16
>>>>>> +
>>>>>> +; CHECK: @test
>>>>>> +define i32 @test() #0 {
>>>>>> +entry:
>>>>>> +  tail call void @llvm.dbg.value(metadata !1, i64 0, metadata
>>>>>> !9), !dbg !18
>>>>>> +  br label %for.body, !dbg !18
>>>>>> +
>>>>>> +for.body:
>>>>>> +  ;CHECK: load <4 x i32>
>>>>>> +  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next,
>>>>>> %for.body ]
>>>>>> +  %arrayidx = getelementptr inbounds [1024 x i32]* @B, i64 0,
>>>>>> i64 %indvars.iv, !dbg !19
>>>>>> +  %0 = load i32* %arrayidx, align 4, !dbg !19, !tbaa !21
>>>>>> +  %arrayidx2 = getelementptr inbounds [1024 x i32]* @C, i64 0,
>>>>>> i64 %indvars.iv, !dbg !19
>>>>>> +  %1 = load i32* %arrayidx2, align 4, !dbg !19, !tbaa !21
>>>>>> +  %add = add nsw i32 %1, %0, !dbg !19
>>>>>> +  %arrayidx4 = getelementptr inbounds [1024 x i32]* @A, i64 0,
>>>>>> i64 %indvars.iv, !dbg !19
>>>>>> +  store i32 %add, i32* %arrayidx4, align 4, !dbg !19, !tbaa !21
>>>>>> +  %indvars.iv.next = add i64 %indvars.iv, 1, !dbg !18
>>>>>> +  tail call void @llvm.dbg.value(metadata !{null}, i64 0,
>>>>>> metadata !9), !dbg !18
>>>>>> +  %lftr.wideiv = trunc i64 %indvars.iv.next to i32, !dbg !18
>>>>>> +  %exitcond = icmp ne i32 %lftr.wideiv, 1024, !dbg !18
>>>>>> +  br i1 %exitcond, label %for.body, label %for.end, !dbg !18
>>>>>> +
>>>>>> +for.end:
>>>>>> +  ret i32 0, !dbg !24
>>>>>> +}
>>>>>> +
>>>>>> +declare void @llvm.dbg.declare(metadata, metadata) #1
>>>>>> +
>>>>>> +declare void @llvm.dbg.value(metadata, i64, metadata) #1
>>>>>> +
>>>>>> +attributes #0 = { nounwind ssp uwtable
>>>>>> "fp-contract-model"="standard" "no-frame-pointer-elim"
>>>>>> "no-frame-pointer-elim-non-leaf" "realign-stack"
>>>>>> "relocation-model"="pic" "ssp-buffers-size"="8" }
>>>>>> +attributes #1 = { nounwind readnone }
>>>>>> +
>>>>>> +!llvm.dbg.cu = !{!0}
>>>>>> +
>>>>>> +!0 = metadata !{i32 786449, i32 0, i32 4, metadata !"test",
>>>>>> metadata !"/path/to/somewhere", metadata !"clang", i1 true, i1
>>>>>> true, metadata !"", i32 0, metadata !1, metadata !1, metadata
>>>>>> !2, metadata !11, metadata !""}
>>>>>> +!1 = metadata !{i32 0}
>>>>>> +!2 = metadata !{metadata !3}
>>>>>> +!3 = metadata !{i32 786478, i32 0, metadata !4, metadata
>>>>>> !"test", metadata !"test", metadata !"test", metadata !4, i32 5,
>>>>>> metadata !5, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1
>>>>>> true, i32 ()* @test, null, null, metadata !8, i32 5}
>>>>>> +!4 = metadata !{i32 786473, metadata !"test", metadata
>>>>>> !"/path/to/somewhere", null}
>>>>>> +!5 = metadata !{i32 786453, i32 0, metadata !"", i32 0, i32 0,
>>>>>> i64 0, i64 0, i64 0, i32 0, null, metadata !6, i32 0, i32 0}
>>>>>> +!6 = metadata !{metadata !7}
>>>>>> +!7 = metadata !{i32 786468, null, metadata !"int", null, i32 0,
>>>>>> i64 32, i64 32, i64 0, i32 0, i32 5}
>>>>>> +!8 = metadata !{metadata !9}
>>>>>> +!9 = metadata !{i32 786688, metadata !10, metadata !"i",
>>>>>> metadata !4, i32 6, metadata !7, i32 0, i32 0}
>>>>>> +!10 = metadata !{i32 786443, metadata !3, i32 6, i32 0, metadata
>>>>>> !4, i32 0}
>>>>>> +!11 = metadata !{metadata !12, metadata !16, metadata !17}
>>>>>> +!12 = metadata !{i32 786484, i32 0, null, metadata !"A",
>>>>>> metadata !"A", metadata !"", metadata !4, i32 1, metadata !13,
>>>>>> i32 0, i32 1, [1024 x i32]* @A, null}
>>>>>> +!13 = metadata !{i32 786433, null, metadata !"", null, i32 0,
>>>>>> i64 32768, i64 32, i32 0, i32 0, metadata !7, metadata !14, i32
>>>>>> 0, i32 0}
>>>>>> +!14 = metadata !{metadata !15}
>>>>>> +!15 = metadata !{i32 786465, i64 0, i64 1024}
>>>>>> +!16 = metadata !{i32 786484, i32 0, null, metadata !"B",
>>>>>> metadata !"B", metadata !"", metadata !4, i32 2, metadata !13,
>>>>>> i32 0, i32 1, [1024 x i32]* @B, null}
>>>>>> +!17 = metadata !{i32 786484, i32 0, null, metadata !"C",
>>>>>> metadata !"C", metadata !"", metadata !4, i32 3, metadata !13,
>>>>>> i32 0, i32 1, [1024 x i32]* @C, null}
>>>>>> +!18 = metadata !{i32 6, i32 0, metadata !10, null}
>>>>>> +!19 = metadata !{i32 7, i32 0, metadata !20, null}
>>>>>> +!20 = metadata !{i32 786443, metadata !10, i32 6, i32 0,
>>>>>> metadata !4, i32 1}
>>>>>> +!21 = metadata !{metadata !"int", metadata !22}
>>>>>> +!22 = metadata !{metadata !"omnipotent char", metadata !23}
>>>>>> +!23 = metadata !{metadata !"Simple C/C++ TBAA"}
>>>>>> +!24 = metadata !{i32 9, i32 0, metadata !3, null}
>>>>>> 
>>>>>> 
>>>>>> _______________________________________________
>>>>>> llvm-commits mailing list
>>>>>> llvm-commits at cs.uiuc.edu
>>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>>> 
>>>> _______________________________________________
>>>> llvm-commits mailing list
>>>> llvm-commits at cs.uiuc.edu
>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>> 
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list