aboutsummaryrefslogtreecommitdiffstats
path: root/test/Other/constant-fold-gep.ll
blob: 513918d58f6e6241b666ddd5ed65282e2bcd27bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
; RUN: opt -S -o - < %s | FileCheck --check-prefix=PLAIN %s
; RUN: opt -S -o - -instcombine -globalopt < %s | FileCheck --check-prefix=OPT %s

; The automatic constant folder in opt does not have targetdata access, so
; it can't fold gep arithmetic, in general. However, the constant folder run
; from instcombine and global opt does, and can.

; PLAIN: @G8 = global i8* getelementptr (i8* inttoptr (i32 1 to i8*), i32 -1)
; PLAIN: @G1 = global i1* getelementptr (i1* inttoptr (i32 1 to i1*), i32 -1)
; PLAIN: @F8 = global i8* getelementptr (i8* inttoptr (i32 1 to i8*), i32 -2)
; PLAIN: @F1 = global i1* getelementptr (i1* inttoptr (i32 1 to i1*), i32 -2)
; PLAIN: @H8 = global i8* getelementptr (i8* null, i32 -1)
; PLAIN: @H1 = global i1* getelementptr (i1* null, i32 -1)
; PLAIN: define i8* @goo8() nounwind {
; PLAIN:   ret i8* getelementptr (i8* inttoptr (i32 1 to i8*), i32 -1)
; PLAIN: }
; PLAIN: define i1* @goo1() nounwind {
; PLAIN:   ret i1* getelementptr (i1* inttoptr (i32 1 to i1*), i32 -1)
; PLAIN: }
; PLAIN: define i8* @foo8() nounwind {
; PLAIN:   ret i8* getelementptr (i8* inttoptr (i32 1 to i8*), i32 -2)
; PLAIN: }
; PLAIN: define i1* @foo1() nounwind {
; PLAIN:   ret i1* getelementptr (i1* inttoptr (i32 1 to i1*), i32 -2)
; PLAIN: }
; PLAIN: define i8* @hoo8() nounwind {
; PLAIN:   ret i8* getelementptr (i8* null, i32 -1)
; PLAIN: }
; PLAIN: define i1* @hoo1() nounwind {
; PLAIN:   ret i1* getelementptr (i1* null, i32 -1)
; PLAIN: }

; OPT: @G8 = global i8* null
; OPT: @G1 = global i1* null
; OPT: @F8 = global i8* inttoptr (i64 -1 to i8*)
; OPT: @F1 = global i1* inttoptr (i64 -1 to i1*)
; OPT: @H8 = global i8* inttoptr (i64 -1 to i8*)
; OPT: @H1 = global i1* inttoptr (i64 -1 to i1*)
; OPT: define i8* @goo8() nounwind {
; OPT:   ret i8* null
; OPT: }
; OPT: define i1* @goo1() nounwind {
; OPT:   ret i1* null
; OPT: }
; OPT: define i8* @foo8() nounwind {
; OPT:   ret i8* inttoptr (i64 -1 to i8*)
; OPT: }
; OPT: define i1* @foo1() nounwind {
; OPT:   ret i1* inttoptr (i64 -1 to i1*)
; OPT: }
; OPT: define i8* @hoo8() nounwind {
; OPT:   ret i8* inttoptr (i64 -1 to i8*)
; OPT: }
; OPT: define i1* @hoo1() nounwind {
; OPT:   ret i1* inttoptr (i64 -1 to i1*)
; OPT: }

target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64"

@G8 = global i8* getelementptr (i8* inttoptr (i32 1 to i8*), i32 -1)
@G1 = global i1* getelementptr (i1* inttoptr (i32 1 to i1*), i32 -1)
@F8 = global i8* getelementptr (i8* inttoptr (i32 1 to i8*), i32 -2)
@F1 = global i1* getelementptr (i1* inttoptr (i32 1 to i1*), i32 -2)
@H8 = global i8* getelementptr (i8* inttoptr (i32 0 to i8*), i32 -1)
@H1 = global i1* getelementptr (i1* inttoptr (i32 0 to i1*), i32 -1)

define i8* @goo8() nounwind {
  ret i8* getelementptr (i8* inttoptr (i32 1 to i8*), i32 -1)
}
define i1* @goo1() nounwind {
  ret i1* getelementptr (i1* inttoptr (i32 1 to i1*), i32 -1)
}
define i8* @foo8() nounwind {
  ret i8* getelementptr (i8* inttoptr (i32 1 to i8*), i32 -2)
}
define i1* @foo1() nounwind {
  ret i1* getelementptr (i1* inttoptr (i32 1 to i1*), i32 -2)
}
define i8* @hoo8() nounwind {
  ret i8* getelementptr (i8* inttoptr (i32 0 to i8*), i32 -1)
}
define i1* @hoo1() nounwind {
  ret i1* getelementptr (i1* inttoptr (i32 0 to i1*), i32 -1)
}