1; NOTE: Assertions have been autogenerated by update_test_checks.py
2; RUN: opt < %s -instsimplify -S | FileCheck %s
3target datalayout = "p:32:32"
4
5; Check some past-the-end subtleties.
6
7@opte_a = global i32 0
8@opte_b = global i32 0
9
10; Comparing base addresses of two distinct globals. Never equal.
11
12define zeroext i1 @no_offsets() {
13; CHECK-LABEL: @no_offsets(
14; CHECK:         ret i1 false
15;
16  %t = icmp eq i32* @opte_a, @opte_b
17  ret i1 %t
18}
19
20; Comparing past-the-end addresses of two distinct globals. Never equal.
21
22define zeroext i1 @both_past_the_end() {
23; CHECK-LABEL: @both_past_the_end(
24; CHECK:         ret i1 icmp eq (i32* getelementptr inbounds (i32, i32* @opte_a, i32 1), i32* getelementptr inbounds (i32, i32* @opte_b, i32 1))
25;
26  %x = getelementptr i32, i32* @opte_a, i32 1
27  %y = getelementptr i32, i32* @opte_b, i32 1
28  %t = icmp eq i32* %x, %y
29  ret i1 %t
30  ; TODO: refine this
31}
32
33; Comparing past-the-end addresses of one global to the base address
34; of another. Can't fold this.
35
36define zeroext i1 @just_one_past_the_end() {
37; CHECK-LABEL: @just_one_past_the_end(
38; CHECK:         ret i1 icmp eq (i32* getelementptr inbounds (i32, i32* @opte_a, i32 1), i32* @opte_b)
39;
40  %x = getelementptr i32, i32* @opte_a, i32 1
41  %t = icmp eq i32* %x, @opte_b
42  ret i1 %t
43}
44
45; Comparing base addresses of two distinct allocas. Never equal.
46
47define zeroext i1 @no_alloca_offsets() {
48; CHECK-LABEL: @no_alloca_offsets(
49; CHECK:         ret i1 false
50;
51  %m = alloca i32
52  %n = alloca i32
53  %t = icmp eq i32* %m, %n
54  ret i1 %t
55}
56
57; Comparing past-the-end addresses of two distinct allocas. Never equal.
58
59define zeroext i1 @both_past_the_end_alloca() {
60; CHECK-LABEL: @both_past_the_end_alloca(
61; CHECK:         [[M:%.*]] = alloca i32
62; CHECK-NEXT:    [[N:%.*]] = alloca i32
63; CHECK-NEXT:    [[X:%.*]] = getelementptr i32, i32* [[M]], i32 1
64; CHECK-NEXT:    [[Y:%.*]] = getelementptr i32, i32* [[N]], i32 1
65; CHECK-NEXT:    [[T:%.*]] = icmp eq i32* [[X]], [[Y]]
66; CHECK-NEXT:    ret i1 [[T]]
67;
68  %m = alloca i32
69  %n = alloca i32
70  %x = getelementptr i32, i32* %m, i32 1
71  %y = getelementptr i32, i32* %n, i32 1
72  %t = icmp eq i32* %x, %y
73  ret i1 %t
74  ; TODO: refine this
75}
76
77; Comparing past-the-end addresses of one alloca to the base address
78; of another. Can't fold this.
79
80define zeroext i1 @just_one_past_the_end_alloca() {
81; CHECK-LABEL: @just_one_past_the_end_alloca(
82; CHECK:         [[M:%.*]] = alloca i32
83; CHECK-NEXT:    [[N:%.*]] = alloca i32
84; CHECK-NEXT:    [[X:%.*]] = getelementptr i32, i32* [[M]], i32 1
85; CHECK-NEXT:    [[T:%.*]] = icmp eq i32* [[X]], [[N]]
86; CHECK-NEXT:    ret i1 [[T]]
87;
88  %m = alloca i32
89  %n = alloca i32
90  %x = getelementptr i32, i32* %m, i32 1
91  %t = icmp eq i32* %x, %n
92  ret i1 %t
93}
94