[llvm-commits] CVS: llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp
Reid Spencer
reid at x10sys.com
Wed Apr 27 21:40:17 PDT 2005
Changes in directory llvm/lib/Transforms/IPO:
SimplifyLibCalls.cpp updated: 1.19 -> 1.20
---
Log message:
Document additional libcall transformations that need to be written.
Help Wanted!
There's a lot of them to write.
---
Diffs of the changes: (+183 -2)
SimplifyLibCalls.cpp | 185 ++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 183 insertions(+), 2 deletions(-)
Index: llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp
diff -u llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.19 llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.20
--- llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.19 Wed Apr 27 16:29:20 2005
+++ llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp Wed Apr 27 23:40:06 2005
@@ -741,6 +741,187 @@
return true; // success!
}
-// TODO: Additional cases that we need to add to this file:
-// 1. memmove -> memcpy if src is a global constant array
+// TODO:
+// Additional cases that we need to add to this file:
+//
+// abs:
+// * abs(cnst) -> cnst'
+//
+// atan:
+// * atan(0.0) -> 0.0
+// * atan(1.0) -> pi/4
+//
+// cbrt:
+// * cbrt(constant) -> constant'
+// * cbrt(expN(X)) -> expN(x/3)
+// * cbrt(sqrt(x)) -> pow(x,1/6)
+// * cbrt(sqrt(x)) -> pow(x,1/9)
+//
+// ceil, ceilf, ceill:
+// * ceil(constant) -> constant'
+//
+// cos, cosf, cosl:
+// * cos(0.0) -> 1.0
+// * cox(-x) -> cos(x)
+//
+// exp, expf, expl:
+// * exp(0.0) -> 1.0
+// * exp(int) -> contant'
+// * exp(log(x)) -> x
+//
+// fabs, fabsf, fabsl:
+// * fabs(cnst) -> cnst'
+//
+// ffs, ffsl, ffsll:
+// * ffs(cnst) -> cnst'
+//
+// floor, floorf, floorl:
+// * floor(cnst) -> cnst'
+//
+// fprintf:
+// * fprintf(file,fmt) -> fputs(fmt,file)
+// (if fmt is constant and constains no % characters)
+// * fprintf(file,"%s",str) -> fputs(orig,str)
+// (only if the fprintf result is not used)
+// * fprintf(file,"%c",chr) -> fputc(chr,file)
+//
+// fputs: (only if the result is not used)
+// * fputs("",F) -> noop
+// * fputs(s,F) -> fputc(s[0],F) (if s is constant and strlen(s) == 1)
+// * fputs(s,F) -> fwrite(s, 1, len, F) (if s is constant and strlen(s) > 1)
+//
+// isascii:
+// * isascii(c) -> ((c & ~0x7f) == 0)
+//
+// isdigit:
+// * isdigit(c) -> (unsigned)(c) - '0' <= 9
+//
+// log, logf, logl:
+// * log(1.0) -> 0.0
+// * log(exp(x)) -> x
+// * log(x**y) -> y*log(x)
+// * log(exp(y)) -> y*log(e)
+// * log(exp2(y)) -> y*log(2)
+// * log(exp10(y)) -> y*log(10)
+// * log(sqrt(x)) -> 0.5*log(x)
+// * log(pow(x,y)) -> y*log(x)
+//
+// lround, lroundf, lroundl:
+// * lround(cnst) -> cnst'
+//
+// memcmp:
+// * memcmp(s1,s2,0) -> 0
+// * memcmp(x,x,l) -> 0
+// * memcmp(x,y,l) -> cnst
+// (if all arguments are constant and strlen(x) <= l and strlen(y) <= l)
+// * memcpy(x,y,1) -> *x - *y
+//
+// memcpy:
+// * memcpy(d,s,0,a) -> d
+//
+// memmove:
+// * memmove(d,s,l,a) -> memcpy(d,s,l,a)
+// (if s is a global constant array)
+//
+// memset:
+// * memset(s,c,0) -> noop
+// * memset(s,c,n) -> store s, c
+// (for n=1,2,4,8)
+//
+// pow, powf, powl:
+// * pow(1.0,y) -> 1.0
+// * pow(x,0.0) -> 1.0
+// * pow(x,1.0) -> x
+// * pow(x,-1.0) -> 1.0/x
+// * pow(x,0.5) -> sqrt(x)
+// * pow(cst1,cst2) -> const1**const2
+// * pow(exp(x),y) -> exp(x*y)
+// * pow(sqrt(x),y) -> pow(x,y*0.5)
+// * pow(pow(x,y),z)-> pow(x,y*z)
+//
+// puts:
+// * puts("") -> fputc("\n",stdout) (how do we get "stdout"?)
+//
+// round, roundf, roundl:
+// * round(cnst) -> cnst'
+//
+// signbit:
+// * signbit(cnst) -> cnst'
+// * signbit(nncst) -> 0 (if pstv is a non-negative constant)
+//
+// sin, sinf, sinl:
+// * sin(0.0) -> 0.0
+//
+// sprintf:
+// * sprintf(dest,fmt) -> strcpy(dest,fmt)
+// (if fmt is constant and constains no % characters)
+// * sprintf(dest,"%s",orig) -> strcpy(dest,orig)
+// (only if the sprintf result is not used)
+//
+// sqrt, sqrtf, sqrtl:
+// * sqrt(cnst) -> cnst'
+// * sqrt(expN(x)) -> expN(x*0.5)
+// * sqrt(Nroot(x)) -> pow(x,1/(2*N))
+// * sqrt(pow(x,y)) -> pow(|x|,y*0.5)
+//
+// strchr, strrchr:
+// * strchr(s,c) -> offset_of_in(c,s)
+// (if c is a constant integer and s is a constant string)
+// * strrchr(s,c) -> reverse_offset_of_in(c,s)
+// (if c is a constant integer and s is a constant string)
+// * strrchr(s1,0) -> strchr(s1,0)
+//
+// strcmp:
+// * strcmp(x,x) -> 0
+// * strcmp(x,"") -> *x
+// * strcmp("",x) -> *x
+// * strcmp(x,y) -> cnst (if both x and y are constant strings)
+//
+// strncat:
+// * strncat(x,y,0) -> x
+// * strncat(x,y,0) -> x (if strlen(y) = 0)
+// * strncat(x,y,l) -> strcat(x,y) (if y and l are constants an l > strlen(y))
+//
+// strncmp:
+// * strncmp(x,y,0) -> 0
+// * strncmp(x,x,l) -> 0
+// * strncmp(x,"",l) -> *x
+// * strncmp("",x,l) -> *x
+// * strncmp(x,y,1) -> *x - *y
+//
+// strncpy:
+// * strncpy(d,s,0) -> d
+// * strncpy(d,s,l) -> memcpy(d,s,l,1)
+// (if s and l are constants)
+//
+// strpbrk:
+// * strpbrk(s,a) -> offset_in_for(s,a)
+// (if s and a are both constant strings)
+// * strpbrk(s,"") -> 0
+// * strpbrk(s,a) -> strchr(s,a[0]) (if a is constant string of length 1)
+//
+// strspn, strcspn:
+// * strspn(s,a) -> const_int (if both args are constant)
+// * strspn("",a) -> 0
+// * strspn(s,"") -> 0
+// * strcspn(s,a) -> const_int (if both args are constant)
+// * strcspn("",a) -> 0
+// * strcspn(s,"") -> strlen(a)
+//
+// strstr:
+// * strstr(x,x) -> x
+// * strstr(s1,s2) -> offset_of_s2_in(s1)
+// (if s1 and s2 are constant strings)
+//
+// tan, tanf, tanl:
+// * tan(0.0) -> 0.0
+// * tan(atan(x)) -> x
+//
+// toascii:
+// * toascii(c) -> (c & 0x7f)
+//
+// trunc, truncf, truncl:
+// * trunc(cnst) -> cnst'
+//
+//
}
More information about the llvm-commits
mailing list