r213112 - Handle diagnostic warnings in Frontend diagnostic handler.
Tyler Nowicki
tnowicki at apple.com
Fri Jul 18 12:50:55 PDT 2014
Thanks Alp,
Closed by commit r213399 (llvm) and r213400 (clang).
Tyler
On Jul 17, 2014, at 6:51 PM, Alp Toker <alp at nuanti.com> wrote:
>
> On 18/07/2014 03:52, Tyler Nowicki wrote:
>> Hi Alp,
>>
>> Thanks for the review. I incorporated some of your suggestions. Please review the patches below.
>
> Thanks Tyler, looks mostly good with a couple of tweaks..
>
>
>>
>>>> void
>>>> OptimizationRemarkHandler(const llvm::DiagnosticInfoOptimizationRemark &D);
>>>> void OptimizationRemarkHandler(
>>>> const llvm::DiagnosticInfoOptimizationRemarkMissed &D);
>>>> void OptimizationRemarkHandler(
>>>> const llvm::DiagnosticInfoOptimizationRemarkAnalysis &D);
>>>> + void OptimizationWarningHandler(
>>>> + const llvm::DiagnosticInfoOptimizationWarning &D);
>>>
>>> I don't get this. The frontend maps backend remarks to frontend diagnostics so why the special case?
>>
>> This is patch is not another remark. See LLVM commit r213110 which added the warnings to llvm. We produce a warning when an explicitly specified optimization (currently vectorization or interleaving) fails. In clang the user can explicitly specify vectorization, interleaving, and unrolling with a pragma clang loop directive.
>
> I see the use case now. Good call on the renaming in the updated patch -- the warning flag name makes sense and the type name is better too.
>
>>
>>
>>>> - Diags.Report(Loc, DiagID) << AddFlagValue(D.getPassName())
>>>> - << D.getMsg().str();
>>>> + // Flag value not used by all optimization messages.
>>>> + if (D.getPassName())
>>>> + Diags.Report(Loc, DiagID) << AddFlagValue(D.getPassName())
>>>> + << D.getMsg().str();
>>>> + else
>>>> + Diags.Report(Loc, DiagID) << D.getMsg().str();
>>>
>>> Is this change necessary? The existing code had the same functionality without the need for an if/else here AFAICT.
>>
>> If I changed the implementation of AddFlagValue it might work. The problem is that it is a struct and its constructor expects a StringRef. This is constructed implicitly from the char* returned by getPassName(). But this could be null causing an assertion when building the StringRef.
>
> Perhaps just use AddFlagValue(D.getPassName() ? D.getPassName() : "") or create a local variable above to avoid duplicating the line.
>
>>
>>> I think the plan was to handle this with user-defined diagnostic mappings rather than what's being done here.
>>
>> What do you mean? Can you elaborate?
>
> Ah, that comment was about backend diagnostics enabled by -R. Looking at your updated patch I see the mechanism is different here so it doesn't apply.
>
>
>> --- test/Driver/optimization-failure.cpp (revision 0)
>> +++ test/Driver/optimization-failure.cpp (working copy)
>
> Not a Driver test. If you put this in 'Misc' alongside the other backend diag tests that'll be fine for now.
>
>
>> @@ -0,0 +1,18 @@
>> +// REQUIRES: clang-driver
>
> The 'clang-driver' predicate is something else, shouldn't be needed here.
>
>> +// RUN: %clang %s -O3 -gline-tables-only -gcolumn-info -emit-llvm -S -o /dev/null 2>&1 | FileCheck %s
>> +
>> +
>> +// Test verifies optimization failures generated by the backend are handled
>> +// correctly by clang. LLVM tests verify all of the failure conditions.
>> +// CHECK: {{.*}}:12:5: warning: loop not vectorized: failed explicitly specified loop vectorization
>
> Let's go ahead and test this using the diagnostic verifier (-cc1 -verify) instead of FileCheck.
>
> See 'test/Misc/backend-stack-frame-diagnostics.cpp' for an example RUN line and expected-warning{{}} directives.
>
> LGTM with those changes. Feel free to commit both or pass it by me again, whichever you're comfortable with.
>
> Cheers
> Alp.
>
>
>
>> +
>> +void test_switch(int *A, int *B, int Length) {
>> + #pragma clang loop vectorize(enable) unroll(disable)
>> + for (int i = 0; i < Length; i++) {
>> + switch(A[i]) {
>> + case 0: B[i] = 1; break;
>> + case 1: B[i] = 2; break;
>> + default: B[i] = 3;
>> + }
>> + }
>> +}
>
>
>
>>
>> Tyler
>>
>> LLVM:
>>
>>
>>
>>
>> Clang:
>>
>>
>>
>>
>
> --
> http://www.nuanti.com
> the browser experts
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140718/0615e715/attachment.html>
More information about the cfe-commits
mailing list