Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / X86 / pr38743.ll
blobac5d48ef5f55c35cfb3a817e92e7ada6245f5bf4
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s
4 %0 = type { %1 }
5 %1 = type { %2 }
6 %2 = type { %3 }
7 %3 = type { %4 }
8 %4 = type { %5 }
9 %5 = type { i64, i64, i8* }
10 %6 = type { %7, [23 x i8] }
11 %7 = type { i8 }
13 @.str.16 = external dso_local unnamed_addr constant [16 x i8], align 1
14 @.str.17 = external dso_local unnamed_addr constant [12 x i8], align 1
15 @.str.18 = external dso_local unnamed_addr constant [15 x i8], align 1
17 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i1) #0
19 define void @pr38743() #1 align 2 {
20 ; CHECK-LABEL: pr38743:
21 ; CHECK:       # %bb.0: # %bb
22 ; CHECK-NEXT:    cmpl $3, %eax
23 ; CHECK-NEXT:    je .LBB0_4
24 ; CHECK-NEXT:  # %bb.1: # %bb
25 ; CHECK-NEXT:    cmpl $1, %eax
26 ; CHECK-NEXT:    je .LBB0_2
27 ; CHECK-NEXT:  # %bb.3: # %bb5
28 ; CHECK-NEXT:    movzwl .str.17+{{.*}}(%rip), %eax
29 ; CHECK-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
30 ; CHECK-NEXT:    movq {{.*}}(%rip), %rax
31 ; CHECK-NEXT:    jmp .LBB0_5
32 ; CHECK-NEXT:  .LBB0_4: # %bb8
33 ; CHECK-NEXT:    movq .str.18+{{.*}}(%rip), %rax
34 ; CHECK-NEXT:    movq %rax, -{{[0-9]+}}(%rsp)
35 ; CHECK-NEXT:    movq {{.*}}(%rip), %rax
36 ; CHECK-NEXT:    jmp .LBB0_5
37 ; CHECK-NEXT:  .LBB0_2: # %bb2
38 ; CHECK-NEXT:    movq .str.16+{{.*}}(%rip), %rax
39 ; CHECK-NEXT:    movq %rax, -{{[0-9]+}}(%rsp)
40 ; CHECK-NEXT:    movq {{.*}}(%rip), %rax
41 ; CHECK-NEXT:  .LBB0_5: # %bb12
42 ; CHECK-NEXT:    movq %rax, -{{[0-9]+}}(%rsp)
43 ; CHECK-NEXT:    movq -{{[0-9]+}}(%rsp), %rax
44 ; CHECK-NEXT:    movq %rax, (%rax)
45 ; CHECK-NEXT:    movb -{{[0-9]+}}(%rsp), %al
46 ; CHECK-NEXT:    movq -{{[0-9]+}}(%rsp), %rcx
47 ; CHECK-NEXT:    movzwl -{{[0-9]+}}(%rsp), %edx
48 ; CHECK-NEXT:    movl -{{[0-9]+}}(%rsp), %esi
49 ; CHECK-NEXT:    movb -{{[0-9]+}}(%rsp), %dil
50 ; CHECK-NEXT:    movb %al, (%rax)
51 ; CHECK-NEXT:    movq %rcx, 1(%rax)
52 ; CHECK-NEXT:    movw %dx, 9(%rax)
53 ; CHECK-NEXT:    movl %esi, 11(%rax)
54 ; CHECK-NEXT:    movb %dil, 15(%rax)
55 ; CHECK-NEXT:    retq
56 bb:
57   %tmp = alloca %0, align 16
58   %tmp1 = bitcast %0* %tmp to i8*
59   switch i32 undef, label %bb11 [
60     i32 1, label %bb2
61     i32 4, label %bb5
62     i32 2, label %bb5
63     i32 3, label %bb8
64   ]
66 bb2:                                              ; preds = %bb
67   %tmp3 = bitcast %0* %tmp to %6*
68   %tmp4 = getelementptr inbounds %6, %6* %tmp3, i64 0, i32 1, i64 0
69   call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 1 %tmp4, i8* align 1 getelementptr inbounds ([16 x i8], [16 x i8]* @.str.16, i64 0, i64 0), i64 15, i1 false)
70   br label %bb12
72 bb5:                                              ; preds = %bb, %bb
73   %tmp6 = bitcast %0* %tmp to %6*
74   %tmp7 = getelementptr inbounds %6, %6* %tmp6, i64 0, i32 1, i64 0
75   call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 1 %tmp7, i8* align 1 getelementptr inbounds ([12 x i8], [12 x i8]* @.str.17, i64 0, i64 0), i64 10, i1 false)
76   br label %bb12
78 bb8:                                              ; preds = %bb
79   %tmp9 = bitcast %0* %tmp to %6*
80   %tmp10 = getelementptr inbounds %6, %6* %tmp9, i64 0, i32 1, i64 0
81   call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 1 %tmp10, i8* align 1 getelementptr inbounds ([15 x i8], [15 x i8]* @.str.18, i64 0, i64 0), i64 14, i1 false)
82   br label %bb12
84 bb11:                                             ; preds = %bb
85   unreachable
87 bb12:                                             ; preds = %bb8, %bb5, %bb2
88   call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 8 undef, i8* nonnull align 16 %tmp1, i64 24, i1 false) #2
89   ret void
92 attributes #0 = { argmemonly nounwind }
93 attributes #1 = { "target-features"="+sse,+sse2,+sse3,+sse4.2" }
94 attributes #2 = { nounwind }