xref: /llvm-project/llvm/test/Transforms/InstCombine/mem-gep-zidx.ll (revision 2caaec65c04ea7d0e9568b7895b7a46d6100cb75)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -passes=instcombine < %s | FileCheck %s
3target datalayout = "E-m:e-i64:64-n32:64"
4target triple = "powerpc64-unknown-linux-gnu"
5
6@f.a = private unnamed_addr constant [1 x i32] [i32 12], align 4
7@f.b = private unnamed_addr constant [1 x i32] [i32 55], align 4
8@f.c = linkonce unnamed_addr alias [1 x i32], ptr @f.b
9
10define signext i32 @test1(i32 signext %x) #0 {
11; CHECK-LABEL: @test1(
12; CHECK-NEXT:    ret i32 12
13;
14  %idxprom = sext i32 %x to i64
15  %arrayidx = getelementptr inbounds [1 x i32], ptr @f.a, i64 0, i64 %idxprom
16  %r = load i32, ptr %arrayidx, align 4
17  ret i32 %r
18}
19
20declare void @foo(ptr %p)
21define void @test2(i32 signext %x, i64 %v) #0 {
22; CHECK-LABEL: @test2(
23; CHECK-NEXT:    [[P:%.*]] = alloca i64, align 8
24; CHECK-NEXT:    store i64 [[V:%.*]], ptr [[P]], align 8
25; CHECK-NEXT:    call void @foo(ptr nonnull [[P]]) #[[ATTR1:[0-9]+]]
26; CHECK-NEXT:    ret void
27;
28  %p = alloca i64
29  %idxprom = sext i32 %x to i64
30  %arrayidx = getelementptr inbounds i64, ptr %p, i64 %idxprom
31  store i64 %v, ptr %arrayidx
32  call void @foo(ptr %p)
33  ret void
34}
35
36define signext i32 @test3(i32 signext %x, i1 %y) #0 {
37; CHECK-LABEL: @test3(
38; CHECK-NEXT:    [[R:%.*]] = select i1 [[Y:%.*]], i32 12, i32 55
39; CHECK-NEXT:    ret i32 [[R]]
40;
41  %idxprom = sext i32 %x to i64
42  %p = select i1 %y, ptr @f.a, ptr @f.b
43  %arrayidx = getelementptr inbounds [1 x i32], ptr %p, i64 0, i64 %idxprom
44  %r = load i32, ptr %arrayidx, align 4
45  ret i32 %r
46}
47
48define signext i32 @test4(i32 signext %x, i1 %y) #0 {
49; CHECK-LABEL: @test4(
50; CHECK-NEXT:    [[IDXPROM:%.*]] = sext i32 [[X:%.*]] to i64
51; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [1 x i32], ptr @f.c, i64 0, i64 [[IDXPROM]]
52; CHECK-NEXT:    [[R:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
53; CHECK-NEXT:    ret i32 [[R]]
54;
55  %idxprom = sext i32 %x to i64
56  %arrayidx = getelementptr inbounds [1 x i32], ptr @f.c, i64 0, i64 %idxprom
57  %r = load i32, ptr %arrayidx, align 4
58  ret i32 %r
59}
60
61attributes #0 = { nounwind readnone }
62
63