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

Arnold Schwaighofer aschwaighofer at apple.com
Tue Mar 12 14:17:40 PDT 2013


I have not seen this thread (what was the thread's title). But I agree such an API would be nice.


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