brintos

brintos / llvm-project-archived public Read only

0
0
Text · 38.4 KiB · 22b4fdd Raw
1103 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-linux -mcpu=x86-64 -verify-machineinstrs | FileCheck %s -check-prefixes=SSE,CHECK3; RUN: llc < %s -mtriple=x86_64-linux -mcpu=x86-64 --x86-disable-avoid-SFB -verify-machineinstrs | FileCheck %s --check-prefixes=SSE,DISABLED4; RUN: llc < %s -mtriple=x86_64-linux -mcpu=core-avx2 -verify-machineinstrs | FileCheck %s -check-prefixes=AVX5; RUN: llc < %s -mtriple=x86_64-linux -mcpu=skx -verify-machineinstrs | FileCheck %s -check-prefixes=AVX6 7target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"8target triple = "x86_64-unknown-linux-gnu"9 10%struct.S = type { i32, i32, i32, i32 }11 12; Function Attrs: nounwind uwtable13define void @test_conditional_block(ptr nocapture noalias %s1 , ptr nocapture noalias %s2, i32 %x, ptr nocapture noalias  %s3, ptr nocapture noalias readonly %s4) local_unnamed_addr #0 {14; CHECK-LABEL: test_conditional_block:15; CHECK:       # %bb.0: # %entry16; CHECK-NEXT:    cmpl $18, %edx17; CHECK-NEXT:    jl .LBB0_218; CHECK-NEXT:  # %bb.1: # %if.then19; CHECK-NEXT:    movl %edx, 4(%rdi)20; CHECK-NEXT:  .LBB0_2: # %if.end21; CHECK-NEXT:    movups (%r8), %xmm022; CHECK-NEXT:    movups %xmm0, (%rcx)23; CHECK-NEXT:    movl (%rdi), %eax24; CHECK-NEXT:    movl %eax, (%rsi)25; CHECK-NEXT:    movl 4(%rdi), %eax26; CHECK-NEXT:    movl %eax, 4(%rsi)27; CHECK-NEXT:    movq 8(%rdi), %rax28; CHECK-NEXT:    movq %rax, 8(%rsi)29; CHECK-NEXT:    retq30;31; DISABLED-LABEL: test_conditional_block:32; DISABLED:       # %bb.0: # %entry33; DISABLED-NEXT:    cmpl $18, %edx34; DISABLED-NEXT:    jl .LBB0_235; DISABLED-NEXT:  # %bb.1: # %if.then36; DISABLED-NEXT:    movl %edx, 4(%rdi)37; DISABLED-NEXT:  .LBB0_2: # %if.end38; DISABLED-NEXT:    movups (%r8), %xmm039; DISABLED-NEXT:    movups %xmm0, (%rcx)40; DISABLED-NEXT:    movups (%rdi), %xmm041; DISABLED-NEXT:    movups %xmm0, (%rsi)42; DISABLED-NEXT:    retq43;44; AVX-LABEL: test_conditional_block:45; AVX:       # %bb.0: # %entry46; AVX-NEXT:    cmpl $18, %edx47; AVX-NEXT:    jl .LBB0_248; AVX-NEXT:  # %bb.1: # %if.then49; AVX-NEXT:    movl %edx, 4(%rdi)50; AVX-NEXT:  .LBB0_2: # %if.end51; AVX-NEXT:    vmovups (%r8), %xmm052; AVX-NEXT:    vmovups %xmm0, (%rcx)53; AVX-NEXT:    movl (%rdi), %eax54; AVX-NEXT:    movl %eax, (%rsi)55; AVX-NEXT:    movl 4(%rdi), %eax56; AVX-NEXT:    movl %eax, 4(%rsi)57; AVX-NEXT:    movq 8(%rdi), %rax58; AVX-NEXT:    movq %rax, 8(%rsi)59; AVX-NEXT:    retq60entry:61  %cmp = icmp sgt i32 %x, 1762  br i1 %cmp, label %if.then, label %if.end63 64if.then:                                          ; preds = %entry65  %b = getelementptr inbounds %struct.S, ptr %s1, i64 0, i32 166  store i32 %x, ptr %b, align 467  br label %if.end68 69if.end:                                           ; preds = %if.then, %entry70  tail call void @llvm.memcpy.p0.p0.i64(ptr %s3, ptr %s4, i64 16, i32 4, i1 false)71  tail call void @llvm.memcpy.p0.p0.i64(ptr %s2, ptr %s1, i64 16, i32 4, i1 false)72  ret void73}74 75; Function Attrs: nounwind uwtable76define void @test_imm_store(ptr nocapture noalias %s1, ptr nocapture %s2, i32 %x, ptr nocapture %s3) local_unnamed_addr #0 {77; CHECK-LABEL: test_imm_store:78; CHECK:       # %bb.0: # %entry79; CHECK-NEXT:    movl $0, (%rdi)80; CHECK-NEXT:    movl $1, (%rcx)81; CHECK-NEXT:    movl (%rdi), %eax82; CHECK-NEXT:    movl %eax, (%rsi)83; CHECK-NEXT:    movq 4(%rdi), %rax84; CHECK-NEXT:    movq %rax, 4(%rsi)85; CHECK-NEXT:    movl 12(%rdi), %eax86; CHECK-NEXT:    movl %eax, 12(%rsi)87; CHECK-NEXT:    retq88;89; DISABLED-LABEL: test_imm_store:90; DISABLED:       # %bb.0: # %entry91; DISABLED-NEXT:    movl $0, (%rdi)92; DISABLED-NEXT:    movl $1, (%rcx)93; DISABLED-NEXT:    movups (%rdi), %xmm094; DISABLED-NEXT:    movups %xmm0, (%rsi)95; DISABLED-NEXT:    retq96;97; AVX-LABEL: test_imm_store:98; AVX:       # %bb.0: # %entry99; AVX-NEXT:    movl $0, (%rdi)100; AVX-NEXT:    movl $1, (%rcx)101; AVX-NEXT:    movl (%rdi), %eax102; AVX-NEXT:    movl %eax, (%rsi)103; AVX-NEXT:    movq 4(%rdi), %rax104; AVX-NEXT:    movq %rax, 4(%rsi)105; AVX-NEXT:    movl 12(%rdi), %eax106; AVX-NEXT:    movl %eax, 12(%rsi)107; AVX-NEXT:    retq108entry:109  store i32 0, ptr %s1, align 4110  store i32 1, ptr %s3, align 4111  tail call void @llvm.memcpy.p0.p0.i64(ptr %s2, ptr %s1, i64 16, i32 4, i1 false)112  ret void113}114 115; Function Attrs: nounwind uwtable116define void @test_nondirect_br(ptr nocapture noalias %s1, ptr nocapture %s2, i32 %x, ptr nocapture %s3, ptr nocapture readonly %s4, i32 %x2) local_unnamed_addr #0 {117; CHECK-LABEL: test_nondirect_br:118; CHECK:       # %bb.0: # %entry119; CHECK-NEXT:    cmpl $18, %edx120; CHECK-NEXT:    jl .LBB2_2121; CHECK-NEXT:  # %bb.1: # %if.then122; CHECK-NEXT:    movl %edx, 4(%rdi)123; CHECK-NEXT:  .LBB2_2: # %if.end124; CHECK-NEXT:    cmpl $14, %r9d125; CHECK-NEXT:    jl .LBB2_4126; CHECK-NEXT:  # %bb.3: # %if.then2127; CHECK-NEXT:    movl %r9d, 12(%rdi)128; CHECK-NEXT:  .LBB2_4: # %if.end3129; CHECK-NEXT:    movups (%r8), %xmm0130; CHECK-NEXT:    movups %xmm0, (%rcx)131; CHECK-NEXT:    movq (%rdi), %rax132; CHECK-NEXT:    movq %rax, (%rsi)133; CHECK-NEXT:    movl 8(%rdi), %eax134; CHECK-NEXT:    movl %eax, 8(%rsi)135; CHECK-NEXT:    movl 12(%rdi), %eax136; CHECK-NEXT:    movl %eax, 12(%rsi)137; CHECK-NEXT:    retq138;139; DISABLED-LABEL: test_nondirect_br:140; DISABLED:       # %bb.0: # %entry141; DISABLED-NEXT:    cmpl $18, %edx142; DISABLED-NEXT:    jl .LBB2_2143; DISABLED-NEXT:  # %bb.1: # %if.then144; DISABLED-NEXT:    movl %edx, 4(%rdi)145; DISABLED-NEXT:  .LBB2_2: # %if.end146; DISABLED-NEXT:    cmpl $14, %r9d147; DISABLED-NEXT:    jl .LBB2_4148; DISABLED-NEXT:  # %bb.3: # %if.then2149; DISABLED-NEXT:    movl %r9d, 12(%rdi)150; DISABLED-NEXT:  .LBB2_4: # %if.end3151; DISABLED-NEXT:    movups (%r8), %xmm0152; DISABLED-NEXT:    movups %xmm0, (%rcx)153; DISABLED-NEXT:    movups (%rdi), %xmm0154; DISABLED-NEXT:    movups %xmm0, (%rsi)155; DISABLED-NEXT:    retq156;157; AVX-LABEL: test_nondirect_br:158; AVX:       # %bb.0: # %entry159; AVX-NEXT:    cmpl $18, %edx160; AVX-NEXT:    jl .LBB2_2161; AVX-NEXT:  # %bb.1: # %if.then162; AVX-NEXT:    movl %edx, 4(%rdi)163; AVX-NEXT:  .LBB2_2: # %if.end164; AVX-NEXT:    cmpl $14, %r9d165; AVX-NEXT:    jl .LBB2_4166; AVX-NEXT:  # %bb.3: # %if.then2167; AVX-NEXT:    movl %r9d, 12(%rdi)168; AVX-NEXT:  .LBB2_4: # %if.end3169; AVX-NEXT:    vmovups (%r8), %xmm0170; AVX-NEXT:    vmovups %xmm0, (%rcx)171; AVX-NEXT:    movq (%rdi), %rax172; AVX-NEXT:    movq %rax, (%rsi)173; AVX-NEXT:    movl 8(%rdi), %eax174; AVX-NEXT:    movl %eax, 8(%rsi)175; AVX-NEXT:    movl 12(%rdi), %eax176; AVX-NEXT:    movl %eax, 12(%rsi)177; AVX-NEXT:    retq178entry:179  %cmp = icmp sgt i32 %x, 17180  br i1 %cmp, label %if.then, label %if.end181 182if.then:                                          ; preds = %entry183  %b = getelementptr inbounds %struct.S, ptr %s1, i64 0, i32 1184  store i32 %x, ptr %b, align 4185  br label %if.end186 187if.end:                                           ; preds = %if.then, %entry188  %cmp1 = icmp sgt i32 %x2, 13189  br i1 %cmp1, label %if.then2, label %if.end3190 191if.then2:                                         ; preds = %if.end192  %d = getelementptr inbounds %struct.S, ptr %s1, i64 0, i32 3193  store i32 %x2, ptr %d, align 4194  br label %if.end3195 196if.end3:                                          ; preds = %if.then2, %if.end197  tail call void @llvm.memcpy.p0.p0.i64(ptr %s3, ptr %s4, i64 16, i32 4, i1 false)198  tail call void @llvm.memcpy.p0.p0.i64(ptr %s2, ptr %s1, i64 16, i32 4, i1 false)199  ret void200}201 202; Function Attrs: nounwind uwtable203define void @test_2preds_block(ptr nocapture noalias %s1, ptr nocapture %s2, i32 %x, ptr nocapture %s3, ptr nocapture readonly %s4, i32 %x2) local_unnamed_addr #0 {204; CHECK-LABEL: test_2preds_block:205; CHECK:       # %bb.0: # %entry206; CHECK-NEXT:    movl %r9d, 12(%rdi)207; CHECK-NEXT:    cmpl $18, %edx208; CHECK-NEXT:    jl .LBB3_2209; CHECK-NEXT:  # %bb.1: # %if.then210; CHECK-NEXT:    movl %edx, 4(%rdi)211; CHECK-NEXT:  .LBB3_2: # %if.end212; CHECK-NEXT:    movups (%r8), %xmm0213; CHECK-NEXT:    movups %xmm0, (%rcx)214; CHECK-NEXT:    movl (%rdi), %eax215; CHECK-NEXT:    movl %eax, (%rsi)216; CHECK-NEXT:    movl 4(%rdi), %eax217; CHECK-NEXT:    movl %eax, 4(%rsi)218; CHECK-NEXT:    movl 8(%rdi), %eax219; CHECK-NEXT:    movl %eax, 8(%rsi)220; CHECK-NEXT:    movl 12(%rdi), %eax221; CHECK-NEXT:    movl %eax, 12(%rsi)222; CHECK-NEXT:    retq223;224; DISABLED-LABEL: test_2preds_block:225; DISABLED:       # %bb.0: # %entry226; DISABLED-NEXT:    movl %r9d, 12(%rdi)227; DISABLED-NEXT:    cmpl $18, %edx228; DISABLED-NEXT:    jl .LBB3_2229; DISABLED-NEXT:  # %bb.1: # %if.then230; DISABLED-NEXT:    movl %edx, 4(%rdi)231; DISABLED-NEXT:  .LBB3_2: # %if.end232; DISABLED-NEXT:    movups (%r8), %xmm0233; DISABLED-NEXT:    movups %xmm0, (%rcx)234; DISABLED-NEXT:    movups (%rdi), %xmm0235; DISABLED-NEXT:    movups %xmm0, (%rsi)236; DISABLED-NEXT:    retq237;238; AVX-LABEL: test_2preds_block:239; AVX:       # %bb.0: # %entry240; AVX-NEXT:    movl %r9d, 12(%rdi)241; AVX-NEXT:    cmpl $18, %edx242; AVX-NEXT:    jl .LBB3_2243; AVX-NEXT:  # %bb.1: # %if.then244; AVX-NEXT:    movl %edx, 4(%rdi)245; AVX-NEXT:  .LBB3_2: # %if.end246; AVX-NEXT:    vmovups (%r8), %xmm0247; AVX-NEXT:    vmovups %xmm0, (%rcx)248; AVX-NEXT:    movl (%rdi), %eax249; AVX-NEXT:    movl %eax, (%rsi)250; AVX-NEXT:    movl 4(%rdi), %eax251; AVX-NEXT:    movl %eax, 4(%rsi)252; AVX-NEXT:    movl 8(%rdi), %eax253; AVX-NEXT:    movl %eax, 8(%rsi)254; AVX-NEXT:    movl 12(%rdi), %eax255; AVX-NEXT:    movl %eax, 12(%rsi)256; AVX-NEXT:    retq257entry:258  %d = getelementptr inbounds %struct.S, ptr %s1, i64 0, i32 3259  store i32 %x2, ptr %d, align 4260  %cmp = icmp sgt i32 %x, 17261  br i1 %cmp, label %if.then, label %if.end262 263if.then:                                          ; preds = %entry264  %b = getelementptr inbounds %struct.S, ptr %s1, i64 0, i32 1265  store i32 %x, ptr %b, align 4266  br label %if.end267 268if.end:                                           ; preds = %if.then, %entry269  tail call void @llvm.memcpy.p0.p0.i64(ptr %s3, ptr %s4, i64 16, i32 4, i1 false)270  tail call void @llvm.memcpy.p0.p0.i64(ptr %s2, ptr %s1, i64 16, i32 4, i1 false)271  ret void272}273%struct.S2 = type { i64, i64 }274 275; Function Attrs: nounwind uwtable276define void @test_type64(ptr nocapture noalias %s1, ptr nocapture %s2, i32 %x, ptr nocapture %s3, ptr nocapture readonly %s4) local_unnamed_addr #0 {277; CHECK-LABEL: test_type64:278; CHECK:       # %bb.0: # %entry279; CHECK-NEXT:    cmpl $18, %edx280; CHECK-NEXT:    jl .LBB4_2281; CHECK-NEXT:  # %bb.1: # %if.then282; CHECK-NEXT:    movslq %edx, %rax283; CHECK-NEXT:    movq %rax, 8(%rdi)284; CHECK-NEXT:  .LBB4_2: # %if.end285; CHECK-NEXT:    movups (%r8), %xmm0286; CHECK-NEXT:    movups %xmm0, (%rcx)287; CHECK-NEXT:    movq (%rdi), %rax288; CHECK-NEXT:    movq %rax, (%rsi)289; CHECK-NEXT:    movq 8(%rdi), %rax290; CHECK-NEXT:    movq %rax, 8(%rsi)291; CHECK-NEXT:    retq292;293; DISABLED-LABEL: test_type64:294; DISABLED:       # %bb.0: # %entry295; DISABLED-NEXT:    cmpl $18, %edx296; DISABLED-NEXT:    jl .LBB4_2297; DISABLED-NEXT:  # %bb.1: # %if.then298; DISABLED-NEXT:    movslq %edx, %rax299; DISABLED-NEXT:    movq %rax, 8(%rdi)300; DISABLED-NEXT:  .LBB4_2: # %if.end301; DISABLED-NEXT:    movups (%r8), %xmm0302; DISABLED-NEXT:    movups %xmm0, (%rcx)303; DISABLED-NEXT:    movups (%rdi), %xmm0304; DISABLED-NEXT:    movups %xmm0, (%rsi)305; DISABLED-NEXT:    retq306;307; AVX-LABEL: test_type64:308; AVX:       # %bb.0: # %entry309; AVX-NEXT:    cmpl $18, %edx310; AVX-NEXT:    jl .LBB4_2311; AVX-NEXT:  # %bb.1: # %if.then312; AVX-NEXT:    movslq %edx, %rax313; AVX-NEXT:    movq %rax, 8(%rdi)314; AVX-NEXT:  .LBB4_2: # %if.end315; AVX-NEXT:    vmovups (%r8), %xmm0316; AVX-NEXT:    vmovups %xmm0, (%rcx)317; AVX-NEXT:    movq (%rdi), %rax318; AVX-NEXT:    movq %rax, (%rsi)319; AVX-NEXT:    movq 8(%rdi), %rax320; AVX-NEXT:    movq %rax, 8(%rsi)321; AVX-NEXT:    retq322entry:323  %cmp = icmp sgt i32 %x, 17324  br i1 %cmp, label %if.then, label %if.end325 326if.then:                                          ; preds = %entry327  %conv = sext i32 %x to i64328  %b = getelementptr inbounds %struct.S2, ptr %s1, i64 0, i32 1329  store i64 %conv, ptr %b, align 8330  br label %if.end331 332if.end:                                           ; preds = %if.then, %entry333  tail call void @llvm.memcpy.p0.p0.i64(ptr %s3, ptr %s4, i64 16, i32 8, i1 false)334  tail call void @llvm.memcpy.p0.p0.i64(ptr %s2, ptr %s1, i64 16, i32 8, i1 false)335  ret void336}337%struct.S3 = type { i64, i8, i8, i16, i32 }338 339; Function Attrs: noinline nounwind uwtable340define void @test_mixed_type(ptr nocapture noalias %s1, ptr nocapture %s2, i32 %x, ptr nocapture readnone %s3, ptr nocapture readnone %s4) local_unnamed_addr #0 {341; CHECK-LABEL: test_mixed_type:342; CHECK:       # %bb.0: # %entry343; CHECK-NEXT:    cmpl $18, %edx344; CHECK-NEXT:    jl .LBB5_2345; CHECK-NEXT:  # %bb.1: # %if.then346; CHECK-NEXT:    movslq %edx, %rax347; CHECK-NEXT:    movq %rax, (%rdi)348; CHECK-NEXT:    movb %dl, 8(%rdi)349; CHECK-NEXT:  .LBB5_2: # %if.end350; CHECK-NEXT:    movq (%rdi), %rax351; CHECK-NEXT:    movq %rax, (%rsi)352; CHECK-NEXT:    movzbl 8(%rdi), %eax353; CHECK-NEXT:    movb %al, 8(%rsi)354; CHECK-NEXT:    movl 9(%rdi), %eax355; CHECK-NEXT:    movl %eax, 9(%rsi)356; CHECK-NEXT:    movzwl 13(%rdi), %eax357; CHECK-NEXT:    movw %ax, 13(%rsi)358; CHECK-NEXT:    movzbl 15(%rdi), %eax359; CHECK-NEXT:    movb %al, 15(%rsi)360; CHECK-NEXT:    retq361;362; DISABLED-LABEL: test_mixed_type:363; DISABLED:       # %bb.0: # %entry364; DISABLED-NEXT:    cmpl $18, %edx365; DISABLED-NEXT:    jl .LBB5_2366; DISABLED-NEXT:  # %bb.1: # %if.then367; DISABLED-NEXT:    movslq %edx, %rax368; DISABLED-NEXT:    movq %rax, (%rdi)369; DISABLED-NEXT:    movb %dl, 8(%rdi)370; DISABLED-NEXT:  .LBB5_2: # %if.end371; DISABLED-NEXT:    movups (%rdi), %xmm0372; DISABLED-NEXT:    movups %xmm0, (%rsi)373; DISABLED-NEXT:    retq374;375; AVX-LABEL: test_mixed_type:376; AVX:       # %bb.0: # %entry377; AVX-NEXT:    cmpl $18, %edx378; AVX-NEXT:    jl .LBB5_2379; AVX-NEXT:  # %bb.1: # %if.then380; AVX-NEXT:    movslq %edx, %rax381; AVX-NEXT:    movq %rax, (%rdi)382; AVX-NEXT:    movb %dl, 8(%rdi)383; AVX-NEXT:  .LBB5_2: # %if.end384; AVX-NEXT:    movq (%rdi), %rax385; AVX-NEXT:    movq %rax, (%rsi)386; AVX-NEXT:    movzbl 8(%rdi), %eax387; AVX-NEXT:    movb %al, 8(%rsi)388; AVX-NEXT:    movl 9(%rdi), %eax389; AVX-NEXT:    movl %eax, 9(%rsi)390; AVX-NEXT:    movzwl 13(%rdi), %eax391; AVX-NEXT:    movw %ax, 13(%rsi)392; AVX-NEXT:    movzbl 15(%rdi), %eax393; AVX-NEXT:    movb %al, 15(%rsi)394; AVX-NEXT:    retq395entry:396  %cmp = icmp sgt i32 %x, 17397  br i1 %cmp, label %if.then, label %if.end398 399if.then:                                          ; preds = %entry400  %conv = sext i32 %x to i64401  store i64 %conv, ptr %s1, align 8402  %conv1 = trunc i32 %x to i8403  %b = getelementptr inbounds %struct.S3, ptr %s1, i64 0, i32 1404  store i8 %conv1, ptr %b, align 8405  br label %if.end406 407if.end:                                           ; preds = %if.then, %entry408  tail call void @llvm.memcpy.p0.p0.i64(ptr %s2, ptr %s1, i64 16, i32 8, i1 false)409  ret void410}411%struct.S4 = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }412 413; Function Attrs: nounwind uwtable414define void @test_multiple_blocks(ptr nocapture noalias %s1, ptr nocapture %s2) local_unnamed_addr #0 {415; CHECK-LABEL: test_multiple_blocks:416; CHECK:       # %bb.0: # %entry417; CHECK-NEXT:    movl $0, 4(%rdi)418; CHECK-NEXT:    movl $0, 36(%rdi)419; CHECK-NEXT:    movups 16(%rdi), %xmm0420; CHECK-NEXT:    movups %xmm0, 16(%rsi)421; CHECK-NEXT:    movl 32(%rdi), %eax422; CHECK-NEXT:    movl %eax, 32(%rsi)423; CHECK-NEXT:    movl 36(%rdi), %eax424; CHECK-NEXT:    movl %eax, 36(%rsi)425; CHECK-NEXT:    movq 40(%rdi), %rax426; CHECK-NEXT:    movq %rax, 40(%rsi)427; CHECK-NEXT:    movl (%rdi), %eax428; CHECK-NEXT:    movl %eax, (%rsi)429; CHECK-NEXT:    movl 4(%rdi), %eax430; CHECK-NEXT:    movl %eax, 4(%rsi)431; CHECK-NEXT:    movq 8(%rdi), %rax432; CHECK-NEXT:    movq %rax, 8(%rsi)433; CHECK-NEXT:    retq434;435; DISABLED-LABEL: test_multiple_blocks:436; DISABLED:       # %bb.0: # %entry437; DISABLED-NEXT:    movl $0, 4(%rdi)438; DISABLED-NEXT:    movl $0, 36(%rdi)439; DISABLED-NEXT:    movups 16(%rdi), %xmm0440; DISABLED-NEXT:    movups %xmm0, 16(%rsi)441; DISABLED-NEXT:    movups 32(%rdi), %xmm0442; DISABLED-NEXT:    movups %xmm0, 32(%rsi)443; DISABLED-NEXT:    movups (%rdi), %xmm0444; DISABLED-NEXT:    movups %xmm0, (%rsi)445; DISABLED-NEXT:    retq446;447; AVX-LABEL: test_multiple_blocks:448; AVX:       # %bb.0: # %entry449; AVX-NEXT:    movl $0, 4(%rdi)450; AVX-NEXT:    movl $0, 36(%rdi)451; AVX-NEXT:    vmovups 16(%rdi), %xmm0452; AVX-NEXT:    vmovups %xmm0, 16(%rsi)453; AVX-NEXT:    movl 32(%rdi), %eax454; AVX-NEXT:    movl %eax, 32(%rsi)455; AVX-NEXT:    movl 36(%rdi), %eax456; AVX-NEXT:    movl %eax, 36(%rsi)457; AVX-NEXT:    movq 40(%rdi), %rax458; AVX-NEXT:    movq %rax, 40(%rsi)459; AVX-NEXT:    movl (%rdi), %eax460; AVX-NEXT:    movl %eax, (%rsi)461; AVX-NEXT:    movl 4(%rdi), %eax462; AVX-NEXT:    movl %eax, 4(%rsi)463; AVX-NEXT:    vmovups 8(%rdi), %xmm0464; AVX-NEXT:    vmovups %xmm0, 8(%rsi)465; AVX-NEXT:    movq 24(%rdi), %rax466; AVX-NEXT:    movq %rax, 24(%rsi)467; AVX-NEXT:    retq468entry:469  %b = getelementptr inbounds %struct.S4, ptr %s1, i64 0, i32 1470  store i32 0, ptr %b, align 4471  %b3 = getelementptr inbounds %struct.S4, ptr %s1, i64 0, i32 9472  store i32 0, ptr %b3, align 4473  tail call void @llvm.memcpy.p0.p0.i64(ptr %s2, ptr %s1, i64 48, i32 4, i1 false)474  ret void475}476%struct.S5 = type { i16, i16, i16, i16, i16, i16, i16, i16 }477 478; Function Attrs: nounwind uwtable479define void @test_type16(ptr nocapture noalias %s1, ptr nocapture %s2, i32 %x, ptr nocapture %s3, ptr nocapture readonly %s4) local_unnamed_addr #0 {480; CHECK-LABEL: test_type16:481; CHECK:       # %bb.0: # %entry482; CHECK-NEXT:    cmpl $18, %edx483; CHECK-NEXT:    jl .LBB7_2484; CHECK-NEXT:  # %bb.1: # %if.then485; CHECK-NEXT:    movw %dx, 2(%rdi)486; CHECK-NEXT:  .LBB7_2: # %if.end487; CHECK-NEXT:    movups (%r8), %xmm0488; CHECK-NEXT:    movups %xmm0, (%rcx)489; CHECK-NEXT:    movzwl (%rdi), %eax490; CHECK-NEXT:    movw %ax, (%rsi)491; CHECK-NEXT:    movzwl 2(%rdi), %eax492; CHECK-NEXT:    movw %ax, 2(%rsi)493; CHECK-NEXT:    movq 4(%rdi), %rax494; CHECK-NEXT:    movq %rax, 4(%rsi)495; CHECK-NEXT:    movl 12(%rdi), %eax496; CHECK-NEXT:    movl %eax, 12(%rsi)497; CHECK-NEXT:    retq498;499; DISABLED-LABEL: test_type16:500; DISABLED:       # %bb.0: # %entry501; DISABLED-NEXT:    cmpl $18, %edx502; DISABLED-NEXT:    jl .LBB7_2503; DISABLED-NEXT:  # %bb.1: # %if.then504; DISABLED-NEXT:    movw %dx, 2(%rdi)505; DISABLED-NEXT:  .LBB7_2: # %if.end506; DISABLED-NEXT:    movups (%r8), %xmm0507; DISABLED-NEXT:    movups %xmm0, (%rcx)508; DISABLED-NEXT:    movups (%rdi), %xmm0509; DISABLED-NEXT:    movups %xmm0, (%rsi)510; DISABLED-NEXT:    retq511;512; AVX-LABEL: test_type16:513; AVX:       # %bb.0: # %entry514; AVX-NEXT:    cmpl $18, %edx515; AVX-NEXT:    jl .LBB7_2516; AVX-NEXT:  # %bb.1: # %if.then517; AVX-NEXT:    movw %dx, 2(%rdi)518; AVX-NEXT:  .LBB7_2: # %if.end519; AVX-NEXT:    vmovups (%r8), %xmm0520; AVX-NEXT:    vmovups %xmm0, (%rcx)521; AVX-NEXT:    movzwl (%rdi), %eax522; AVX-NEXT:    movw %ax, (%rsi)523; AVX-NEXT:    movzwl 2(%rdi), %eax524; AVX-NEXT:    movw %ax, 2(%rsi)525; AVX-NEXT:    movq 4(%rdi), %rax526; AVX-NEXT:    movq %rax, 4(%rsi)527; AVX-NEXT:    movl 12(%rdi), %eax528; AVX-NEXT:    movl %eax, 12(%rsi)529; AVX-NEXT:    retq530entry:531  %cmp = icmp sgt i32 %x, 17532  br i1 %cmp, label %if.then, label %if.end533 534if.then:                                          ; preds = %entry535  %conv = trunc i32 %x to i16536  %b = getelementptr inbounds %struct.S5, ptr %s1, i64 0, i32 1537  store i16 %conv, ptr %b, align 2538  br label %if.end539 540if.end:                                           ; preds = %if.then, %entry541  tail call void @llvm.memcpy.p0.p0.i64(ptr %s3, ptr %s4, i64 16, i32 2, i1 false)542  tail call void @llvm.memcpy.p0.p0.i64(ptr %s2, ptr %s1, i64 16, i32 2, i1 false)543  ret void544}545 546%struct.S6 = type { [4 x i32], i32, i32, i32, i32 }547 548; Function Attrs: nounwind uwtable549define void @test_stack(ptr noalias nocapture sret(%struct.S6) %agg.result, ptr byval(%struct.S6) nocapture readnone align 8 %s1, ptr byval(%struct.S6) nocapture align 8 %s2, i32 %x) local_unnamed_addr #0 {550; CHECK-LABEL: test_stack:551; CHECK:       # %bb.0: # %entry552; CHECK-NEXT:    movq %rdi, %rax553; CHECK-NEXT:    movl %esi, {{[0-9]+}}(%rsp)554; CHECK-NEXT:    movaps {{[0-9]+}}(%rsp), %xmm0555; CHECK-NEXT:    movups %xmm0, (%rdi)556; CHECK-NEXT:    movq {{[0-9]+}}(%rsp), %rcx557; CHECK-NEXT:    movq %rcx, 16(%rdi)558; CHECK-NEXT:    movl {{[0-9]+}}(%rsp), %ecx559; CHECK-NEXT:    movl %ecx, 24(%rdi)560; CHECK-NEXT:    movl {{[0-9]+}}(%rsp), %ecx561; CHECK-NEXT:    movl %ecx, 28(%rdi)562; CHECK-NEXT:    movaps {{[0-9]+}}(%rsp), %xmm0563; CHECK-NEXT:    movq {{[0-9]+}}(%rsp), %rcx564; CHECK-NEXT:    movl {{[0-9]+}}(%rsp), %edx565; CHECK-NEXT:    movl {{[0-9]+}}(%rsp), %esi566; CHECK-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp)567; CHECK-NEXT:    movq %rcx, {{[0-9]+}}(%rsp)568; CHECK-NEXT:    movl %edx, {{[0-9]+}}(%rsp)569; CHECK-NEXT:    movl %esi, {{[0-9]+}}(%rsp)570; CHECK-NEXT:    retq571;572; DISABLED-LABEL: test_stack:573; DISABLED:       # %bb.0: # %entry574; DISABLED-NEXT:    movq %rdi, %rax575; DISABLED-NEXT:    movl %esi, {{[0-9]+}}(%rsp)576; DISABLED-NEXT:    movaps {{[0-9]+}}(%rsp), %xmm0577; DISABLED-NEXT:    movups %xmm0, (%rdi)578; DISABLED-NEXT:    movaps {{[0-9]+}}(%rsp), %xmm0579; DISABLED-NEXT:    movups %xmm0, 16(%rdi)580; DISABLED-NEXT:    movaps {{[0-9]+}}(%rsp), %xmm0581; DISABLED-NEXT:    movaps {{[0-9]+}}(%rsp), %xmm1582; DISABLED-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp)583; DISABLED-NEXT:    movaps %xmm1, {{[0-9]+}}(%rsp)584; DISABLED-NEXT:    retq585;586; AVX-LABEL: test_stack:587; AVX:       # %bb.0: # %entry588; AVX-NEXT:    movq %rdi, %rax589; AVX-NEXT:    movl %esi, {{[0-9]+}}(%rsp)590; AVX-NEXT:    vmovups {{[0-9]+}}(%rsp), %xmm0591; AVX-NEXT:    vmovups %xmm0, (%rdi)592; AVX-NEXT:    movq {{[0-9]+}}(%rsp), %rcx593; AVX-NEXT:    movq %rcx, 16(%rdi)594; AVX-NEXT:    movl {{[0-9]+}}(%rsp), %ecx595; AVX-NEXT:    movl %ecx, 24(%rdi)596; AVX-NEXT:    movl {{[0-9]+}}(%rsp), %ecx597; AVX-NEXT:    movl %ecx, 28(%rdi)598; AVX-NEXT:    vmovups {{[0-9]+}}(%rsp), %xmm0599; AVX-NEXT:    vmovups %xmm0, {{[0-9]+}}(%rsp)600; AVX-NEXT:    movq {{[0-9]+}}(%rsp), %rcx601; AVX-NEXT:    movq %rcx, {{[0-9]+}}(%rsp)602; AVX-NEXT:    movl {{[0-9]+}}(%rsp), %ecx603; AVX-NEXT:    movl %ecx, {{[0-9]+}}(%rsp)604; AVX-NEXT:    movl {{[0-9]+}}(%rsp), %ecx605; AVX-NEXT:    movl %ecx, {{[0-9]+}}(%rsp)606; AVX-NEXT:    retq607entry:608  %s6.sroa.3.0..sroa_idx4 = getelementptr inbounds %struct.S6, ptr %s2, i64 0, i32 3609  store i32 %x, ptr %s6.sroa.3.0..sroa_idx4, align 8610  call void @llvm.memcpy.p0.p0.i64(ptr %agg.result, ptr nonnull %s2, i64 32, i32 4, i1 false)611  call void @llvm.memcpy.p0.p0.i64(ptr nonnull %s1, ptr nonnull %s2, i64 32, i32 4, i1 false)612 613  ret void614}615 616; Function Attrs: nounwind uwtable617define void @test_limit_all(ptr noalias  %s1, ptr nocapture %s2, i32 %x, ptr nocapture %s3, ptr nocapture readonly %s4, i32 %x2) local_unnamed_addr #0 {618; SSE-LABEL: test_limit_all:619; SSE:       # %bb.0: # %entry620; SSE-NEXT:    pushq %rbp621; SSE-NEXT:    .cfi_def_cfa_offset 16622; SSE-NEXT:    pushq %r15623; SSE-NEXT:    .cfi_def_cfa_offset 24624; SSE-NEXT:    pushq %r14625; SSE-NEXT:    .cfi_def_cfa_offset 32626; SSE-NEXT:    pushq %r12627; SSE-NEXT:    .cfi_def_cfa_offset 40628; SSE-NEXT:    pushq %rbx629; SSE-NEXT:    .cfi_def_cfa_offset 48630; SSE-NEXT:    .cfi_offset %rbx, -48631; SSE-NEXT:    .cfi_offset %r12, -40632; SSE-NEXT:    .cfi_offset %r14, -32633; SSE-NEXT:    .cfi_offset %r15, -24634; SSE-NEXT:    .cfi_offset %rbp, -16635; SSE-NEXT:    movq %r8, %r15636; SSE-NEXT:    movq %rcx, %r14637; SSE-NEXT:    movl %edx, %ebp638; SSE-NEXT:    movq %rsi, %rbx639; SSE-NEXT:    movq %rdi, %r12640; SSE-NEXT:    movl %r9d, 12(%rdi)641; SSE-NEXT:    callq bar@PLT642; SSE-NEXT:    cmpl $18, %ebp643; SSE-NEXT:    jl .LBB9_2644; SSE-NEXT:  # %bb.1: # %if.then645; SSE-NEXT:    movl %ebp, 4(%r12)646; SSE-NEXT:    movq %r12, %rdi647; SSE-NEXT:    callq bar@PLT648; SSE-NEXT:  .LBB9_2: # %if.end649; SSE-NEXT:    movups (%r15), %xmm0650; SSE-NEXT:    movups %xmm0, (%r14)651; SSE-NEXT:    movups (%r12), %xmm0652; SSE-NEXT:    movups %xmm0, (%rbx)653; SSE-NEXT:    popq %rbx654; SSE-NEXT:    .cfi_def_cfa_offset 40655; SSE-NEXT:    popq %r12656; SSE-NEXT:    .cfi_def_cfa_offset 32657; SSE-NEXT:    popq %r14658; SSE-NEXT:    .cfi_def_cfa_offset 24659; SSE-NEXT:    popq %r15660; SSE-NEXT:    .cfi_def_cfa_offset 16661; SSE-NEXT:    popq %rbp662; SSE-NEXT:    .cfi_def_cfa_offset 8663; SSE-NEXT:    retq664;665; AVX-LABEL: test_limit_all:666; AVX:       # %bb.0: # %entry667; AVX-NEXT:    pushq %rbp668; AVX-NEXT:    .cfi_def_cfa_offset 16669; AVX-NEXT:    pushq %r15670; AVX-NEXT:    .cfi_def_cfa_offset 24671; AVX-NEXT:    pushq %r14672; AVX-NEXT:    .cfi_def_cfa_offset 32673; AVX-NEXT:    pushq %r12674; AVX-NEXT:    .cfi_def_cfa_offset 40675; AVX-NEXT:    pushq %rbx676; AVX-NEXT:    .cfi_def_cfa_offset 48677; AVX-NEXT:    .cfi_offset %rbx, -48678; AVX-NEXT:    .cfi_offset %r12, -40679; AVX-NEXT:    .cfi_offset %r14, -32680; AVX-NEXT:    .cfi_offset %r15, -24681; AVX-NEXT:    .cfi_offset %rbp, -16682; AVX-NEXT:    movq %r8, %r15683; AVX-NEXT:    movq %rcx, %r14684; AVX-NEXT:    movl %edx, %ebp685; AVX-NEXT:    movq %rsi, %rbx686; AVX-NEXT:    movq %rdi, %r12687; AVX-NEXT:    movl %r9d, 12(%rdi)688; AVX-NEXT:    callq bar@PLT689; AVX-NEXT:    cmpl $18, %ebp690; AVX-NEXT:    jl .LBB9_2691; AVX-NEXT:  # %bb.1: # %if.then692; AVX-NEXT:    movl %ebp, 4(%r12)693; AVX-NEXT:    movq %r12, %rdi694; AVX-NEXT:    callq bar@PLT695; AVX-NEXT:  .LBB9_2: # %if.end696; AVX-NEXT:    vmovups (%r15), %xmm0697; AVX-NEXT:    vmovups %xmm0, (%r14)698; AVX-NEXT:    vmovups (%r12), %xmm0699; AVX-NEXT:    vmovups %xmm0, (%rbx)700; AVX-NEXT:    popq %rbx701; AVX-NEXT:    .cfi_def_cfa_offset 40702; AVX-NEXT:    popq %r12703; AVX-NEXT:    .cfi_def_cfa_offset 32704; AVX-NEXT:    popq %r14705; AVX-NEXT:    .cfi_def_cfa_offset 24706; AVX-NEXT:    popq %r15707; AVX-NEXT:    .cfi_def_cfa_offset 16708; AVX-NEXT:    popq %rbp709; AVX-NEXT:    .cfi_def_cfa_offset 8710; AVX-NEXT:    retq711entry:712  %d = getelementptr inbounds %struct.S, ptr %s1, i64 0, i32 3713  store i32 %x2, ptr %d, align 4714  tail call void @bar(ptr %s1) #3715  %cmp = icmp sgt i32 %x, 17716  br i1 %cmp, label %if.then, label %if.end717 718if.then:                                          ; preds = %entry719  %b = getelementptr inbounds %struct.S, ptr %s1, i64 0, i32 1720  store i32 %x, ptr %b, align 4721  tail call void @bar(ptr nonnull %s1) #3722  br label %if.end723 724if.end:                                           ; preds = %if.then, %entry725  tail call void @llvm.memcpy.p0.p0.i64(ptr %s3, ptr %s4, i64 16, i32 4, i1 false)726  tail call void @llvm.memcpy.p0.p0.i64(ptr %s2, ptr %s1, i64 16, i32 4, i1 false)727  ret void728}729 730; Function Attrs: nounwind uwtable731define void @test_limit_one_pred(ptr noalias %s1, ptr nocapture %s2, i32 %x, ptr nocapture %s3, ptr nocapture readonly %s4, i32 %x2) local_unnamed_addr #0 {732; CHECK-LABEL: test_limit_one_pred:733; CHECK:       # %bb.0: # %entry734; CHECK-NEXT:    pushq %r15735; CHECK-NEXT:    .cfi_def_cfa_offset 16736; CHECK-NEXT:    pushq %r14737; CHECK-NEXT:    .cfi_def_cfa_offset 24738; CHECK-NEXT:    pushq %r12739; CHECK-NEXT:    .cfi_def_cfa_offset 32740; CHECK-NEXT:    pushq %rbx741; CHECK-NEXT:    .cfi_def_cfa_offset 40742; CHECK-NEXT:    pushq %rax743; CHECK-NEXT:    .cfi_def_cfa_offset 48744; CHECK-NEXT:    .cfi_offset %rbx, -40745; CHECK-NEXT:    .cfi_offset %r12, -32746; CHECK-NEXT:    .cfi_offset %r14, -24747; CHECK-NEXT:    .cfi_offset %r15, -16748; CHECK-NEXT:    movq %r8, %r12749; CHECK-NEXT:    movq %rcx, %r15750; CHECK-NEXT:    movq %rsi, %rbx751; CHECK-NEXT:    movq %rdi, %r14752; CHECK-NEXT:    movl %r9d, 12(%rdi)753; CHECK-NEXT:    cmpl $18, %edx754; CHECK-NEXT:    jl .LBB10_2755; CHECK-NEXT:  # %bb.1: # %if.then756; CHECK-NEXT:    movl %edx, 4(%r14)757; CHECK-NEXT:    movq %r14, %rdi758; CHECK-NEXT:    callq bar@PLT759; CHECK-NEXT:  .LBB10_2: # %if.end760; CHECK-NEXT:    movups (%r12), %xmm0761; CHECK-NEXT:    movups %xmm0, (%r15)762; CHECK-NEXT:    movq (%r14), %rax763; CHECK-NEXT:    movq %rax, (%rbx)764; CHECK-NEXT:    movl 8(%r14), %eax765; CHECK-NEXT:    movl %eax, 8(%rbx)766; CHECK-NEXT:    movl 12(%r14), %eax767; CHECK-NEXT:    movl %eax, 12(%rbx)768; CHECK-NEXT:    addq $8, %rsp769; CHECK-NEXT:    .cfi_def_cfa_offset 40770; CHECK-NEXT:    popq %rbx771; CHECK-NEXT:    .cfi_def_cfa_offset 32772; CHECK-NEXT:    popq %r12773; CHECK-NEXT:    .cfi_def_cfa_offset 24774; CHECK-NEXT:    popq %r14775; CHECK-NEXT:    .cfi_def_cfa_offset 16776; CHECK-NEXT:    popq %r15777; CHECK-NEXT:    .cfi_def_cfa_offset 8778; CHECK-NEXT:    retq779;780; DISABLED-LABEL: test_limit_one_pred:781; DISABLED:       # %bb.0: # %entry782; DISABLED-NEXT:    pushq %r15783; DISABLED-NEXT:    .cfi_def_cfa_offset 16784; DISABLED-NEXT:    pushq %r14785; DISABLED-NEXT:    .cfi_def_cfa_offset 24786; DISABLED-NEXT:    pushq %r12787; DISABLED-NEXT:    .cfi_def_cfa_offset 32788; DISABLED-NEXT:    pushq %rbx789; DISABLED-NEXT:    .cfi_def_cfa_offset 40790; DISABLED-NEXT:    pushq %rax791; DISABLED-NEXT:    .cfi_def_cfa_offset 48792; DISABLED-NEXT:    .cfi_offset %rbx, -40793; DISABLED-NEXT:    .cfi_offset %r12, -32794; DISABLED-NEXT:    .cfi_offset %r14, -24795; DISABLED-NEXT:    .cfi_offset %r15, -16796; DISABLED-NEXT:    movq %r8, %r15797; DISABLED-NEXT:    movq %rcx, %r14798; DISABLED-NEXT:    movq %rsi, %rbx799; DISABLED-NEXT:    movq %rdi, %r12800; DISABLED-NEXT:    movl %r9d, 12(%rdi)801; DISABLED-NEXT:    cmpl $18, %edx802; DISABLED-NEXT:    jl .LBB10_2803; DISABLED-NEXT:  # %bb.1: # %if.then804; DISABLED-NEXT:    movl %edx, 4(%r12)805; DISABLED-NEXT:    movq %r12, %rdi806; DISABLED-NEXT:    callq bar@PLT807; DISABLED-NEXT:  .LBB10_2: # %if.end808; DISABLED-NEXT:    movups (%r15), %xmm0809; DISABLED-NEXT:    movups %xmm0, (%r14)810; DISABLED-NEXT:    movups (%r12), %xmm0811; DISABLED-NEXT:    movups %xmm0, (%rbx)812; DISABLED-NEXT:    addq $8, %rsp813; DISABLED-NEXT:    .cfi_def_cfa_offset 40814; DISABLED-NEXT:    popq %rbx815; DISABLED-NEXT:    .cfi_def_cfa_offset 32816; DISABLED-NEXT:    popq %r12817; DISABLED-NEXT:    .cfi_def_cfa_offset 24818; DISABLED-NEXT:    popq %r14819; DISABLED-NEXT:    .cfi_def_cfa_offset 16820; DISABLED-NEXT:    popq %r15821; DISABLED-NEXT:    .cfi_def_cfa_offset 8822; DISABLED-NEXT:    retq823;824; AVX-LABEL: test_limit_one_pred:825; AVX:       # %bb.0: # %entry826; AVX-NEXT:    pushq %r15827; AVX-NEXT:    .cfi_def_cfa_offset 16828; AVX-NEXT:    pushq %r14829; AVX-NEXT:    .cfi_def_cfa_offset 24830; AVX-NEXT:    pushq %r12831; AVX-NEXT:    .cfi_def_cfa_offset 32832; AVX-NEXT:    pushq %rbx833; AVX-NEXT:    .cfi_def_cfa_offset 40834; AVX-NEXT:    pushq %rax835; AVX-NEXT:    .cfi_def_cfa_offset 48836; AVX-NEXT:    .cfi_offset %rbx, -40837; AVX-NEXT:    .cfi_offset %r12, -32838; AVX-NEXT:    .cfi_offset %r14, -24839; AVX-NEXT:    .cfi_offset %r15, -16840; AVX-NEXT:    movq %r8, %r12841; AVX-NEXT:    movq %rcx, %r15842; AVX-NEXT:    movq %rsi, %rbx843; AVX-NEXT:    movq %rdi, %r14844; AVX-NEXT:    movl %r9d, 12(%rdi)845; AVX-NEXT:    cmpl $18, %edx846; AVX-NEXT:    jl .LBB10_2847; AVX-NEXT:  # %bb.1: # %if.then848; AVX-NEXT:    movl %edx, 4(%r14)849; AVX-NEXT:    movq %r14, %rdi850; AVX-NEXT:    callq bar@PLT851; AVX-NEXT:  .LBB10_2: # %if.end852; AVX-NEXT:    vmovups (%r12), %xmm0853; AVX-NEXT:    vmovups %xmm0, (%r15)854; AVX-NEXT:    movq (%r14), %rax855; AVX-NEXT:    movq %rax, (%rbx)856; AVX-NEXT:    movl 8(%r14), %eax857; AVX-NEXT:    movl %eax, 8(%rbx)858; AVX-NEXT:    movl 12(%r14), %eax859; AVX-NEXT:    movl %eax, 12(%rbx)860; AVX-NEXT:    addq $8, %rsp861; AVX-NEXT:    .cfi_def_cfa_offset 40862; AVX-NEXT:    popq %rbx863; AVX-NEXT:    .cfi_def_cfa_offset 32864; AVX-NEXT:    popq %r12865; AVX-NEXT:    .cfi_def_cfa_offset 24866; AVX-NEXT:    popq %r14867; AVX-NEXT:    .cfi_def_cfa_offset 16868; AVX-NEXT:    popq %r15869; AVX-NEXT:    .cfi_def_cfa_offset 8870; AVX-NEXT:    retq871entry:872  %d = getelementptr inbounds %struct.S, ptr %s1, i64 0, i32 3873  store i32 %x2, ptr %d, align 4874  %cmp = icmp sgt i32 %x, 17875  br i1 %cmp, label %if.then, label %if.end876 877if.then:                                          ; preds = %entry878  %b = getelementptr inbounds %struct.S, ptr %s1, i64 0, i32 1879  store i32 %x, ptr %b, align 4880  tail call void @bar(ptr nonnull %s1) #3881  br label %if.end882 883if.end:                                           ; preds = %if.then, %entry884  tail call void @llvm.memcpy.p0.p0.i64(ptr %s3, ptr %s4, i64 16, i32 4, i1 false)885  tail call void @llvm.memcpy.p0.p0.i64(ptr %s2, ptr %s1, i64 16, i32 4, i1 false)886  ret void887}888 889 890declare void @bar(ptr) local_unnamed_addr #1891 892 893%struct.S7 = type { float, float, float , float, float, float, float, float }894 895; Function Attrs: nounwind uwtable896define void @test_conditional_block_float(ptr nocapture noalias %s1, ptr nocapture %s2, i32 %x, ptr nocapture %s3, ptr nocapture readonly %s4, float %y) local_unnamed_addr #0 {897; CHECK-LABEL: test_conditional_block_float:898; CHECK:       # %bb.0: # %entry899; CHECK-NEXT:    cmpl $18, %edx900; CHECK-NEXT:    jl .LBB11_2901; CHECK-NEXT:  # %bb.1: # %if.then902; CHECK-NEXT:    movl $1065353216, 4(%rdi) # imm = 0x3F800000903; CHECK-NEXT:  .LBB11_2: # %if.end904; CHECK-NEXT:    movups (%r8), %xmm0905; CHECK-NEXT:    movups 16(%r8), %xmm1906; CHECK-NEXT:    movups %xmm1, 16(%rcx)907; CHECK-NEXT:    movups %xmm0, (%rcx)908; CHECK-NEXT:    movl (%rdi), %eax909; CHECK-NEXT:    movl 4(%rdi), %ecx910; CHECK-NEXT:    movq 8(%rdi), %rdx911; CHECK-NEXT:    movups 16(%rdi), %xmm0912; CHECK-NEXT:    movups %xmm0, 16(%rsi)913; CHECK-NEXT:    movl %eax, (%rsi)914; CHECK-NEXT:    movl %ecx, 4(%rsi)915; CHECK-NEXT:    movq %rdx, 8(%rsi)916; CHECK-NEXT:    retq917;918; DISABLED-LABEL: test_conditional_block_float:919; DISABLED:       # %bb.0: # %entry920; DISABLED-NEXT:    cmpl $18, %edx921; DISABLED-NEXT:    jl .LBB11_2922; DISABLED-NEXT:  # %bb.1: # %if.then923; DISABLED-NEXT:    movl $1065353216, 4(%rdi) # imm = 0x3F800000924; DISABLED-NEXT:  .LBB11_2: # %if.end925; DISABLED-NEXT:    movups (%r8), %xmm0926; DISABLED-NEXT:    movups 16(%r8), %xmm1927; DISABLED-NEXT:    movups %xmm1, 16(%rcx)928; DISABLED-NEXT:    movups %xmm0, (%rcx)929; DISABLED-NEXT:    movups (%rdi), %xmm0930; DISABLED-NEXT:    movups 16(%rdi), %xmm1931; DISABLED-NEXT:    movups %xmm1, 16(%rsi)932; DISABLED-NEXT:    movups %xmm0, (%rsi)933; DISABLED-NEXT:    retq934;935; AVX-LABEL: test_conditional_block_float:936; AVX:       # %bb.0: # %entry937; AVX-NEXT:    cmpl $18, %edx938; AVX-NEXT:    jl .LBB11_2939; AVX-NEXT:  # %bb.1: # %if.then940; AVX-NEXT:    movl $1065353216, 4(%rdi) # imm = 0x3F800000941; AVX-NEXT:  .LBB11_2: # %if.end942; AVX-NEXT:    vmovups (%r8), %ymm0943; AVX-NEXT:    vmovups %ymm0, (%rcx)944; AVX-NEXT:    movl (%rdi), %eax945; AVX-NEXT:    movl %eax, (%rsi)946; AVX-NEXT:    movl 4(%rdi), %eax947; AVX-NEXT:    movl %eax, 4(%rsi)948; AVX-NEXT:    vmovups 8(%rdi), %xmm0949; AVX-NEXT:    vmovups %xmm0, 8(%rsi)950; AVX-NEXT:    movq 24(%rdi), %rax951; AVX-NEXT:    movq %rax, 24(%rsi)952; AVX-NEXT:    vzeroupper953; AVX-NEXT:    retq954entry:955  %cmp = icmp sgt i32 %x, 17956  br i1 %cmp, label %if.then, label %if.end957 958if.then:                                          ; preds = %entry959  %b = getelementptr inbounds %struct.S7, ptr %s1, i64 0, i32 1960  store float 1.0, ptr %b, align 4961  br label %if.end962 963if.end:                                           ; preds = %if.then, %entry964  tail call void @llvm.memcpy.p0.p0.i64(ptr %s3, ptr %s4, i64 32, i32 4, i1 false)965  tail call void @llvm.memcpy.p0.p0.i64(ptr %s2, ptr %s1, i64 32, i32 4, i1 false)966  ret void967}968 969%struct.S8 = type { i64, i64, i64, i64, i64, i64 }970 971; Function Attrs: nounwind uwtable972define void @test_conditional_block_ymm(ptr nocapture noalias %s1, ptr nocapture %s2, i32 %x, ptr nocapture %s3, ptr nocapture readonly %s4) local_unnamed_addr #0 {973; CHECK-LABEL: test_conditional_block_ymm:974; CHECK:       # %bb.0: # %entry975; CHECK-NEXT:    cmpl $18, %edx976; CHECK-NEXT:    jl .LBB12_2977; CHECK-NEXT:  # %bb.1: # %if.then978; CHECK-NEXT:    movq $1, 8(%rdi)979; CHECK-NEXT:  .LBB12_2: # %if.end980; CHECK-NEXT:    movups (%r8), %xmm0981; CHECK-NEXT:    movups 16(%r8), %xmm1982; CHECK-NEXT:    movups %xmm1, 16(%rcx)983; CHECK-NEXT:    movups %xmm0, (%rcx)984; CHECK-NEXT:    movq (%rdi), %rax985; CHECK-NEXT:    movq 8(%rdi), %rcx986; CHECK-NEXT:    movups 16(%rdi), %xmm0987; CHECK-NEXT:    movups %xmm0, 16(%rsi)988; CHECK-NEXT:    movq %rax, (%rsi)989; CHECK-NEXT:    movq %rcx, 8(%rsi)990; CHECK-NEXT:    retq991;992; DISABLED-LABEL: test_conditional_block_ymm:993; DISABLED:       # %bb.0: # %entry994; DISABLED-NEXT:    cmpl $18, %edx995; DISABLED-NEXT:    jl .LBB12_2996; DISABLED-NEXT:  # %bb.1: # %if.then997; DISABLED-NEXT:    movq $1, 8(%rdi)998; DISABLED-NEXT:  .LBB12_2: # %if.end999; DISABLED-NEXT:    movups (%r8), %xmm01000; DISABLED-NEXT:    movups 16(%r8), %xmm11001; DISABLED-NEXT:    movups %xmm1, 16(%rcx)1002; DISABLED-NEXT:    movups %xmm0, (%rcx)1003; DISABLED-NEXT:    movups (%rdi), %xmm01004; DISABLED-NEXT:    movups 16(%rdi), %xmm11005; DISABLED-NEXT:    movups %xmm1, 16(%rsi)1006; DISABLED-NEXT:    movups %xmm0, (%rsi)1007; DISABLED-NEXT:    retq1008;1009; AVX-LABEL: test_conditional_block_ymm:1010; AVX:       # %bb.0: # %entry1011; AVX-NEXT:    cmpl $18, %edx1012; AVX-NEXT:    jl .LBB12_21013; AVX-NEXT:  # %bb.1: # %if.then1014; AVX-NEXT:    movq $1, 8(%rdi)1015; AVX-NEXT:  .LBB12_2: # %if.end1016; AVX-NEXT:    vmovups (%r8), %ymm01017; AVX-NEXT:    vmovups %ymm0, (%rcx)1018; AVX-NEXT:    movq (%rdi), %rax1019; AVX-NEXT:    movq %rax, (%rsi)1020; AVX-NEXT:    movq 8(%rdi), %rax1021; AVX-NEXT:    movq %rax, 8(%rsi)1022; AVX-NEXT:    vmovups 16(%rdi), %xmm01023; AVX-NEXT:    vmovups %xmm0, 16(%rsi)1024; AVX-NEXT:    vzeroupper1025; AVX-NEXT:    retq1026entry:1027  %cmp = icmp sgt i32 %x, 171028  br i1 %cmp, label %if.then, label %if.end1029 1030if.then:                                          ; preds = %entry1031  %b = getelementptr inbounds %struct.S8, ptr %s1, i64 0, i32 11032  store i64 1, ptr %b, align 41033  br label %if.end1034 1035if.end:                                           ; preds = %if.then, %entry1036  tail call void @llvm.memcpy.p0.p0.i64(ptr %s3, ptr %s4, i64 32, i32 4, i1 false)1037  tail call void @llvm.memcpy.p0.p0.i64(ptr %s2, ptr %s1, i64 32, i32 4, i1 false)1038  ret void1039}1040 1041define dso_local void @test_alias(ptr nocapture %A, i32 %x) local_unnamed_addr #0 {1042; SSE-LABEL: test_alias:1043; SSE:       # %bb.0: # %entry1044; SSE-NEXT:    movl %esi, (%rdi)1045; SSE-NEXT:    movups (%rdi), %xmm01046; SSE-NEXT:    movups %xmm0, 4(%rdi)1047; SSE-NEXT:    retq1048;1049; AVX-LABEL: test_alias:1050; AVX:       # %bb.0: # %entry1051; AVX-NEXT:    movl %esi, (%rdi)1052; AVX-NEXT:    vmovups (%rdi), %xmm01053; AVX-NEXT:    vmovups %xmm0, 4(%rdi)1054; AVX-NEXT:    retq1055entry:1056  store i32 %x, ptr %A, align 41057  %add.ptr = getelementptr inbounds i8, ptr %A, i64 41058  tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 4 %add.ptr, ptr align 4 %A, i64 16, i32 4, i1 false)1059  ret void1060}1061 1062; Function Attrs: nounwind uwtable1063define dso_local void @test_noalias(ptr nocapture %A, i32 %x) local_unnamed_addr #0 {1064; CHECK-LABEL: test_noalias:1065; CHECK:       # %bb.0: # %entry1066; CHECK-NEXT:    movl %esi, (%rdi)1067; CHECK-NEXT:    movl (%rdi), %eax1068; CHECK-NEXT:    movl %eax, 20(%rdi)1069; CHECK-NEXT:    movq 4(%rdi), %rax1070; CHECK-NEXT:    movq %rax, 24(%rdi)1071; CHECK-NEXT:    movl 12(%rdi), %eax1072; CHECK-NEXT:    movl %eax, 32(%rdi)1073; CHECK-NEXT:    retq1074;1075; DISABLED-LABEL: test_noalias:1076; DISABLED:       # %bb.0: # %entry1077; DISABLED-NEXT:    movl %esi, (%rdi)1078; DISABLED-NEXT:    movups (%rdi), %xmm01079; DISABLED-NEXT:    movups %xmm0, 20(%rdi)1080; DISABLED-NEXT:    retq1081;1082; AVX-LABEL: test_noalias:1083; AVX:       # %bb.0: # %entry1084; AVX-NEXT:    movl %esi, (%rdi)1085; AVX-NEXT:    movl (%rdi), %eax1086; AVX-NEXT:    movl %eax, 20(%rdi)1087; AVX-NEXT:    movq 4(%rdi), %rax1088; AVX-NEXT:    movq %rax, 24(%rdi)1089; AVX-NEXT:    movl 12(%rdi), %eax1090; AVX-NEXT:    movl %eax, 32(%rdi)1091; AVX-NEXT:    retq1092entry:1093  store i32 %x, ptr %A, align 41094  %add.ptr = getelementptr inbounds i8, ptr %A, i64 201095  tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 4 %add.ptr, ptr align 4 %A, i64 16, i32 4, i1 false)1096  ret void1097}1098 1099; Function Attrs: argmemonly nounwind1100declare void @llvm.memcpy.p0.p0.i64(ptr nocapture writeonly, ptr nocapture readonly, i64, i32, i1) #11101 1102attributes #0 = { nounwind uwtable }1103