xref: /llvm-project/llvm/test/Transforms/InstCombine/canonicalize-gep-mul.ll (revision 99d8bc9e7686994015fe744af3d11cd9c2050b8c)
1352a8361SDavid Green; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2352a8361SDavid Green; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3352a8361SDavid Green
4352a8361SDavid Greendefine ptr @mul4(ptr %p, i64 %x) {
5352a8361SDavid Green; CHECK-LABEL: define ptr @mul4(
6352a8361SDavid Green; CHECK-SAME: ptr [[P:%.*]], i64 [[X:%.*]]) {
7352a8361SDavid Green; CHECK-NEXT:  entry:
8352a8361SDavid Green; CHECK-NEXT:    [[GEP_IDX:%.*]] = shl i64 [[X]], 4
9352a8361SDavid Green; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 [[GEP_IDX]]
10352a8361SDavid Green; CHECK-NEXT:    ret ptr [[GEP]]
11352a8361SDavid Green;
12352a8361SDavid Greenentry:
13352a8361SDavid Green  %mul = mul i64 %x, 4
14352a8361SDavid Green  %gep = getelementptr inbounds i32, ptr %p, i64 %mul
15352a8361SDavid Green  ret ptr %gep
16352a8361SDavid Green}
17352a8361SDavid Green
18*99d8bc9eSNikita Popovdefine ptr @mul4_nuw(ptr %p, i64 %x) {
19*99d8bc9eSNikita Popov; CHECK-LABEL: define ptr @mul4_nuw(
20*99d8bc9eSNikita Popov; CHECK-SAME: ptr [[P:%.*]], i64 [[X:%.*]]) {
21*99d8bc9eSNikita Popov; CHECK-NEXT:  entry:
22*99d8bc9eSNikita Popov; CHECK-NEXT:    [[GEP_IDX:%.*]] = shl i64 [[X]], 4
23*99d8bc9eSNikita Popov; CHECK-NEXT:    [[GEP:%.*]] = getelementptr nuw i8, ptr [[P]], i64 [[GEP_IDX]]
24*99d8bc9eSNikita Popov; CHECK-NEXT:    ret ptr [[GEP]]
25*99d8bc9eSNikita Popov;
26*99d8bc9eSNikita Popoventry:
27*99d8bc9eSNikita Popov  %mul = mul i64 %x, 4
28*99d8bc9eSNikita Popov  %gep = getelementptr nuw i32, ptr %p, i64 %mul
29*99d8bc9eSNikita Popov  ret ptr %gep
30*99d8bc9eSNikita Popov}
31*99d8bc9eSNikita Popov
32352a8361SDavid Greendefine ptr @mul5(ptr %p, i64 %x) {
33352a8361SDavid Green; CHECK-LABEL: define ptr @mul5(
34352a8361SDavid Green; CHECK-SAME: ptr [[P:%.*]], i64 [[X:%.*]]) {
35352a8361SDavid Green; CHECK-NEXT:  entry:
36352a8361SDavid Green; CHECK-NEXT:    [[GEP_IDX:%.*]] = mul i64 [[X]], 20
37352a8361SDavid Green; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 [[GEP_IDX]]
38352a8361SDavid Green; CHECK-NEXT:    ret ptr [[GEP]]
39352a8361SDavid Green;
40352a8361SDavid Greenentry:
41352a8361SDavid Green  %mul = mul i64 %x, 5
42352a8361SDavid Green  %gep = getelementptr inbounds i32, ptr %p, i64 %mul
43352a8361SDavid Green  ret ptr %gep
44352a8361SDavid Green}
45352a8361SDavid Green
46352a8361SDavid Greendefine ptr @noinbounds(ptr %p, i64 %x) {
47352a8361SDavid Green; CHECK-LABEL: define ptr @noinbounds(
48352a8361SDavid Green; CHECK-SAME: ptr [[P:%.*]], i64 [[X:%.*]]) {
49352a8361SDavid Green; CHECK-NEXT:  entry:
50352a8361SDavid Green; CHECK-NEXT:    [[GEP_IDX:%.*]] = mul i64 [[X]], 20
51352a8361SDavid Green; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i8, ptr [[P]], i64 [[GEP_IDX]]
52352a8361SDavid Green; CHECK-NEXT:    ret ptr [[GEP]]
53352a8361SDavid Green;
54352a8361SDavid Greenentry:
55352a8361SDavid Green  %mul = mul i64 %x, 5
56352a8361SDavid Green  %gep = getelementptr i32, ptr %p, i64 %mul
57352a8361SDavid Green  ret ptr %gep
58352a8361SDavid Green}
59352a8361SDavid Green
60352a8361SDavid Greendefine ptr @usemul(ptr %p, i64 %x) {
61352a8361SDavid Green; CHECK-LABEL: define ptr @usemul(
62352a8361SDavid Green; CHECK-SAME: ptr [[P:%.*]], i64 [[X:%.*]]) {
63352a8361SDavid Green; CHECK-NEXT:  entry:
64352a8361SDavid Green; CHECK-NEXT:    [[MUL:%.*]] = mul i64 [[X]], 5
65352a8361SDavid Green; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i32, ptr [[P]], i64 [[MUL]]
66352a8361SDavid Green; CHECK-NEXT:    call void @use(i64 [[MUL]])
67352a8361SDavid Green; CHECK-NEXT:    ret ptr [[GEP]]
68352a8361SDavid Green;
69352a8361SDavid Greenentry:
70352a8361SDavid Green  %mul = mul i64 %x, 5
71352a8361SDavid Green  %gep = getelementptr inbounds i32, ptr %p, i64 %mul
72352a8361SDavid Green  call void @use(i64 %mul)
73352a8361SDavid Green  ret ptr %gep
74352a8361SDavid Green}
75352a8361SDavid Green
76352a8361SDavid Greendefine void @multiple(ptr %p, i64 %x) {
77352a8361SDavid Green; CHECK-LABEL: define void @multiple(
78352a8361SDavid Green; CHECK-SAME: ptr [[P:%.*]], i64 [[X:%.*]]) {
79352a8361SDavid Green; CHECK-NEXT:  entry:
80352a8361SDavid Green; CHECK-NEXT:    [[MUL21:%.*]] = mul i64 [[X]], 20
81352a8361SDavid Green; CHECK-NEXT:    [[GEP3:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 [[MUL21]]
82352a8361SDavid Green; CHECK-NEXT:    [[MUL20:%.*]] = mul i64 [[X]], 20
83352a8361SDavid Green; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 [[MUL20]]
84352a8361SDavid Green; CHECK-NEXT:    call void @use2(ptr [[GEP3]], ptr [[GEP2]])
85352a8361SDavid Green; CHECK-NEXT:    ret void
86352a8361SDavid Green;
87352a8361SDavid Greenentry:
88352a8361SDavid Green  %mul5 = mul i64 %x, 5
89352a8361SDavid Green  %gep1 = getelementptr inbounds i32, ptr %p, i64 %mul5
90352a8361SDavid Green  %mul20 = mul i64 %x, 20
91352a8361SDavid Green  %gep2 = getelementptr inbounds i8, ptr %p, i64 %mul20
92352a8361SDavid Green  call void @use2(ptr %gep1, ptr %gep2)
93352a8361SDavid Green  ret void
94352a8361SDavid Green}
95352a8361SDavid Green
96352a8361SDavid Greendefine void @multiplestore(ptr %p, i64 %x) {
97352a8361SDavid Green; CHECK-LABEL: define void @multiplestore(
98352a8361SDavid Green; CHECK-SAME: ptr [[P:%.*]], i64 [[X:%.*]]) {
99352a8361SDavid Green; CHECK-NEXT:  entry:
100352a8361SDavid Green; CHECK-NEXT:    [[MUL20:%.*]] = mul i64 [[X]], 20
101352a8361SDavid Green; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 [[MUL20]]
102352a8361SDavid Green; CHECK-NEXT:    [[MUL21:%.*]] = mul i64 [[X]], 20
103352a8361SDavid Green; CHECK-NEXT:    [[GEP3:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 [[MUL21]]
104352a8361SDavid Green; CHECK-NEXT:    store i32 0, ptr [[GEP2]], align 4
105352a8361SDavid Green; CHECK-NEXT:    store i32 1, ptr [[GEP3]], align 4
106352a8361SDavid Green; CHECK-NEXT:    ret void
107352a8361SDavid Green;
108352a8361SDavid Greenentry:
109352a8361SDavid Green  %mul5 = mul i64 %x, 5
110352a8361SDavid Green  %gep1 = getelementptr inbounds i32, ptr %p, i64 %mul5
111352a8361SDavid Green  %mul20 = mul i64 %x, 20
112352a8361SDavid Green  %gep2 = getelementptr inbounds i8, ptr %p, i64 %mul20
113352a8361SDavid Green  store i32 0, ptr %gep1
114352a8361SDavid Green  store i32 1, ptr %gep2
115352a8361SDavid Green  ret void
116352a8361SDavid Green}
117352a8361SDavid Green
118352a8361SDavid Greendeclare void @use(i64)
119352a8361SDavid Greendeclare void @use2(ptr, ptr)
120