r213112 - Handle diagnostic warnings in Frontend diagnostic handler.
Alp Toker
alp at nuanti.com
Thu Jul 17 18:51:24 PDT 2014
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
More information about the cfe-commits
mailing list