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

Andrew Trick atrick at apple.com
Tue Mar 12 15:47:00 PDT 2013


On Mar 12, 2013, at 2:17 PM, Arnold Schwaighofer <aschwaighofer at apple.com> wrote:
> I have not seen this thread (what was the thread's title). But I agree such an API would be nice.

Arnold, I just responded to the llvm.meta thread on llvmdev.

-Andy

> On Mar 12, 2013, at 4:12 PM, Andrew Trick <atrick at apple.com> wrote:
> 
>> 
>> 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