+++ /dev/null
-; RUN: opt < %s -instcombine -S | FileCheck %s
-
-target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
-target triple = "x86_64-apple-macosx10.10.0"
-
-define internal i8* @descale_zero() {
-entry:
-; CHECK: load i8*, i8** inttoptr (i64 48 to i8**), align 16
-; CHECK-NEXT: ret i8*
- %i16_ptr = load i16*, i16** inttoptr (i64 48 to i16**), align 16
- %num = load i64, i64* inttoptr (i64 64 to i64*), align 64
- %num_times_2 = shl i64 %num, 1
- %num_times_2_plus_4 = add i64 %num_times_2, 4
- %i8_ptr = bitcast i16* %i16_ptr to i8*
- %i8_ptr_num_times_2_plus_4 = getelementptr i8, i8* %i8_ptr, i64 %num_times_2_plus_4
- %num_times_neg2 = mul i64 %num, -2
- %num_times_neg2_minus_4 = add i64 %num_times_neg2, -4
- %addr = getelementptr i8, i8* %i8_ptr_num_times_2_plus_4, i64 %num_times_neg2_minus_4
- ret i8* %addr
-}
--- /dev/null
+; This test makes sure that gep(gep ...) merge doesn't come into effect.
+; RUN: opt < %s -instcombine -S | FileCheck %s
+
+; Make sure there are no geps being merged.
+; CHECK-LABEL: @fn3(
+; CHECK: getelementptr
+; CHECK: getelementptr
+; CHECK: getelementptr
+
+@_ZN2cv1aE = global i8* zeroinitializer, align 8
+declare i32 @fn1() #2
+declare i32 @fn2() #2
+
+; Function Attrs: uwtable
+define linkonce_odr i32 @fn3() {
+entry:
+ %call = call i32 @fn1()
+ %call1 = call i32 @fn2()
+ %0 = load i8*, i8** @_ZN2cv1aE, align 8
+ %idx.ext2 = sext i32 %call1 to i64
+ %add.ptr3 = getelementptr inbounds i8, i8* %0, i64 %idx.ext2
+ br label %for.cond5
+
+for.cond5:
+ %total1 = phi i32 [ 0, %entry ], [ %total2, %for.body7 ]
+ %x.1 = phi i32 [ 0, %entry ], [ %inc, %for.body7 ]
+ %cmp6 = icmp slt i32 %x.1, %call
+ br i1 %cmp6, label %for.body7, label %for.cond34
+
+for.body7: ; preds = %for.cond5
+ %mul = mul nsw i32 %x.1, 2
+ %idxprom = sext i32 %mul to i64
+ %arrayidx = getelementptr inbounds i8, i8* %add.ptr3, i64 %idxprom
+ %1 = load i8, i8* %arrayidx, align 1
+ %conv = zext i8 %1 to i32
+ %sub = sub nsw i32 %mul, 1
+ %idxprom10 = sext i32 %sub to i64
+ %arrayidx11 = getelementptr inbounds i8, i8* %add.ptr3, i64 %idxprom10
+ %2 = load i8, i8* %arrayidx11, align 1
+ %conv2 = zext i8 %2 to i32
+ %add1 = add nsw i32 %conv, %conv2
+ %total2 = add nsw i32 %total1, %add1
+ %inc = add nsw i32 %x.1, 1
+ br label %for.cond5
+
+for.cond34:
+ ret i32 %total1
+}
%B = getelementptr i32, i32* %A, i64 %D
ret i32* %B
; CHECK-LABEL: @test7(
-; CHECK: %A.sum = add i64 %C, %D
-; CHECK: getelementptr i32, i32* %I, i64 %A.sum
+; CHECK: %A = getelementptr i32, i32* %I, i64 %C
+; CHECK: %B = getelementptr i32, i32* %A, i64 %D
}
define i8* @test8([10 x i32]* %X) {