New testcase, checking to see we can turn this code:
authorChris Lattner <sabre@nondot.org>
Fri, 14 Apr 2006 21:41:54 +0000 (21:41 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 14 Apr 2006 21:41:54 +0000 (21:41 +0000)
void test(vector float *F, float f) {
  vector float G = *F + *F;
  *((float*)&G) = f;
  *F = G + G;
}

void test2(vector float *F, float f) {
  vector float G = *F + *F;
  ((float*)&G)[2] = f;
  *F = G + G;
}

void test3(vector float *F, float *f) {
  vector float G = *F + *F;
  *f = ((float*)&G)[2];
}

void test4(vector float *F, float *f) {
  vector float G = *F + *F;
  *f = *((float*)&G);
}

into insert/extract element operations with no memory traffic.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27709 91177308-0d34-0410-b5e6-96231b3b80d8

test/Transforms/ScalarRepl/vector_promote.ll [new file with mode: 0644]

diff --git a/test/Transforms/ScalarRepl/vector_promote.ll b/test/Transforms/ScalarRepl/vector_promote.ll
new file mode 100644 (file)
index 0000000..1387183
--- /dev/null
@@ -0,0 +1,56 @@
+
+; RUN: llvm-as < %s | opt -scalarrepl -disable-output &&
+; RUN: llvm-as < %s | opt -scalarrepl | llvm-dis | not grep alloca
+
+void %test(<4 x float>* %F, float %f) {
+entry:
+        %G = alloca <4 x float>, align 16               ; <<4 x float>*> [#uses=3]
+        %tmp = load <4 x float>* %F             ; <<4 x float>> [#uses=2]
+        %tmp3 = add <4 x float> %tmp, %tmp              ; <<4 x float>> [#uses=1]
+        store <4 x float> %tmp3, <4 x float>* %G
+        %G = getelementptr <4 x float>* %G, int 0, int 0                ; <float*> [#uses=1]
+        store float %f, float* %G
+        %tmp4 = load <4 x float>* %G            ; <<4 x float>> [#uses=2]
+        %tmp6 = add <4 x float> %tmp4, %tmp4            ; <<4 x float>> [#uses=1]
+        store <4 x float> %tmp6, <4 x float>* %F
+        ret void
+}
+
+void %test2(<4 x float>* %F, float %f) {
+entry:
+        %G = alloca <4 x float>, align 16               ; <<4 x float>*> [#uses=3]
+        %tmp = load <4 x float>* %F             ; <<4 x float>> [#uses=2]
+        %tmp3 = add <4 x float> %tmp, %tmp              ; <<4 x float>> [#uses=1]
+        store <4 x float> %tmp3, <4 x float>* %G
+        %tmp = getelementptr <4 x float>* %G, int 0, int 2              ; <float*> [#uses=1]
+        store float %f, float* %tmp
+        %tmp4 = load <4 x float>* %G            ; <<4 x float>> [#uses=2]
+        %tmp6 = add <4 x float> %tmp4, %tmp4            ; <<4 x float>> [#uses=1]
+        store <4 x float> %tmp6, <4 x float>* %F
+        ret void
+}
+
+void %test3(<4 x float>* %F, float* %f) {
+entry:
+        %G = alloca <4 x float>, align 16               ; <<4 x float>*> [#uses=2]
+        %tmp = load <4 x float>* %F             ; <<4 x float>> [#uses=2]
+        %tmp3 = add <4 x float> %tmp, %tmp              ; <<4 x float>> [#uses=1]
+        store <4 x float> %tmp3, <4 x float>* %G
+        %tmp = getelementptr <4 x float>* %G, int 0, int 2              ; <float*> [#uses=1]
+        %tmp = load float* %tmp         ; <float> [#uses=1]
+        store float %tmp, float* %f
+        ret void
+}
+
+void %test4(<4 x float>* %F, float* %f) {
+entry:
+        %G = alloca <4 x float>, align 16               ; <<4 x float>*> [#uses=2]
+        %tmp = load <4 x float>* %F             ; <<4 x float>> [#uses=2]
+        %tmp3 = add <4 x float> %tmp, %tmp              ; <<4 x float>> [#uses=1]
+        store <4 x float> %tmp3, <4 x float>* %G
+        %G = getelementptr <4 x float>* %G, int 0, int 0                ; <float*> [#uses=1]
+        %tmp = load float* %G           ; <float> [#uses=1]
+        store float %tmp, float* %f
+        ret void
+}
+