https://llvm.org/bugs/show_bug.cgi?id=25462
Bug ID: 25462
Summary: Alias analysis on function noalias argument attribute
inferior to inlined function with scoped-noalias
Product: new-bugs
Version: trunk
Hardware: PC
OS: Linux
Status: NEW
Severity: enhancement
Priority: P
Component: new bugs
Assignee: [email protected]
Reporter: [email protected]
CC: [email protected]
Classification: Unclassified
See the mailing list discussion at
http://lists.llvm.org/pipermail/llvm-dev/2015-November/091949.html
Consider the simple C program:
#include <stdint.h>
#include <stdio.h>
void main_loop(int len, uint8_t *restrict input_buf, uint8_t *restrict
output_buf) {
int i;
uint8_t a, b, c;
#pragma clang loop unroll_count(8)
for (i = 0; i < len; i++) {
a = *input_buf++;
b = *input_buf++;
c = *input_buf++;
a = (uint8_t) (a - 10);
b = (uint8_t) (b - 20);
c = (uint8_t) (c - 30);
*output_buf++ = a;
*output_buf++ = b;
*output_buf++ = c;
}
}
__attribute__((flatten))
void dummy_function(int len, uint8_t *input_buf, uint8_t *output_buf) {
printf("This function exists just to examine inlining behaviour\n");
main_loop(len, input_buf, output_buf);
}
Compile with "clang-3.8 -emit-llvm -fno-slp-vectorize -fno-vectorize
--target=mips-linux-gnu -std=c99 -O2 example.c -c" (note the mips-linux-gnu
target is used to avoid attempts at vectorisation, which I can't seem to
disable when targeting x86). This IR is generated: http://pastebin.com/MXpDvUyw
Running the output through opt with basicaa, tbaa and scoped-noalias
(opt-3.8 -basicaa -tbaa -scoped-noalias -aa-eval -analyze
-print-memdeps example.bc) gives the output shown at
http://pastebin.com/Z99NP6A9. You can see that clobber/def
dependencies are shown throughout main_loop despite the noalias
parameter attributes. e.g.:
Def from: %28 = load i8, i8* %25, align 1, !tbaa !1
store i8 %37, i8* %39, align 1, !tbaa !1
Clobber from: store i8 %37, i8* %39, align 1, !tbaa !1
%42 = load i8, i8* %27, align 1, !tbaa !1
When main_loop is inlined, the scoped noalias metadata is added to all relevant
instructions and so we get the full benefit of adding the restrict annotation.
As Hal notes in the linked llvm-dev thread, it seems basicaa will only look
through a single Phi node.
An additional oddity that may indicate a separate bug is that the printed
memory dependence results for dummy_function include a lot of mysterious
'Unknown' dependencies. Even more mysterious: even more mysterious some
'Unknown' dependencies can be associated with a basic block but not others,
despite the code being perfectly regular.
Unknown in block %.lr.ph.i.preheader
Unknown in block %.lr.ph.i
%101 = load i8, i8* %98, align 1, !tbaa !1, !alias.scope !4, !noalias !7
Unknown
store i8 %104, i8* %95, align 1, !tbaa !1, !alias.scope !7, !noalias !4
--
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
llvm-bugs mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs