[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / ADCE / basictest2.ll
blob50336e18705351149d2428ed43c00ee14fd084e0
1 ; RUN: opt < %s -adce -disable-output
2 ; RUN: opt < %s -adce -adce-remove-loops -S | FileCheck %s
4         %FILE = type { i32, i8*, i8*, i8, i8, i32, i32, i32 }
5         %spec_fd_t = type { i32, i32, i32, i8* }
6 @__iob = external global [20 x %FILE]           ; <[20 x %FILE]*> [#uses=1]
7 @dbglvl = global i32 4          ; <i32*> [#uses=3]
8 @spec_fd = external global [3 x %spec_fd_t]             ; <[3 x %spec_fd_t]*> [#uses=4]
9 @.LC9 = internal global [34 x i8] c"spec_read: fd=%d, > MAX_SPEC_FD!\0A\00"             ; <[34 x i8]*> [#uses=1]
10 @.LC10 = internal global [4 x i8] c"EOF\00"             ; <[4 x i8]*> [#uses=1]
11 @.LC11 = internal global [4 x i8] c"%d\0A\00"           ; <[4 x i8]*> [#uses=1]
12 @.LC12 = internal global [17 x i8] c"spec_getc: %d = \00"               ; <[17 x i8]*> [#uses=1]
14 declare i32 @fprintf(%FILE*, i8*, ...)
16 declare void @exit(i32)
18 declare i32 @remove(i8*)
20 declare i32 @fputc(i32, %FILE*)
22 declare i32 @fwrite(i8*, i32, i32, %FILE*)
24 declare void @perror(i8*)
26 define i32 @spec_getc(i32 %fd) {
27         %reg109 = load i32, i32* @dbglvl                ; <i32> [#uses=1]
28         %cond266 = icmp sle i32 %reg109, 4              ; <i1> [#uses=1]
29 ; CHECK: br label %bb3
30         br i1 %cond266, label %bb3, label %bb2
32 bb2:            ; preds = %0
33         %cast273 = getelementptr [17 x i8], [17 x i8]* @.LC12, i64 0, i64 0             ; <i8*> [#uses=0]
34         br label %bb3
36 bb3:            ; preds = %bb2, %0
37         %cond267 = icmp sle i32 %fd, 3          ; <i1> [#uses=0]
38         br label %bb5
40 bb4:            ; No predecessors!
41         %reg111 = getelementptr [20 x %FILE], [20 x %FILE]* @__iob, i64 0, i64 1, i32 3         ; <i8*> [#uses=1]
42         %cast274 = getelementptr [34 x i8], [34 x i8]* @.LC9, i64 0, i64 0              ; <i8*> [#uses=0]
43         %cast282 = bitcast i8* %reg111 to %FILE*                ; <%FILE*> [#uses=0]
44         call void @exit( i32 1 )
45         br label %UnifiedExitNode
47 bb5:            ; preds = %bb3
48         %reg107-idxcast1 = sext i32 %fd to i64          ; <i64> [#uses=2]
49         %reg107-idxcast2 = sext i32 %fd to i64          ; <i64> [#uses=1]
50         %reg1311 = getelementptr [3 x %spec_fd_t], [3 x %spec_fd_t]* @spec_fd, i64 0, i64 %reg107-idxcast2              ; <%spec_fd_t*> [#uses=1]
51         %idx1 = getelementptr [3 x %spec_fd_t], [3 x %spec_fd_t]* @spec_fd, i64 0, i64 %reg107-idxcast1, i32 2          ; <i32*> [#uses=1]
52         %reg1321 = load i32, i32* %idx1         ; <i32> [#uses=3]
53         %idx2 = getelementptr %spec_fd_t, %spec_fd_t* %reg1311, i64 0, i32 1            ; <i32*> [#uses=1]
54         %reg1331 = load i32, i32* %idx2         ; <i32> [#uses=1]
55         %cond270 = icmp slt i32 %reg1321, %reg1331              ; <i1> [#uses=1]
56         br i1 %cond270, label %bb9, label %bb6
58 bb6:            ; preds = %bb5
59         %reg134 = load i32, i32* @dbglvl                ; <i32> [#uses=1]
60         %cond271 = icmp sle i32 %reg134, 4              ; <i1> [#uses=1]
61 ; CHECK: br label %bb8
62         br i1 %cond271, label %bb8, label %bb7
64 bb7:            ; preds = %bb6
65         %cast277 = getelementptr [4 x i8], [4 x i8]* @.LC10, i64 0, i64 0               ; <i8*> [#uses=0]
66         br label %bb8
68 bb8:            ; preds = %bb7, %bb6
69         br label %UnifiedExitNode
71 bb9:            ; preds = %bb5
72         %reg107-idxcast3 = sext i32 %fd to i64          ; <i64> [#uses=1]
73         %idx3 = getelementptr [3 x %spec_fd_t], [3 x %spec_fd_t]* @spec_fd, i64 0, i64 %reg107-idxcast3, i32 3          ; <i8**> [#uses=1]
74         %reg1601 = load i8*, i8** %idx3         ; <i8*> [#uses=1]
75         %reg132-idxcast1 = sext i32 %reg1321 to i64             ; <i64> [#uses=1]
76         %idx4 = getelementptr i8, i8* %reg1601, i64 %reg132-idxcast1            ; <i8*> [#uses=1]
77         %reg1621 = load i8, i8* %idx4           ; <i8> [#uses=2]
78         %cast108 = zext i8 %reg1621 to i64              ; <i64> [#uses=0]
79         %reg157 = add i32 %reg1321, 1           ; <i32> [#uses=1]
80         %idx5 = getelementptr [3 x %spec_fd_t], [3 x %spec_fd_t]* @spec_fd, i64 0, i64 %reg107-idxcast1, i32 2          ; <i32*> [#uses=1]
81         store i32 %reg157, i32* %idx5
82         %reg163 = load i32, i32* @dbglvl                ; <i32> [#uses=1]
83         %cond272 = icmp sle i32 %reg163, 4              ; <i1> [#uses=1]
84 ; CHECK: br label %bb11
85         br i1 %cond272, label %bb11, label %bb10
87 bb10:           ; preds = %bb9
88         %cast279 = getelementptr [4 x i8], [4 x i8]* @.LC11, i64 0, i64 0               ; <i8*> [#uses=0]
89         br label %bb11
91 bb11:           ; preds = %bb10, %bb9
92         %cast291 = zext i8 %reg1621 to i32              ; <i32> [#uses=1]
93         br label %UnifiedExitNode
95 UnifiedExitNode:                ; preds = %bb11, %bb8, %bb4
96         %UnifiedRetVal = phi i32 [ 42, %bb4 ], [ -1, %bb8 ], [ %cast291, %bb11 ]                ; <i32> [#uses=1]
97         ret i32 %UnifiedRetVal
100 declare i32 @puts(i8*)
102 declare i32 @printf(i8*, ...)