; This test makes sure that these instructions are properly eliminated.
;
; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep load

@X = constant i32 42		; <i32*> [#uses=2]
@X2 = constant i32 47		; <i32*> [#uses=1]
@Y = constant [2 x { i32, float }] [ { i32, float } { i32 12, float 1.000000e+00 }, { i32, float } { i32 37, float 0x3FF3B2FEC0000000 } ]		; <[2 x { i32, float }]*> [#uses=2]
@Z = constant [2 x { i32, float }] zeroinitializer		; <[2 x { i32, float }]*> [#uses=1]

define i32 @test1() {
	%B = load i32* @X		; <i32> [#uses=1]
	ret i32 %B
}

define float @test2() {
	%A = getelementptr [2 x { i32, float }]* @Y, i64 0, i64 1, i32 1		; <float*> [#uses=1]
	%B = load float* %A		; <float> [#uses=1]
	ret float %B
}

define i32 @test3() {
	%A = getelementptr [2 x { i32, float }]* @Y, i64 0, i64 0, i32 0		; <i32*> [#uses=1]
	%B = load i32* %A		; <i32> [#uses=1]
	ret i32 %B
}

define i32 @test4() {
	%A = getelementptr [2 x { i32, float }]* @Z, i64 0, i64 1, i32 0		; <i32*> [#uses=1]
	%B = load i32* %A		; <i32> [#uses=1]
	ret i32 %B
}

define i32 @test5(i1 %C) {
	%Y = select i1 %C, i32* @X, i32* @X2		; <i32*> [#uses=1]
	%Z = load i32* %Y		; <i32> [#uses=1]
	ret i32 %Z
}

define i32 @test7(i32 %X) {
	%V = getelementptr i32* null, i32 %X		; <i32*> [#uses=1]
	%R = load i32* %V		; <i32> [#uses=1]
	ret i32 %R
}

define i32 @test8(i32* %P) {
	store i32 1, i32* %P
	%X = load i32* %P		; <i32> [#uses=1]
	ret i32 %X
}

define i32 @test9(i32* %P) {
	%X = load i32* %P		; <i32> [#uses=1]
	%Y = load i32* %P		; <i32> [#uses=1]
	%Z = sub i32 %X, %Y		; <i32> [#uses=1]
	ret i32 %Z
}

define i32 @test10(i1 %C.upgrd.1, i32* %P, i32* %Q) {
	br i1 %C.upgrd.1, label %T, label %F
T:		; preds = %0
	store i32 1, i32* %Q
	store i32 0, i32* %P
	br label %C
F:		; preds = %0
	store i32 0, i32* %P
	br label %C
C:		; preds = %F, %T
	%V = load i32* %P		; <i32> [#uses=1]
	ret i32 %V
}

define double @test11(double* %p) {
  %t0 = getelementptr double* %p, i32 1
  store double 2.0, double* %t0
  %t1 = getelementptr double* %p, i32 1
  %x = load double* %t1
  ret double %x
}
