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