Mercurial > hg > CbC > CbC_llvm
comparison test/Transforms/InstCombine/strstr-1.ll @ 0:95c75e76d11b LLVM3.4
LLVM 3.4
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 12 Dec 2013 13:56:28 +0900 |
parents | |
children | afa8332a0e37 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:95c75e76d11b |
---|---|
1 ; Test that the strstr library call simplifier works correctly. | |
2 ; | |
3 ; RUN: opt < %s -instcombine -S | FileCheck %s | |
4 | |
5 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" | |
6 | |
7 @.str = private constant [1 x i8] zeroinitializer | |
8 @.str1 = private constant [2 x i8] c"a\00" | |
9 @.str2 = private constant [6 x i8] c"abcde\00" | |
10 @.str3 = private constant [4 x i8] c"bcd\00" | |
11 | |
12 declare i8* @strstr(i8*, i8*) | |
13 | |
14 ; Check strstr(str, "") -> str. | |
15 | |
16 define i8* @test_simplify1(i8* %str) { | |
17 ; CHECK-LABEL: @test_simplify1( | |
18 %pat = getelementptr inbounds [1 x i8]* @.str, i32 0, i32 0 | |
19 %ret = call i8* @strstr(i8* %str, i8* %pat) | |
20 ret i8* %ret | |
21 ; CHECK-NEXT: ret i8* %str | |
22 } | |
23 | |
24 ; Check strstr(str, "a") -> strchr(str, 'a'). | |
25 | |
26 define i8* @test_simplify2(i8* %str) { | |
27 ; CHECK-LABEL: @test_simplify2( | |
28 %pat = getelementptr inbounds [2 x i8]* @.str1, i32 0, i32 0 | |
29 %ret = call i8* @strstr(i8* %str, i8* %pat) | |
30 ret i8* %ret | |
31 ; CHECK-NEXT: @strchr(i8* %str, i32 97) | |
32 } | |
33 | |
34 ; Check strstr("abcde", "bcd") -> "abcde" + 1. | |
35 | |
36 define i8* @test_simplify3() { | |
37 ; CHECK-LABEL: @test_simplify3( | |
38 %str = getelementptr inbounds [6 x i8]* @.str2, i32 0, i32 0 | |
39 %pat = getelementptr inbounds [4 x i8]* @.str3, i32 0, i32 0 | |
40 %ret = call i8* @strstr(i8* %str, i8* %pat) | |
41 ret i8* %ret | |
42 ; CHECK-NEXT: getelementptr inbounds ([6 x i8]* @.str2, i64 0, i64 1) | |
43 } | |
44 | |
45 ; Check strstr(str, str) -> str. | |
46 | |
47 define i8* @test_simplify4(i8* %str) { | |
48 ; CHECK-LABEL: @test_simplify4( | |
49 %ret = call i8* @strstr(i8* %str, i8* %str) | |
50 ret i8* %ret | |
51 ; CHECK-NEXT: ret i8* %str | |
52 } | |
53 | |
54 ; Check strstr(str, pat) == str -> strncmp(str, pat, strlen(str)) == 0. | |
55 | |
56 define i1 @test_simplify5(i8* %str, i8* %pat) { | |
57 ; CHECK-LABEL: @test_simplify5( | |
58 %ret = call i8* @strstr(i8* %str, i8* %pat) | |
59 %cmp = icmp eq i8* %ret, %str | |
60 ret i1 %cmp | |
61 ; CHECK: [[LEN:%[a-z]+]] = call {{i[0-9]+}} @strlen(i8* %pat) | |
62 ; CHECK: [[NCMP:%[a-z]+]] = call {{i[0-9]+}} @strncmp(i8* %str, i8* %pat, {{i[0-9]+}} [[LEN]]) | |
63 ; CHECK: icmp eq {{i[0-9]+}} [[NCMP]], 0 | |
64 ; CHECK: ret i1 | |
65 } |