mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-26 12:20:42 +00:00
instcombine: Migrate strcat and strncat optimizations
This patch migrates the strcat and strncat optimizations from the simplify-libcalls pass into the instcombine library call simplifier. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@165874 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
; Test that the strcat libcall simplifier works correctly per the
|
||||
; bug found in PR3661.
|
||||
;
|
||||
; RUN: opt < %s -instcombine -S | FileCheck %s
|
||||
|
||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
|
||||
|
||||
@hello = constant [6 x i8] c"hello\00"
|
||||
@null = constant [1 x i8] zeroinitializer
|
||||
@null_hello = constant [7 x i8] c"\00hello\00"
|
||||
|
||||
declare i8* @strcat(i8*, i8*)
|
||||
declare i32 @puts(i8*)
|
||||
|
||||
define i32 @main() {
|
||||
; CHECK: @main
|
||||
; CHECK-NOT: call i8* @strcat
|
||||
; CHECK: call i32 @puts
|
||||
|
||||
%target = alloca [1024 x i8]
|
||||
%arg1 = getelementptr [1024 x i8]* %target, i32 0, i32 0
|
||||
store i8 0, i8* %arg1
|
||||
|
||||
; rslt1 = strcat(target, "hello\00")
|
||||
%arg2 = getelementptr [6 x i8]* @hello, i32 0, i32 0
|
||||
%rslt1 = call i8* @strcat(i8* %arg1, i8* %arg2)
|
||||
|
||||
; rslt2 = strcat(rslt1, "\00")
|
||||
%arg3 = getelementptr [1 x i8]* @null, i32 0, i32 0
|
||||
%rslt2 = call i8* @strcat(i8* %rslt1, i8* %arg3)
|
||||
|
||||
; rslt3 = strcat(rslt2, "\00hello\00")
|
||||
%arg4 = getelementptr [7 x i8]* @null_hello, i32 0, i32 0
|
||||
%rslt3 = call i8* @strcat(i8* %rslt2, i8* %arg4)
|
||||
|
||||
call i32 @puts( i8* %rslt3 )
|
||||
ret i32 0
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
; Test that the strcat libcall simplifier works correctly.
|
||||
;
|
||||
; RUN: opt < %s -instcombine -S | FileCheck %s
|
||||
|
||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
|
||||
|
||||
@hello = constant [6 x i8] c"hello\00"
|
||||
@empty = constant [1 x i8] c"\00"
|
||||
@a = common global [32 x i8] zeroinitializer, align 1
|
||||
|
||||
declare i8* @strcat(i8*, i8*)
|
||||
|
||||
define void @test_simplify1() {
|
||||
; CHECK: @test_simplify1
|
||||
; CHECK-NOT: call i8* @strcat
|
||||
; CHECK: ret void
|
||||
|
||||
%dst = getelementptr [32 x i8]* @a, i32 0, i32 0
|
||||
%src = getelementptr [6 x i8]* @hello, i32 0, i32 0
|
||||
call i8* @strcat(i8* %dst, i8* %src)
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @test_simplify2() {
|
||||
; CHECK: @test_simplify2
|
||||
; CHECK-NEXT: ret void
|
||||
|
||||
%dst = getelementptr [32 x i8]* @a, i32 0, i32 0
|
||||
%src = getelementptr [1 x i8]* @empty, i32 0, i32 0
|
||||
call i8* @strcat(i8* %dst, i8* %src)
|
||||
ret void
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
; Test that the strcat libcall simplifier works correctly.
|
||||
;
|
||||
; RUN: opt < %s -instcombine -S | FileCheck %s
|
||||
|
||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
|
||||
|
||||
@hello = constant [6 x i8] c"hello\00"
|
||||
@empty = constant [1 x i8] c"\00"
|
||||
@a = common global [32 x i8] zeroinitializer, align 1
|
||||
|
||||
declare i16* @strcat(i8*, i8*)
|
||||
|
||||
define void @test_nosimplify1() {
|
||||
; CHECK: @test_nosimplify1
|
||||
; CHECK: call i16* @strcat
|
||||
; CHECK: ret void
|
||||
|
||||
%dst = getelementptr [32 x i8]* @a, i32 0, i32 0
|
||||
%src = getelementptr [6 x i8]* @hello, i32 0, i32 0
|
||||
call i16* @strcat(i8* %dst, i8* %src)
|
||||
ret void
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
; Test that the strncat libcall simplifier works correctly.
|
||||
;
|
||||
; RUN: opt < %s -instcombine -S | FileCheck %s
|
||||
|
||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
|
||||
|
||||
@hello = constant [6 x i8] c"hello\00"
|
||||
@null = constant [1 x i8] zeroinitializer
|
||||
@null_hello = constant [7 x i8] c"\00hello\00"
|
||||
|
||||
declare i8* @strncat(i8*, i8*, i32)
|
||||
declare i32 @puts(i8*)
|
||||
|
||||
define i32 @main() {
|
||||
; CHECK: @main
|
||||
; CHECK-NOT: call i8* @strncat
|
||||
; CHECK: call i32 @puts
|
||||
|
||||
%target = alloca [1024 x i8]
|
||||
%arg1 = getelementptr [1024 x i8]* %target, i32 0, i32 0
|
||||
store i8 0, i8* %arg1
|
||||
|
||||
; rslt1 = strncat(target, "hello\00")
|
||||
%arg2 = getelementptr [6 x i8]* @hello, i32 0, i32 0
|
||||
%rslt1 = call i8* @strncat(i8* %arg1, i8* %arg2, i32 6)
|
||||
|
||||
; rslt2 = strncat(rslt1, "\00")
|
||||
%arg3 = getelementptr [1 x i8]* @null, i32 0, i32 0
|
||||
%rslt2 = call i8* @strncat(i8* %rslt1, i8* %arg3, i32 42)
|
||||
|
||||
; rslt3 = strncat(rslt2, "\00hello\00")
|
||||
%arg4 = getelementptr [7 x i8]* @null_hello, i32 0, i32 0
|
||||
%rslt3 = call i8* @strncat(i8* %rslt2, i8* %arg4, i32 42)
|
||||
|
||||
call i32 @puts(i8* %rslt3)
|
||||
ret i32 0
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
; Test that the strncat libcall simplifier works correctly.
|
||||
;
|
||||
; RUN: opt < %s -instcombine -S | FileCheck %s
|
||||
|
||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
|
||||
|
||||
@hello = constant [6 x i8] c"hello\00"
|
||||
@empty = constant [1 x i8] c"\00"
|
||||
@a = common global [32 x i8] zeroinitializer, align 1
|
||||
|
||||
declare i8* @strncat(i8*, i8*, i32)
|
||||
|
||||
define void @test_simplify1() {
|
||||
; CHECK: @test_simplify1
|
||||
; CHECK-NOT: call i8* @strncat
|
||||
; CHECK: ret void
|
||||
|
||||
%dst = getelementptr [32 x i8]* @a, i32 0, i32 0
|
||||
%src = getelementptr [6 x i8]* @hello, i32 0, i32 0
|
||||
call i8* @strncat(i8* %dst, i8* %src, i32 13)
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @test_simplify2() {
|
||||
; CHECK: @test_simplify2
|
||||
; CHECK-NEXT: ret void
|
||||
|
||||
%dst = getelementptr [32 x i8]* @a, i32 0, i32 0
|
||||
%src = getelementptr [1 x i8]* @empty, i32 0, i32 0
|
||||
call i8* @strncat(i8* %dst, i8* %src, i32 13)
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @test_simplify3() {
|
||||
; CHECK: @test_simplify3
|
||||
; CHECK-NEXT: ret void
|
||||
|
||||
%dst = getelementptr [32 x i8]* @a, i32 0, i32 0
|
||||
%src = getelementptr [6 x i8]* @hello, i32 0, i32 0
|
||||
call i8* @strncat(i8* %dst, i8* %src, i32 0)
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @test_nosimplify1() {
|
||||
; CHECK: @test_nosimplify1
|
||||
; CHECK: call i8* @strncat
|
||||
; CHECK: ret void
|
||||
|
||||
%dst = getelementptr [32 x i8]* @a, i32 0, i32 0
|
||||
%src = getelementptr [6 x i8]* @hello, i32 0, i32 0
|
||||
call i8* @strncat(i8* %dst, i8* %src, i32 1)
|
||||
ret void
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
; Test that the strncat libcall simplifier works correctly.
|
||||
;
|
||||
; RUN: opt < %s -instcombine -S | FileCheck %s
|
||||
|
||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
|
||||
|
||||
@hello = constant [6 x i8] c"hello\00"
|
||||
@empty = constant [1 x i8] c"\00"
|
||||
@a = common global [32 x i8] zeroinitializer, align 1
|
||||
|
||||
declare i16* @strncat(i8*, i8*, i32)
|
||||
|
||||
define void @test_nosimplify1() {
|
||||
; CHECK: @test_nosimplify1
|
||||
; CHECK: call i16* @strncat
|
||||
; CHECK: ret void
|
||||
|
||||
%dst = getelementptr [32 x i8]* @a, i32 0, i32 0
|
||||
%src = getelementptr [6 x i8]* @hello, i32 0, i32 0
|
||||
call i16* @strncat(i8* %dst, i8* %src, i32 13)
|
||||
ret void
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
; Test that the StrCatOptimizer works correctly
|
||||
; PR3661
|
||||
; RUN: opt < %s -simplify-libcalls -S | \
|
||||
; RUN: not grep "call.*strcat"
|
||||
; RUN: opt < %s -simplify-libcalls -S | \
|
||||
; RUN: grep "puts.*%arg1"
|
||||
|
||||
; This transformation requires the pointer size, as it assumes that size_t is
|
||||
; the size of a pointer.
|
||||
target datalayout = "-p:64:64:64"
|
||||
|
||||
@hello = constant [6 x i8] c"hello\00" ; <[6 x i8]*> [#uses=1]
|
||||
@null = constant [1 x i8] zeroinitializer ; <[1 x i8]*> [#uses=1]
|
||||
@null_hello = constant [7 x i8] c"\00hello\00" ; <[7 x i8]*> [#uses=1]
|
||||
|
||||
declare i8* @strcat(i8*, i8*)
|
||||
|
||||
declare i32 @puts(i8*)
|
||||
|
||||
define i32 @main() {
|
||||
%target = alloca [1024 x i8] ; <[1024 x i8]*> [#uses=1]
|
||||
%arg1 = getelementptr [1024 x i8]* %target, i32 0, i32 0 ; <i8*> [#uses=2]
|
||||
store i8 0, i8* %arg1
|
||||
%arg2 = getelementptr [6 x i8]* @hello, i32 0, i32 0 ; <i8*> [#uses=1]
|
||||
%rslt1 = call i8* @strcat( i8* %arg1, i8* %arg2 ) ; <i8*> [#uses=1]
|
||||
%arg3 = getelementptr [1 x i8]* @null, i32 0, i32 0 ; <i8*> [#uses=1]
|
||||
%rslt2 = call i8* @strcat( i8* %rslt1, i8* %arg3 ) ; <i8*> [#uses=1]
|
||||
%arg4 = getelementptr [7 x i8]* @null_hello, i32 0, i32 0 ; <i8*> [#uses=1]
|
||||
%rslt3 = call i8* @strcat( i8* %rslt2, i8* %arg4 ) ; <i8*> [#uses=1]
|
||||
call i32 @puts( i8* %rslt3 ) ; <i32>:1 [#uses=0]
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
; Test that the StrNCatOptimizer works correctly
|
||||
; RUN: opt < %s -simplify-libcalls -S | \
|
||||
; RUN: not grep "call.*strncat"
|
||||
; RUN: opt < %s -simplify-libcalls -S | \
|
||||
; RUN: grep "puts.*%arg1"
|
||||
|
||||
; This transformation requires the pointer size, as it assumes that size_t is
|
||||
; the size of a pointer.
|
||||
target datalayout = "-p:64:64:64"
|
||||
|
||||
@hello = constant [6 x i8] c"hello\00" ; <[6 x i8]*> [#uses=1]
|
||||
@null = constant [1 x i8] zeroinitializer ; <[1 x i8]*> [#uses=1]
|
||||
@null_hello = constant [7 x i8] c"\00hello\00" ; <[7 x i8]*> [#uses=1]
|
||||
|
||||
declare i8* @strncat(i8*, i8*, i32)
|
||||
|
||||
declare i32 @puts(i8*)
|
||||
|
||||
define i32 @main() {
|
||||
%target = alloca [1024 x i8] ; <[1024 x i8]*> [#uses=1]
|
||||
%arg1 = getelementptr [1024 x i8]* %target, i32 0, i32 0 ; <i8*> [#uses=2]
|
||||
store i8 0, i8* %arg1
|
||||
%arg2 = getelementptr [6 x i8]* @hello, i32 0, i32 0 ; <i8*> [#uses=1]
|
||||
%rslt1 = call i8* @strncat( i8* %arg1, i8* %arg2, i32 6 ) ; <i8*> [#uses=1]
|
||||
%arg3 = getelementptr [1 x i8]* @null, i32 0, i32 0 ; <i8*> [#uses=1]
|
||||
%rslt2 = call i8* @strncat( i8* %rslt1, i8* %arg3, i32 42 ) ; <i8*> [#uses=1]
|
||||
%arg4 = getelementptr [7 x i8]* @null_hello, i32 0, i32 0 ; <i8*> [#uses=1]
|
||||
%rslt3 = call i8* @strncat( i8* %rslt2, i8* %arg4, i32 42 ) ; <i8*> [#uses=1]
|
||||
call i32 @puts( i8* %rslt3 ) ; <i32>:1 [#uses=0]
|
||||
ret i32 0
|
||||
}
|
||||
Reference in New Issue
Block a user