1 ; RUN: opt -instcombine -S < %s | FileCheck %s
2 target datalayout = "E-p:64:64:64-p1:64:64:64-p2:32:32:32-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"
4 @x = external global <2 x i64>, align 16
5 @xx = external global [13 x <2 x i64>], align 16
7 @x.as2 = external addrspace(2) global <2 x i64>, align 16
9 ; CHECK-LABEL: @static_hem(
11 define <2 x i64> @static_hem() {
12 %t = getelementptr <2 x i64>* @x, i32 7
13 %tmp1 = load <2 x i64>* %t, align 1
17 ; CHECK-LABEL: @static_hem_addrspacecast(
19 define <2 x i64> @static_hem_addrspacecast() {
20 %t = getelementptr <2 x i64>* @x, i32 7
21 %t.asc = addrspacecast <2 x i64>* %t to <2 x i64> addrspace(1)*
22 %tmp1 = load <2 x i64> addrspace(1)* %t.asc, align 1
26 ; CHECK-LABEL: @static_hem_addrspacecast_smaller_ptr(
28 define <2 x i64> @static_hem_addrspacecast_smaller_ptr() {
29 %t = getelementptr <2 x i64>* @x, i32 7
30 %t.asc = addrspacecast <2 x i64>* %t to <2 x i64> addrspace(2)*
31 %tmp1 = load <2 x i64> addrspace(2)* %t.asc, align 1
35 ; CHECK-LABEL: @static_hem_addrspacecast_larger_ptr(
37 define <2 x i64> @static_hem_addrspacecast_larger_ptr() {
38 %t = getelementptr <2 x i64> addrspace(2)* @x.as2, i32 7
39 %t.asc = addrspacecast <2 x i64> addrspace(2)* %t to <2 x i64> addrspace(1)*
40 %tmp1 = load <2 x i64> addrspace(1)* %t.asc, align 1
46 define <2 x i64> @hem(i32 %i) {
47 %t = getelementptr <2 x i64>* @x, i32 %i
48 %tmp1 = load <2 x i64>* %t, align 1
52 ; CHECK-LABEL: @hem_2d(
54 define <2 x i64> @hem_2d(i32 %i, i32 %j) {
55 %t = getelementptr [13 x <2 x i64>]* @xx, i32 %i, i32 %j
56 %tmp1 = load <2 x i64>* %t, align 1
62 define <2 x i64> @foo() {
63 %tmp1 = load <2 x i64>* @x, align 1
70 define <2 x i64> @bar() {
72 call void @kip(<2 x i64>* %t)
73 %tmp1 = load <2 x i64>* %t, align 1
77 ; CHECK-LABEL: @static_hem_store(
79 define void @static_hem_store(<2 x i64> %y) {
80 %t = getelementptr <2 x i64>* @x, i32 7
81 store <2 x i64> %y, <2 x i64>* %t, align 1
85 ; CHECK-LABEL: @hem_store(
87 define void @hem_store(i32 %i, <2 x i64> %y) {
88 %t = getelementptr <2 x i64>* @x, i32 %i
89 store <2 x i64> %y, <2 x i64>* %t, align 1
93 ; CHECK-LABEL: @hem_2d_store(
95 define void @hem_2d_store(i32 %i, i32 %j, <2 x i64> %y) {
96 %t = getelementptr [13 x <2 x i64>]* @xx, i32 %i, i32 %j
97 store <2 x i64> %y, <2 x i64>* %t, align 1
101 ; CHECK-LABEL: @foo_store(
103 define void @foo_store(<2 x i64> %y) {
104 store <2 x i64> %y, <2 x i64>* @x, align 1
108 ; CHECK-LABEL: @bar_store(
110 define void @bar_store(<2 x i64> %y) {
111 %t = alloca <2 x i64>
112 call void @kip(<2 x i64>* %t)
113 store <2 x i64> %y, <2 x i64>* %t, align 1
117 declare void @kip(<2 x i64>* %t)