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

Arnold aschwaighofer at apple.com
Sun Mar 10 12:21:56 PDT 2013


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. :(

Best,
Arnold

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
>> 



More information about the llvm-commits mailing list