[llvm] r268922 - Optimize a printf with a double procent to putchar.

Joerg Sonnenberger via llvm-commits llvm-commits at lists.llvm.org
Mon May 9 07:36:17 PDT 2016


Author: joerg
Date: Mon May  9 09:36:16 2016
New Revision: 268922

URL: http://llvm.org/viewvc/llvm-project?rev=268922&view=rev
Log:
Optimize a printf with a double procent to putchar.

Modified:
    llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp
    llvm/trunk/test/Transforms/InstCombine/printf-1.ll

Modified: llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp?rev=268922&r1=268921&r2=268922&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp Mon May  9 09:36:16 2016
@@ -1598,8 +1598,8 @@ Value *LibCallSimplifier::optimizePrintF
   if (!CI->use_empty())
     return nullptr;
 
-  // printf("x") -> putchar('x'), even for '%'.
-  if (FormatStr.size() == 1)
+  // printf("x") -> putchar('x'), even for "%" and "%%".
+  if (FormatStr.size() == 1 || FormatStr == "%%")
     return emitPutChar(B.getInt32(FormatStr[0]), B, TLI);
 
   // printf("%s", "a") --> putchar('a')

Modified: llvm/trunk/test/Transforms/InstCombine/printf-1.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/printf-1.ll?rev=268922&r1=268921&r2=268922&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/printf-1.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/printf-1.ll Mon May  9 09:36:16 2016
@@ -7,6 +7,7 @@ target datalayout = "e-p:32:32:32-i1:8:8
 
 @hello_world = constant [13 x i8] c"hello world\0A\00"
 @h = constant [2 x i8] c"h\00"
+ at h2 = constant [3 x i8] c"%%\00"
 @percent = constant [2 x i8] c"%\00"
 @percent_c = constant [3 x i8] c"%c\00"
 @percent_d = constant [3 x i8] c"%d\00"
@@ -37,6 +38,17 @@ define void @test_simplify2() {
   ret void
 ; CHECK-NEXT: ret void
 }
+
+; Special case: printf("%%") -> putchar('%').
+
+define void @test_simplify2b() {
+; CHECK-LABEL: @test_simplify2b(
+  %fmt = getelementptr [3 x i8], [3 x i8]* @h2, i32 0, i32 0
+  call i32 (i8*, ...) @printf(i8* %fmt)
+; CHECK-NEXT: call i32 @putchar(i32 37)
+  ret void
+; CHECK-NEXT: ret void
+}
 
 define void @test_simplify3() {
 ; CHECK-LABEL: @test_simplify3(




More information about the llvm-commits mailing list