Move replaceCongruentIVs into SCEVExapander and bias toward "expanded"
[oota-llvm.git] / test / Transforms / SimplifyLibCalls / StrNCmp.ll
1 ; Test that the StrCmpOptimizer works correctly
2 ; RUN: opt < %s -simplify-libcalls -S | FileCheck %s
3
4 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"
5
6 @hello = constant [6 x i8] c"hello\00"          ; <[6 x i8]*> [#uses=1]
7 @hell = constant [5 x i8] c"hell\00"            ; <[5 x i8]*> [#uses=1]
8 @bell = constant [5 x i8] c"bell\00"            ; <[5 x i8]*> [#uses=1]
9 @null = constant [1 x i8] zeroinitializer               ; <[1 x i8]*> [#uses=1]
10
11 declare i32 @strncmp(i8*, i8*, i32)
12
13 ; strcmp("", x) -> -*x
14 define i32 @test1(i8* %str) {
15   %temp1 = call i32 @strncmp(i8* getelementptr inbounds ([1 x i8]* @null, i32 0, i32 0), i8* %str, i32 10)
16   ret i32 %temp1
17   ; CHECK: @test1
18   ; CHECK: %strcmpload = load i8* %str
19   ; CHECK: %1 = zext i8 %strcmpload to i32
20   ; CHECK: %temp1 = sub i32 0, %1
21   ; CHECK: ret i32 %temp1
22 }
23
24 ; strcmp(x, "") -> *x
25 define i32 @test2(i8* %str) {
26   %temp1 = call i32 @strncmp(i8* %str, i8* getelementptr inbounds ([1 x i8]* @null, i32 0, i32 0), i32 10)
27   ret i32 %temp1
28   ; CHECK: @test2
29   ; CHECK: %strcmpload = load i8* %str
30   ; CHECK: %temp1 = zext i8 %strcmpload to i32
31   ; CHECK: ret i32 %temp1
32 }
33
34 ; strncmp(x, y, n)  -> cnst
35 define i32 @test3() {
36   %temp1 = call i32 @strncmp(i8* getelementptr inbounds ([5 x i8]* @hell, i32 0, i32 0), i8* getelementptr inbounds ([6 x i8]* @hello, i32 0, i32 0), i32 10)
37   ret i32 %temp1
38   ; CHECK: @test3
39   ; CHECK: ret i32 -1
40 }
41 define i32 @test4() {
42   %temp1 = call i32 @strncmp(i8* getelementptr inbounds ([5 x i8]* @hell, i32 0, i32 0), i8* getelementptr inbounds ([1 x i8]* @null, i32 0, i32 0), i32 10)
43   ret i32 %temp1
44   ; CHECK: @test4
45   ; CHECK: ret i32 1
46 }
47 define i32 @test5() {
48   %temp1 = call i32 @strncmp(i8* getelementptr inbounds ([5 x i8]* @hell, i32 0, i32 0), i8* getelementptr inbounds ([6 x i8]* @hello, i32 0, i32 0), i32 4)
49   ret i32 %temp1
50   ; CHECK: @test5
51   ; CHECK: ret i32 0
52 }
53
54 ; strncmp(x,y,1) -> memcmp(x,y,1)
55 define i32 @test6(i8* %str1, i8* %str2) {
56   %temp1 = call i32 @strncmp(i8* %str1, i8* %str2, i32 1)
57   ret i32 %temp1
58   ; CHECK: @test6
59   ; CHECK: load i8*
60   ; CHECK: load i8*
61   ; CHECK: sub i32
62 }
63
64 ; strncmp(x,y,0)   -> 0
65 define i32 @test7(i8* %str1, i8* %str2) {
66   %temp1 = call i32 @strncmp(i8* %str1, i8* %str2, i32 0)
67   ret i32 %temp1
68   ; CHECK: @test7
69   ; CHECK: ret i32 0
70 }
71
72 ; strncmp(x,x,n)  -> 0
73 define i32 @test8(i8* %str, i32 %n) {
74   %temp1 = call i32 @strncmp(i8* %str, i8* %str, i32 %n)
75   ret i32 %temp1
76   ; CHECK: @test8
77   ; CHECK: ret i32 0
78 }