3cfe781ac8b7612b04de7c213ac2590c498ceff4
[oota-llvm.git] / test / Transforms / InstCombine / gep-merge.ll
1 ; This test makes sure that gep(gep ...) merge doesn't come into effect.
2 ; RUN: opt < %s -instcombine -S | FileCheck %s
3
4 ; Make sure there are no geps being merged.
5 ; CHECK-LABEL: @fn3(
6 ; CHECK: getelementptr
7 ; CHECK: getelementptr
8 ; CHECK: getelementptr
9
10 @_ZN2cv1aE = global i8* zeroinitializer, align 8
11 declare i32 @fn1() #2
12 declare i32 @fn2() #2
13
14 ; Function Attrs: uwtable
15 define linkonce_odr i32 @fn3() {
16 entry:
17   %call = call i32 @fn1()
18   %call1 = call i32 @fn2()
19   %0 = load i8*, i8** @_ZN2cv1aE, align 8
20   %idx.ext2 = sext i32 %call1 to i64
21   %add.ptr3 = getelementptr inbounds i8, i8* %0, i64 %idx.ext2
22   br label %for.cond5
23
24 for.cond5:
25   %total1 = phi i32 [ 0, %entry ], [ %total2, %for.body7 ]
26   %x.1 = phi i32 [ 0, %entry ], [ %inc, %for.body7 ]
27   %cmp6 = icmp slt i32 %x.1, %call
28   br i1 %cmp6, label %for.body7, label %for.cond34
29
30 for.body7:                                        ; preds = %for.cond5
31   %mul = mul nsw i32 %x.1, 2
32   %idxprom = sext i32 %mul to i64
33   %arrayidx = getelementptr inbounds i8, i8* %add.ptr3, i64 %idxprom
34   %1 = load i8, i8* %arrayidx, align 1
35   %conv = zext i8 %1 to i32
36   %sub = sub nsw i32 %mul, 1
37   %idxprom10 = sext i32 %sub to i64
38   %arrayidx11 = getelementptr inbounds i8, i8* %add.ptr3, i64 %idxprom10
39   %2 = load i8, i8* %arrayidx11, align 1
40   %conv2 = zext i8 %2 to i32
41   %add1 = add nsw i32 %conv, %conv2
42   %total2 = add nsw i32 %total1, %add1
43   %inc = add nsw i32 %x.1, 1
44   br label %for.cond5
45
46 for.cond34:
47   ret i32 %total1
48 }