xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/pointercast.ll (revision 13ffde316a8541d77116bd18f73efada236617f3)
1abc14518SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
28ebb3eacSBjorn Pettersson; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3abc14518SFlorian Hahn
4*34e477e9SFlorian Hahndefine i1 @gep0_and_cmp(ptr readonly %src, ptr readnone %min, ptr readnone %max) {
5af0087c0SFlorian Hahn; CHECK-LABEL: @gep0_and_cmp(
6af0087c0SFlorian Hahn; CHECK-NEXT:  check.0.min:
7*34e477e9SFlorian Hahn; CHECK-NEXT:    [[SRC_C:%.*]] = getelementptr i32, ptr [[SRC:%.*]], i64 0
8*34e477e9SFlorian Hahn; CHECK-NEXT:    [[MIN_C:%.*]] = getelementptr i32, ptr [[MIN:%.*]], i64 0
9*34e477e9SFlorian Hahn; CHECK-NEXT:    [[GEP_3:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 3
10*34e477e9SFlorian Hahn; CHECK-NEXT:    [[GEP_3_C:%.*]] = getelementptr i32, ptr [[GEP_3]], i32 0
11*34e477e9SFlorian Hahn; CHECK-NEXT:    [[C_MIN_0:%.*]] = icmp ult ptr [[SRC_C]], [[MIN_C]]
12*34e477e9SFlorian Hahn; CHECK-NEXT:    [[C_MAX_3:%.*]] = icmp ugt ptr [[GEP_3_C]], [[MAX:%.*]]
13af0087c0SFlorian Hahn; CHECK-NEXT:    [[OR:%.*]] = or i1 [[C_MIN_0]], [[C_MAX_3]]
14af0087c0SFlorian Hahn; CHECK-NEXT:    br i1 [[OR]], label [[TRAP:%.*]], label [[CHECKS:%.*]]
15af0087c0SFlorian Hahn; CHECK:       trap:
16af0087c0SFlorian Hahn; CHECK-NEXT:    ret i1 false
17af0087c0SFlorian Hahn; CHECK:       checks:
18*34e477e9SFlorian Hahn; CHECK-NEXT:    [[C_3_MAX:%.*]] = icmp ult ptr [[GEP_3]], [[MAX]]
19af0087c0SFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 false, [[C_3_MAX]]
20*34e477e9SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 1
21af0087c0SFlorian Hahn; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 false, true
22*34e477e9SFlorian Hahn; CHECK-NEXT:    [[GEP_2:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 2
23af0087c0SFlorian Hahn; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 false, true
24*34e477e9SFlorian Hahn; CHECK-NEXT:    [[GEP_4:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 4
25*34e477e9SFlorian Hahn; CHECK-NEXT:    [[C_4_MAX:%.*]] = icmp ult ptr [[GEP_4]], [[MAX]]
26af0087c0SFlorian Hahn; CHECK-NEXT:    [[RES_4:%.*]] = xor i1 false, [[C_4_MAX]]
27af0087c0SFlorian Hahn; CHECK-NEXT:    [[RES_5:%.*]] = xor i1 [[RES_1]], [[RES_2]]
28af0087c0SFlorian Hahn; CHECK-NEXT:    [[RES_6:%.*]] = xor i1 [[RES_5]], [[RES_3]]
29af0087c0SFlorian Hahn; CHECK-NEXT:    [[RES_7:%.*]] = xor i1 [[RES_6]], [[RES_4]]
30af0087c0SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_7]]
31af0087c0SFlorian Hahn;
32af0087c0SFlorian Hahncheck.0.min:
33*34e477e9SFlorian Hahn  %src.c = getelementptr i32, ptr %src, i64 0
34*34e477e9SFlorian Hahn  %min.c = getelementptr i32, ptr %min, i64 0
35af0087c0SFlorian Hahn
36*34e477e9SFlorian Hahn  %gep.3 = getelementptr inbounds i32, ptr %src, i64 3
37*34e477e9SFlorian Hahn  %gep.3.c = getelementptr i32, ptr %gep.3, i32 0
38*34e477e9SFlorian Hahn  %c.min.0 = icmp ult ptr %src.c, %min.c
39*34e477e9SFlorian Hahn  %c.max.3 = icmp ugt ptr %gep.3.c, %max
40af0087c0SFlorian Hahn
41af0087c0SFlorian Hahn  %or = or i1 %c.min.0, %c.max.3
42af0087c0SFlorian Hahn  br i1 %or, label %trap, label %checks
43af0087c0SFlorian Hahn
44af0087c0SFlorian Hahntrap:
45af0087c0SFlorian Hahn  ret i1 0
46af0087c0SFlorian Hahn
47af0087c0SFlorian Hahnchecks:
48*34e477e9SFlorian Hahn  %c.3.min = icmp ult ptr %gep.3, %min
49*34e477e9SFlorian Hahn  %c.3.max = icmp ult ptr %gep.3, %max
50af0087c0SFlorian Hahn  %res.1 = xor i1 %c.3.min, %c.3.max
51af0087c0SFlorian Hahn
52*34e477e9SFlorian Hahn  %gep.1 = getelementptr inbounds i32, ptr %src, i64 1
53*34e477e9SFlorian Hahn  %c.1.min = icmp ult ptr %gep.1, %min
54*34e477e9SFlorian Hahn  %c.1.max = icmp ult ptr %gep.1, %max
55af0087c0SFlorian Hahn  %res.2 = xor i1 %c.1.min, %c.1.max
56af0087c0SFlorian Hahn
57*34e477e9SFlorian Hahn  %gep.2 = getelementptr inbounds i32, ptr %src, i64 2
58*34e477e9SFlorian Hahn  %c.2.min = icmp ult ptr %gep.2, %min
59*34e477e9SFlorian Hahn  %c.2.max = icmp ult ptr %gep.2, %max
60af0087c0SFlorian Hahn  %res.3 = xor i1 %c.2.min, %c.2.max
61af0087c0SFlorian Hahn
62*34e477e9SFlorian Hahn  %gep.4 = getelementptr inbounds i32, ptr %src, i64 4
63*34e477e9SFlorian Hahn  %c.4.min = icmp ult ptr %gep.4, %min
64*34e477e9SFlorian Hahn  %c.4.max = icmp ult ptr %gep.4, %max
65af0087c0SFlorian Hahn  %res.4 = xor i1 %c.4.min, %c.4.max
66af0087c0SFlorian Hahn
67af0087c0SFlorian Hahn  %res.5 = xor i1 %res.1, %res.2
68af0087c0SFlorian Hahn  %res.6 = xor i1 %res.5, %res.3
69af0087c0SFlorian Hahn  %res.7 = xor i1 %res.6, %res.4
70af0087c0SFlorian Hahn
71af0087c0SFlorian Hahn  ret i1 %res.7
72af0087c0SFlorian Hahn}
73af0087c0SFlorian Hahn
74af0087c0SFlorian Hahn; Should not look through addresspacecast, because it may change the pointer
75af0087c0SFlorian Hahn; value.
76*34e477e9SFlorian Hahndefine i1 @addrspacecast_and_cmp(ptr readonly %src, ptr readnone %min, ptr readnone %max) {
77af0087c0SFlorian Hahn; CHECK-LABEL: @addrspacecast_and_cmp(
78af0087c0SFlorian Hahn; CHECK-NEXT:  check.0.min:
79*34e477e9SFlorian Hahn; CHECK-NEXT:    [[SRC_C:%.*]] = addrspacecast ptr [[SRC:%.*]] to ptr addrspace(1)
80*34e477e9SFlorian Hahn; CHECK-NEXT:    [[MIN_C:%.*]] = addrspacecast ptr [[MIN:%.*]] to ptr addrspace(1)
81*34e477e9SFlorian Hahn; CHECK-NEXT:    [[MAX_C:%.*]] = addrspacecast ptr [[MAX:%.*]] to ptr addrspace(1)
82*34e477e9SFlorian Hahn; CHECK-NEXT:    [[GEP_3:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 3
83*34e477e9SFlorian Hahn; CHECK-NEXT:    [[GEP_3_C:%.*]] = addrspacecast ptr [[GEP_3]] to ptr addrspace(1)
84*34e477e9SFlorian Hahn; CHECK-NEXT:    [[C_MIN_0:%.*]] = icmp ult ptr addrspace(1) [[SRC_C]], [[MIN_C]]
85*34e477e9SFlorian Hahn; CHECK-NEXT:    [[C_MAX_3:%.*]] = icmp ugt ptr addrspace(1) [[GEP_3_C]], [[MAX_C]]
86af0087c0SFlorian Hahn; CHECK-NEXT:    [[OR:%.*]] = or i1 [[C_MIN_0]], [[C_MAX_3]]
87af0087c0SFlorian Hahn; CHECK-NEXT:    br i1 [[OR]], label [[TRAP:%.*]], label [[CHECKS:%.*]]
88af0087c0SFlorian Hahn; CHECK:       trap:
89af0087c0SFlorian Hahn; CHECK-NEXT:    ret i1 false
90af0087c0SFlorian Hahn; CHECK:       checks:
91*34e477e9SFlorian Hahn; CHECK-NEXT:    [[C_3_MIN:%.*]] = icmp ult ptr [[GEP_3]], [[MIN]]
92*34e477e9SFlorian Hahn; CHECK-NEXT:    [[C_3_MAX:%.*]] = icmp ult ptr [[GEP_3]], [[MAX]]
934858e081SFlorian Hahn; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[C_3_MIN]], [[C_3_MAX]]
94*34e477e9SFlorian Hahn; CHECK-NEXT:    [[GEP_1:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 1
95*34e477e9SFlorian Hahn; CHECK-NEXT:    [[C_1_MIN:%.*]] = icmp ult ptr [[GEP_1]], [[MIN]]
96*34e477e9SFlorian Hahn; CHECK-NEXT:    [[C_1_MAX:%.*]] = icmp ult ptr [[GEP_1]], [[MAX]]
974858e081SFlorian Hahn; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[C_1_MIN]], [[C_1_MAX]]
98*34e477e9SFlorian Hahn; CHECK-NEXT:    [[GEP_2:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 2
99*34e477e9SFlorian Hahn; CHECK-NEXT:    [[C_2_MIN:%.*]] = icmp ult ptr [[GEP_2]], [[MIN]]
100*34e477e9SFlorian Hahn; CHECK-NEXT:    [[C_2_MAX:%.*]] = icmp ult ptr [[GEP_2]], [[MAX]]
1014858e081SFlorian Hahn; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 [[C_2_MIN]], [[C_2_MAX]]
102*34e477e9SFlorian Hahn; CHECK-NEXT:    [[GEP_4:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 4
103*34e477e9SFlorian Hahn; CHECK-NEXT:    [[C_4_MIN:%.*]] = icmp ult ptr [[GEP_4]], [[MIN]]
104*34e477e9SFlorian Hahn; CHECK-NEXT:    [[C_4_MAX:%.*]] = icmp ult ptr [[GEP_4]], [[MAX]]
1054858e081SFlorian Hahn; CHECK-NEXT:    [[RES_4:%.*]] = xor i1 [[C_4_MIN]], [[C_4_MAX]]
106af0087c0SFlorian Hahn; CHECK-NEXT:    [[RES_5:%.*]] = xor i1 [[RES_1]], [[RES_2]]
107af0087c0SFlorian Hahn; CHECK-NEXT:    [[RES_6:%.*]] = xor i1 [[RES_5]], [[RES_3]]
108af0087c0SFlorian Hahn; CHECK-NEXT:    [[RES_7:%.*]] = xor i1 [[RES_6]], [[RES_4]]
109af0087c0SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES_7]]
110af0087c0SFlorian Hahn;
111af0087c0SFlorian Hahncheck.0.min:
112*34e477e9SFlorian Hahn  %src.c = addrspacecast ptr %src to ptr addrspace(1)
113*34e477e9SFlorian Hahn  %min.c = addrspacecast ptr %min to ptr addrspace(1)
114*34e477e9SFlorian Hahn  %max.c = addrspacecast ptr %max to ptr addrspace(1)
115af0087c0SFlorian Hahn
116*34e477e9SFlorian Hahn  %gep.3 = getelementptr inbounds i32, ptr %src, i64 3
117*34e477e9SFlorian Hahn  %gep.3.c = addrspacecast ptr %gep.3 to ptr addrspace(1)
118*34e477e9SFlorian Hahn  %c.min.0 = icmp ult ptr addrspace(1) %src.c, %min.c
119*34e477e9SFlorian Hahn  %c.max.3 = icmp ugt ptr addrspace(1) %gep.3.c, %max.c
120af0087c0SFlorian Hahn
121af0087c0SFlorian Hahn  %or = or i1 %c.min.0, %c.max.3
122af0087c0SFlorian Hahn  br i1 %or, label %trap, label %checks
123af0087c0SFlorian Hahn
124af0087c0SFlorian Hahntrap:
125af0087c0SFlorian Hahn  ret i1 0
126af0087c0SFlorian Hahn
127af0087c0SFlorian Hahnchecks:
128*34e477e9SFlorian Hahn  %c.3.min = icmp ult ptr %gep.3, %min
129*34e477e9SFlorian Hahn  %c.3.max = icmp ult ptr %gep.3, %max
130af0087c0SFlorian Hahn  %res.1 = xor i1 %c.3.min, %c.3.max
131af0087c0SFlorian Hahn
132*34e477e9SFlorian Hahn  %gep.1 = getelementptr inbounds i32, ptr %src, i64 1
133*34e477e9SFlorian Hahn  %c.1.min = icmp ult ptr %gep.1, %min
134*34e477e9SFlorian Hahn  %c.1.max = icmp ult ptr %gep.1, %max
135af0087c0SFlorian Hahn  %res.2 = xor i1 %c.1.min, %c.1.max
136af0087c0SFlorian Hahn
137*34e477e9SFlorian Hahn  %gep.2 = getelementptr inbounds i32, ptr %src, i64 2
138*34e477e9SFlorian Hahn  %c.2.min = icmp ult ptr %gep.2, %min
139*34e477e9SFlorian Hahn  %c.2.max = icmp ult ptr %gep.2, %max
140af0087c0SFlorian Hahn  %res.3 = xor i1 %c.2.min, %c.2.max
141af0087c0SFlorian Hahn
142*34e477e9SFlorian Hahn  %gep.4 = getelementptr inbounds i32, ptr %src, i64 4
143*34e477e9SFlorian Hahn  %c.4.min = icmp ult ptr %gep.4, %min
144*34e477e9SFlorian Hahn  %c.4.max = icmp ult ptr %gep.4, %max
145af0087c0SFlorian Hahn  %res.4 = xor i1 %c.4.min, %c.4.max
146af0087c0SFlorian Hahn
147af0087c0SFlorian Hahn  %res.5 = xor i1 %res.1, %res.2
148af0087c0SFlorian Hahn  %res.6 = xor i1 %res.5, %res.3
149af0087c0SFlorian Hahn  %res.7 = xor i1 %res.6, %res.4
150af0087c0SFlorian Hahn
151af0087c0SFlorian Hahn  ret i1 %res.7
152af0087c0SFlorian Hahn}
153