[llvm] r282278 - [TLI] isdigit / isascii / toascii param type should match return type (PR30484)

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 23 11:44:10 PDT 2016


Author: spatel
Date: Fri Sep 23 13:44:09 2016
New Revision: 282278

URL: http://llvm.org/viewvc/llvm-project?rev=282278&view=rev
Log:
[TLI] isdigit / isascii / toascii param type should match return type (PR30484)

We crash in LibCallSimplifier if we don't check the validity of the function signature properly.

Modified:
    llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp
    llvm/trunk/test/Transforms/InstCombine/simplify-libcalls.ll

Modified: llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp?rev=282278&r1=282277&r2=282278&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp (original)
+++ llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp Fri Sep 23 13:44:09 2016
@@ -957,11 +957,14 @@ bool TargetLibraryInfoImpl::isValidProto
   case LibFunc::ffs:
   case LibFunc::ffsl:
   case LibFunc::ffsll:
+    return (NumParams == 1 && FTy.getReturnType()->isIntegerTy(32) &&
+            FTy.getParamType(0)->isIntegerTy());
+
   case LibFunc::isdigit:
   case LibFunc::isascii:
   case LibFunc::toascii:
     return (NumParams == 1 && FTy.getReturnType()->isIntegerTy(32) &&
-            FTy.getParamType(0)->isIntegerTy());
+            FTy.getReturnType() == FTy.getParamType(0));
 
   case LibFunc::fls:
   case LibFunc::flsl:

Modified: llvm/trunk/test/Transforms/InstCombine/simplify-libcalls.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/simplify-libcalls.ll?rev=282278&r1=282277&r2=282278&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/simplify-libcalls.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/simplify-libcalls.ll Fri Sep 23 13:44:09 2016
@@ -141,5 +141,40 @@ define void @test9(i8* %x) {
   ret void
 }
 
+; PR30484 - https://llvm.org/bugs/show_bug.cgi?id=30484
+; These aren't the library functions you're looking for...
+
+declare i32 @isdigit(i8)
+declare i32 @isascii(i8)
+declare i32 @toascii(i8)
+
+define i32 @fake_isdigit(i8 %x) {
+; CHECK-LABEL: @fake_isdigit(
+; CHECK-NEXT:    [[Y:%.*]] = call i32 @isdigit(i8 %x)
+; CHECK-NEXT:    ret i32 [[Y]]
+;
+  %y = call i32 @isdigit(i8 %x)
+  ret i32 %y
+}
+
+define i32 @fake_isascii(i8 %x) {
+; CHECK-LABEL: @fake_isascii(
+; CHECK-NEXT:    [[Y:%.*]] = call i32 @isascii(i8 %x)
+; CHECK-NEXT:    ret i32 [[Y]]
+;
+  %y = call i32 @isascii(i8 %x)
+  ret i32 %y
+}
+
+define i32 @fake_toascii(i8 %x) {
+; CHECK-LABEL: @fake_toascii(
+; CHECK-NEXT:    [[Y:%.*]] = call i32 @toascii(i8 %x)
+; CHECK-NEXT:    ret i32 [[Y]]
+;
+  %y = call i32 @toascii(i8 %x)
+  ret i32 %y
+}
+
+
 attributes #0 = { nobuiltin }
 attributes #1 = { builtin }




More information about the llvm-commits mailing list