summaryrefslogtreecommitdiff
path: root/test/CodeGen
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2017-05-02 18:30:13 +0000
committerDimitry Andric <dim@FreeBSD.org>2017-05-02 18:30:13 +0000
commita303c417bbdb53703c2c17398b08486bde78f1f6 (patch)
tree98366d6b93d863cefdc53f16c66c0c5ae7fb2261 /test/CodeGen
parent12f3ca4cdb95b193af905a00e722a4dcb40b3de3 (diff)
Notes
Diffstat (limited to 'test/CodeGen')
-rw-r--r--test/CodeGen/AArch64/arm64-anyregcc.ll194
-rw-r--r--test/CodeGen/AArch64/arm64-stackmap.ll76
-rw-r--r--test/CodeGen/AArch64/arm64-tls-dynamics.ll32
-rw-r--r--test/CodeGen/AArch64/stackmap-liveness.ll3
-rw-r--r--test/CodeGen/AMDGPU/annotate-kernel-features-hsa.ll4
-rw-r--r--test/CodeGen/AMDGPU/inline-asm.ll14
-rw-r--r--test/CodeGen/AMDGPU/llvm.amdgcn.init.exec.ll80
-rw-r--r--test/CodeGen/AMDGPU/zext-lid.ll39
-rw-r--r--test/CodeGen/ARM/GlobalISel/arm-irtranslator.ll85
-rw-r--r--test/CodeGen/ARM/GlobalISel/arm-isel.ll11
-rw-r--r--test/CodeGen/ARM/bool-ext-inc.ll23
-rw-r--r--test/CodeGen/AVR/calling-conv/c/stack.ll8
-rw-r--r--test/CodeGen/AVR/return.ll24
-rw-r--r--test/CodeGen/AVR/rot.ll55
-rw-r--r--test/CodeGen/AVR/varargs.ll6
-rw-r--r--test/CodeGen/BPF/mem_offset_be.ll18
-rw-r--r--test/CodeGen/Hexagon/cfgopt-fall-through.ll71
-rw-r--r--test/CodeGen/Hexagon/rdf-def-mask.ll52
-rw-r--r--test/CodeGen/Hexagon/unreachable-mbb-phi-subreg.mir25
-rw-r--r--test/CodeGen/MIR/Generic/frame-info.mir1
-rw-r--r--test/CodeGen/Mips/llvm-ir/add.ll26
-rw-r--r--test/CodeGen/Mips/llvm-ir/sub.ll12
-rw-r--r--test/CodeGen/Mips/micromips-sizereduction/micromips-lwsp-swsp.ll11
-rw-r--r--test/CodeGen/NVPTX/f16-instructions.ll15
-rw-r--r--test/CodeGen/PowerPC/build-vector-tests.ll46
-rw-r--r--test/CodeGen/PowerPC/ppc64-anyregcc.ll194
-rw-r--r--test/CodeGen/PowerPC/ppc64-i128-abi.ll20
-rw-r--r--test/CodeGen/PowerPC/ppc64-stackmap.ll76
-rw-r--r--test/CodeGen/PowerPC/swaps-le-1.ll46
-rw-r--r--test/CodeGen/PowerPC/swaps-le-2.ll31
-rw-r--r--test/CodeGen/PowerPC/vsx-ldst.ll6
-rw-r--r--test/CodeGen/PowerPC/vsx.ll20
-rw-r--r--test/CodeGen/X86/GlobalISel/binop.ll22
-rw-r--r--test/CodeGen/X86/GlobalISel/callingconv.ll38
-rw-r--r--test/CodeGen/X86/GlobalISel/ext-x86-64.ll29
-rw-r--r--test/CodeGen/X86/GlobalISel/ext.ll64
-rw-r--r--test/CodeGen/X86/GlobalISel/irtranslator-call.ll1
-rw-r--r--test/CodeGen/X86/GlobalISel/legalize-ext-x86-64.mir172
-rw-r--r--test/CodeGen/X86/GlobalISel/legalize-ext.mir116
-rw-r--r--test/CodeGen/X86/GlobalISel/memop-x32.ll101
-rw-r--r--test/CodeGen/X86/GlobalISel/memop.ll17
-rw-r--r--test/CodeGen/X86/GlobalISel/regbankselect-X86_64.mir (renamed from test/CodeGen/X86/GlobalISel/X86-regbankselect.mir)0
-rw-r--r--test/CodeGen/X86/GlobalISel/select-add.mir74
-rw-r--r--test/CodeGen/X86/GlobalISel/select-ext-x86-64.mir66
-rw-r--r--test/CodeGen/X86/GlobalISel/select-ext.mir129
-rw-r--r--test/CodeGen/X86/GlobalISel/select-inc.mir37
-rw-r--r--test/CodeGen/X86/GlobalISel/select-memop-x32.mir310
-rw-r--r--test/CodeGen/X86/GlobalISel/select-memop.mir55
-rw-r--r--test/CodeGen/X86/addcarry.ll (renamed from test/CodeGen/X86/adde-carry.ll)46
-rw-r--r--test/CodeGen/X86/all-ones-vector.ll334
-rw-r--r--test/CodeGen/X86/anyregcc.ll182
-rw-r--r--test/CodeGen/X86/avx-intrinsics-fast-isel.ll54
-rw-r--r--test/CodeGen/X86/avx512-intrinsics-fast-isel.ll120
-rw-r--r--test/CodeGen/X86/bool-ext-inc.ll42
-rw-r--r--test/CodeGen/X86/bswap_tree.ll53
-rw-r--r--test/CodeGen/X86/cast-vsel.ll611
-rw-r--r--test/CodeGen/X86/clz.ll85
-rw-r--r--test/CodeGen/X86/deopt-bundles.ll88
-rw-r--r--test/CodeGen/X86/deopt-intrinsic-cconv.ll8
-rw-r--r--test/CodeGen/X86/deopt-intrinsic.ll16
-rw-r--r--test/CodeGen/X86/inline-0bh.ll17
-rw-r--r--test/CodeGen/X86/known-bits.ll22
-rw-r--r--test/CodeGen/X86/known-signbits-vector.ll28
-rw-r--r--test/CodeGen/X86/lea-opt-with-debug.mir93
-rw-r--r--test/CodeGen/X86/mul-i1024.ll2187
-rw-r--r--test/CodeGen/X86/mul-i256.ll19
-rw-r--r--test/CodeGen/X86/mul-i512.ll166
-rw-r--r--test/CodeGen/X86/patchpoint-invoke.ll2
-rw-r--r--test/CodeGen/X86/pr14657.ll325
-rw-r--r--test/CodeGen/X86/pr28129.ll87
-rw-r--r--test/CodeGen/X86/pr31088.ll162
-rw-r--r--test/CodeGen/X86/sse2-intrinsics-fast-isel.ll16
-rw-r--r--test/CodeGen/X86/stack-protector-dbginfo.ll2
-rw-r--r--test/CodeGen/X86/stackmap-fast-isel.ll58
-rw-r--r--test/CodeGen/X86/stackmap-large-constants.ll16
-rw-r--r--test/CodeGen/X86/stackmap-large-location-size.ll172
-rw-r--r--test/CodeGen/X86/stackmap-liveness.ll10
-rw-r--r--test/CodeGen/X86/stackmap.ll141
-rw-r--r--test/CodeGen/X86/statepoint-allocas.ll34
-rw-r--r--test/CodeGen/X86/statepoint-live-in.ll20
-rw-r--r--test/CodeGen/X86/statepoint-stackmap-format.ll98
-rw-r--r--test/CodeGen/X86/statepoint-vector.ll48
-rw-r--r--test/CodeGen/X86/vector-shuffle-combining.ll34
-rw-r--r--test/CodeGen/X86/widened-broadcast.ll69
84 files changed, 5680 insertions, 2340 deletions
diff --git a/test/CodeGen/AArch64/arm64-anyregcc.ll b/test/CodeGen/AArch64/arm64-anyregcc.ll
index 1af310383243..10989a07990c 100644
--- a/test/CodeGen/AArch64/arm64-anyregcc.ll
+++ b/test/CodeGen/AArch64/arm64-anyregcc.ll
@@ -4,7 +4,7 @@
; CHECK-LABEL: .section __LLVM_STACKMAPS,__llvm_stackmaps
; CHECK-NEXT: __LLVM_StackMaps:
; Header
-; CHECK-NEXT: .byte 2
+; CHECK-NEXT: .byte 3
; CHECK-NEXT: .byte 0
; CHECK-NEXT: .short 0
; Num Functions
@@ -48,18 +48,24 @@
; CHECK-NEXT: .short 3
; Loc 0: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 4
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 4
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 2: Constant 3
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
-; CHECK-NEXT: .short 0
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 3
define i64 @test() nounwind ssp uwtable {
entry:
@@ -69,18 +75,22 @@ entry:
; property access 1 - %obj is an anyreg call argument and should therefore be in a register
; CHECK-LABEL: .long L{{.*}}-_property_access1
-; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
; 2 locations
; CHECK-NEXT: .short 2
; Loc 0: Register <-- this is the return register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define i64 @property_access1(i8* %obj) nounwind ssp uwtable {
entry:
@@ -91,18 +101,22 @@ entry:
; property access 2 - %obj is an anyreg call argument and should therefore be in a register
; CHECK-LABEL: .long L{{.*}}-_property_access2
-; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
; 2 locations
; CHECK-NEXT: .short 2
; Loc 0: Register <-- this is the return register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define i64 @property_access2() nounwind ssp uwtable {
entry:
@@ -114,18 +128,22 @@ entry:
; property access 3 - %obj is a frame index
; CHECK-LABEL: .long L{{.*}}-_property_access3
-; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
; 2 locations
; CHECK-NEXT: .short 2
; Loc 0: Register <-- this is the return register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Direct FP - 8
; CHECK-NEXT: .byte 2
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short 29
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long -8
define i64 @property_access3() nounwind ssp uwtable {
entry:
@@ -137,78 +155,106 @@ entry:
; anyreg_test1
; CHECK-LABEL: .long L{{.*}}-_anyreg_test1
-; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
; 14 locations
; CHECK-NEXT: .short 14
; Loc 0: Register <-- this is the return register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 2: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 3: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 4: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 5: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 6: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 7: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 8: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 9: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 10: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 11: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 12: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 13: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define i64 @anyreg_test1(i8* %a1, i8* %a2, i8* %a3, i8* %a4, i8* %a5, i8* %a6, i8* %a7, i8* %a8, i8* %a9, i8* %a10, i8* %a11, i8* %a12, i8* %a13) nounwind ssp uwtable {
entry:
@@ -219,78 +265,106 @@ entry:
; anyreg_test2
; CHECK-LABEL: .long L{{.*}}-_anyreg_test2
-; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
; 14 locations
; CHECK-NEXT: .short 14
; Loc 0: Register <-- this is the return register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 2: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 3: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 4: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 5: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 6: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 7: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 8: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 9: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 10: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 11: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 12: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 13: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define i64 @anyreg_test2(i8* %a1, i8* %a2, i8* %a3, i8* %a4, i8* %a5, i8* %a6, i8* %a7, i8* %a8, i8* %a9, i8* %a10, i8* %a11, i8* %a12, i8* %a13) nounwind ssp uwtable {
entry:
@@ -308,18 +382,24 @@ entry:
; CHECK-NEXT: .short 3
; Loc 0: Register (some register that will be spilled to the stack)
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define i64 @patchpoint_spilldef(i64 %p1, i64 %p2, i64 %p3, i64 %p4) {
entry:
@@ -337,28 +417,38 @@ entry:
; CHECK-NEXT: .short 5
; Loc 0: Return a register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Arg0 in a Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 2: Arg1 in a Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 3: Arg2 spilled to FP -96
; CHECK-NEXT: .byte 3
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short 29
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long -96
; Loc 4: Arg3 spilled to FP - 88
; CHECK-NEXT: .byte 3
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short 29
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long -88
define i64 @patchpoint_spillargs(i64 %p1, i64 %p2, i64 %p3, i64 %p4) {
entry:
diff --git a/test/CodeGen/AArch64/arm64-stackmap.ll b/test/CodeGen/AArch64/arm64-stackmap.ll
index 0b2e9776263d..e12a35a93e22 100644
--- a/test/CodeGen/AArch64/arm64-stackmap.ll
+++ b/test/CodeGen/AArch64/arm64-stackmap.ll
@@ -10,7 +10,7 @@ target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
; CHECK-LABEL: .section __LLVM_STACKMAPS,__llvm_stackmaps
; CHECK-NEXT: __LLVM_StackMaps:
; Header
-; CHECK-NEXT: .byte 2
+; CHECK-NEXT: .byte 3
; CHECK-NEXT: .byte 0
; CHECK-NEXT: .short 0
; Num Functions
@@ -67,22 +67,30 @@ target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
; CHECK-NEXT: .short 4
; SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 65535
; SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 65536
; SmallConstant
; CHECK-NEXT: .byte 5
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; LargeConstant at index 0
; CHECK-NEXT: .byte 5
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 1
@@ -99,12 +107,16 @@ entry:
; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 2
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define void @osrinline(i64 %a, i64 %b) {
entry:
@@ -123,12 +135,16 @@ entry:
; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 2
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define void @osrcold(i64 %a, i64 %b) {
entry:
@@ -163,12 +179,16 @@ entry:
; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 2
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define void @propertyWrite(i64 %dummy1, i64* %obj, i64 %dummy2, i64 %a) {
entry:
@@ -185,12 +205,16 @@ entry:
; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 2
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define void @jsVoidCall(i64 %dummy1, i64* %obj, i64 %arg, i64 %l1, i64 %l2) {
entry:
@@ -207,12 +231,16 @@ entry:
; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 2
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define i64 @jsIntCall(i64 %dummy1, i64* %obj, i64 %arg, i64 %l1, i64 %l2) {
entry:
@@ -233,8 +261,11 @@ entry:
; Check that at least one is a spilled entry from RBP.
; Location: Indirect FP + ...
; CHECK: .byte 3
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short
; CHECK-NEXT: .short 29
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long
define void @spilledValue(i64 %arg0, i64 %arg1, i64 %arg2, i64 %arg3, i64 %arg4, i64 %l0, i64 %l1, i64 %l2, i64 %l3, i64 %l4, i64 %l5, i64 %l6, i64 %l7, i64 %l8, i64 %l9, i64 %l10, i64 %l11, i64 %l12, i64 %l13, i64 %l14, i64 %l15, i64 %l16, i64 %l17, i64 %l18, i64 %l19, i64 %l20, i64 %l21, i64 %l22, i64 %l23, i64 %l24, i64 %l25, i64 %l26, i64 %l27) {
entry:
call void (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.void(i64 11, i32 20, i8* null, i32 5, i64 %arg0, i64 %arg1, i64 %arg2, i64 %arg3, i64 %arg4, i64 %l0, i64 %l1, i64 %l2, i64 %l3, i64 %l4, i64 %l5, i64 %l6, i64 %l7, i64 %l8, i64 %l9, i64 %l10, i64 %l11, i64 %l12, i64 %l13, i64 %l14, i64 %l15, i64 %l16, i64 %l17, i64 %l18, i64 %l19, i64 %l20, i64 %l21, i64 %l22, i64 %l23, i64 %l24, i64 %l25, i64 %l26, i64 %l27)
@@ -252,8 +283,11 @@ entry:
; Check that at least one is a spilled entry from RBP.
; Location: Indirect FP + ...
; CHECK: .byte 3
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short
; CHECK-NEXT: .short 29
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long
define webkit_jscc void @spilledStackMapValue(i64 %l0, i64 %l1, i64 %l2, i64 %l3, i64 %l4, i64 %l5, i64 %l6, i64 %l7, i64 %l8, i64 %l9, i64 %l10, i64 %l11, i64 %l12, i64 %l13, i64 %l14, i64 %l15, i64 %l16, i64 %l17, i64 %l18, i64 %l19, i64 %l20, i64 %l21, i64 %l22, i64 %l23, i64 %l24, i64 %l25, i64 %l26, i64 %l27, i64 %l28, i64 %l29) {
entry:
call void (i64, i32, ...) @llvm.experimental.stackmap(i64 12, i32 16, i64 %l0, i64 %l1, i64 %l2, i64 %l3, i64 %l4, i64 %l5, i64 %l6, i64 %l7, i64 %l8, i64 %l9, i64 %l10, i64 %l11, i64 %l12, i64 %l13, i64 %l14, i64 %l15, i64 %l16, i64 %l17, i64 %l18, i64 %l19, i64 %l20, i64 %l21, i64 %l22, i64 %l23, i64 %l24, i64 %l25, i64 %l26, i64 %l27, i64 %l28, i64 %l29)
@@ -269,7 +303,9 @@ entry:
; CHECK-NEXT: .short 1
; Loc 0: SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 33
@@ -286,8 +322,10 @@ define void @liveConstant() {
; CHECK-NEXT: .short 1
; Loc 0: Indirect FP (r29) - offset
; CHECK-NEXT: .byte 3
-; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 4
; CHECK-NEXT: .short 29
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long -{{[0-9]+}}
define void @clobberLR(i32 %a) {
tail call void asm sideeffect "nop", "~{x0},~{x1},~{x2},~{x3},~{x4},~{x5},~{x6},~{x7},~{x8},~{x9},~{x10},~{x11},~{x12},~{x13},~{x14},~{x15},~{x16},~{x17},~{x18},~{x19},~{x20},~{x21},~{x22},~{x23},~{x24},~{x25},~{x26},~{x27},~{x28},~{x29},~{x31}"() nounwind
diff --git a/test/CodeGen/AArch64/arm64-tls-dynamics.ll b/test/CodeGen/AArch64/arm64-tls-dynamics.ll
index 88700a153437..17979f4036cb 100644
--- a/test/CodeGen/AArch64/arm64-tls-dynamics.ll
+++ b/test/CodeGen/AArch64/arm64-tls-dynamics.ll
@@ -30,13 +30,13 @@ define i32 @test_generaldynamic() {
; CHECK-NOLD: ldr w0, [x[[TP]], x0]
; CHECK-RELOC: R_AARCH64_TLSDESC_ADR_PAGE21
-; CHECK-RELOC: R_AARCH64_TLSDESC_LD64_LO12_NC
-; CHECK-RELOC: R_AARCH64_TLSDESC_ADD_LO12_NC
+; CHECK-RELOC: R_AARCH64_TLSDESC_LD64_LO12
+; CHECK-RELOC: R_AARCH64_TLSDESC_ADD_LO12
; CHECK-RELOC: R_AARCH64_TLSDESC_CALL
; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_ADR_PAGE21
-; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_LD64_LO12_NC
-; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_ADD_LO12_NC
+; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_LD64_LO12
+; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_ADD_LO12
; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_CALL
}
@@ -56,13 +56,13 @@ define i32* @test_generaldynamic_addr() {
; CHECK: add x0, [[TP]], x0
; CHECK-RELOC: R_AARCH64_TLSDESC_ADR_PAGE21
-; CHECK-RELOC: R_AARCH64_TLSDESC_LD64_LO12_NC
-; CHECK-RELOC: R_AARCH64_TLSDESC_ADD_LO12_NC
+; CHECK-RELOC: R_AARCH64_TLSDESC_LD64_LO12
+; CHECK-RELOC: R_AARCH64_TLSDESC_ADD_LO12
; CHECK-RELOC: R_AARCH64_TLSDESC_CALL
; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_ADR_PAGE21
-; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_LD64_LO12_NC
-; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_ADD_LO12_NC
+; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_LD64_LO12
+; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_ADD_LO12
; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_CALL
}
@@ -95,15 +95,15 @@ define i32 @test_localdynamic() {
; CHECK-RELOC: R_AARCH64_TLSDESC_ADR_PAGE21
-; CHECK-RELOC: R_AARCH64_TLSDESC_LD64_LO12_NC
-; CHECK-RELOC: R_AARCH64_TLSDESC_ADD_LO12_NC
+; CHECK-RELOC: R_AARCH64_TLSDESC_LD64_LO12
+; CHECK-RELOC: R_AARCH64_TLSDESC_ADD_LO12
; CHECK-RELOC: R_AARCH64_TLSDESC_CALL
; CHECK-RELOC: R_AARCH64_TLSLD_ADD_DTPREL_HI12
; CHECK-RELOC: R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC
; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_ADR_PAGE21
-; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_LD64_LO12_NC
-; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_ADD_LO12_NC
+; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_LD64_LO12
+; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_ADD_LO12
; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_CALL
}
@@ -131,15 +131,15 @@ define i32* @test_localdynamic_addr() {
ret i32* @local_dynamic_var
; CHECK-RELOC: R_AARCH64_TLSDESC_ADR_PAGE21
-; CHECK-RELOC: R_AARCH64_TLSDESC_LD64_LO12_NC
-; CHECK-RELOC: R_AARCH64_TLSDESC_ADD_LO12_NC
+; CHECK-RELOC: R_AARCH64_TLSDESC_LD64_LO12
+; CHECK-RELOC: R_AARCH64_TLSDESC_ADD_LO12
; CHECK-RELOC: R_AARCH64_TLSDESC_CALL
; CHECK-RELOC: R_AARCH64_TLSLD_ADD_DTPREL_HI12
; CHECK-RELOC: R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC
; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_ADR_PAGE21
-; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_LD64_LO12_NC
-; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_ADD_LO12_NC
+; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_LD64_LO12
+; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_ADD_LO12
; CHECK-NOLD-RELOC: R_AARCH64_TLSDESC_CALL
}
diff --git a/test/CodeGen/AArch64/stackmap-liveness.ll b/test/CodeGen/AArch64/stackmap-liveness.ll
index 4b04276ac226..b66dbfae6c8a 100644
--- a/test/CodeGen/AArch64/stackmap-liveness.ll
+++ b/test/CodeGen/AArch64/stackmap-liveness.ll
@@ -5,7 +5,7 @@ target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
; CHECK-LABEL: .section __LLVM_STACKMAPS,__llvm_stackmaps
; CHECK-NEXT: __LLVM_StackMaps:
; Header
-; CHECK-NEXT: .byte 2
+; CHECK-NEXT: .byte 3
; CHECK-NEXT: .byte 0
; CHECK-NEXT: .short 0
; Num Functions
@@ -25,6 +25,7 @@ define i64 @stackmap_liveness(i1 %c) {
; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; Padding
+; CHECK-NEXT: .p2align 3
; CHECK-NEXT: .short 0
; Num LiveOut Entries: 1
; CHECK-NEXT: .short 2
diff --git a/test/CodeGen/AMDGPU/annotate-kernel-features-hsa.ll b/test/CodeGen/AMDGPU/annotate-kernel-features-hsa.ll
index e2620ce353c6..f7461b925ca1 100644
--- a/test/CodeGen/AMDGPU/annotate-kernel-features-hsa.ll
+++ b/test/CodeGen/AMDGPU/annotate-kernel-features-hsa.ll
@@ -221,10 +221,10 @@ define amdgpu_kernel void @use_flat_to_constant_addrspacecast(i32 addrspace(4)*
ret void
}
-attributes #0 = { nounwind readnone }
+attributes #0 = { nounwind readnone speculatable }
attributes #1 = { nounwind }
-; HSA: attributes #0 = { nounwind readnone }
+; HSA: attributes #0 = { nounwind readnone speculatable }
; HSA: attributes #1 = { nounwind }
; HSA: attributes #2 = { nounwind "amdgpu-work-group-id-y" }
; HSA: attributes #3 = { nounwind "amdgpu-work-group-id-z" }
diff --git a/test/CodeGen/AMDGPU/inline-asm.ll b/test/CodeGen/AMDGPU/inline-asm.ll
index 0d7e07b9a624..636b45db698d 100644
--- a/test/CodeGen/AMDGPU/inline-asm.ll
+++ b/test/CodeGen/AMDGPU/inline-asm.ll
@@ -232,3 +232,17 @@ entry:
call void asm sideeffect "; use $0 $1 ", "{VGPR0}, {VGPR1}"(i1 %val0, i1 %val1)
ret void
}
+
+; CHECK-LABEL: {{^}}muliple_def_phys_vgpr:
+; CHECK: ; def v0
+; CHECK: v_mov_b32_e32 v1, v0
+; CHECK: ; def v0
+; CHECK: v_lshlrev_b32_e32 v{{[0-9]+}}, v0, v1
+define amdgpu_kernel void @muliple_def_phys_vgpr() {
+entry:
+ %def0 = call i32 asm sideeffect "; def $0 ", "={VGPR0}"()
+ %def1 = call i32 asm sideeffect "; def $0 ", "={VGPR0}"()
+ %add = shl i32 %def0, %def1
+ store i32 %add, i32 addrspace(1)* undef
+ ret void
+}
diff --git a/test/CodeGen/AMDGPU/llvm.amdgcn.init.exec.ll b/test/CodeGen/AMDGPU/llvm.amdgcn.init.exec.ll
new file mode 100644
index 000000000000..617f1f19e360
--- /dev/null
+++ b/test/CodeGen/AMDGPU/llvm.amdgcn.init.exec.ll
@@ -0,0 +1,80 @@
+;RUN: llc < %s -march=amdgcn -mcpu=gfx900 -verify-machineinstrs | FileCheck %s --check-prefix=GCN
+
+; GCN-LABEL: {{^}}full_mask:
+; GCN: s_mov_b64 exec, -1
+; GCN: v_add_f32_e32 v0,
+define amdgpu_ps float @full_mask(float %a, float %b) {
+main_body:
+ %s = fadd float %a, %b
+ call void @llvm.amdgcn.init.exec(i64 -1)
+ ret float %s
+}
+
+; GCN-LABEL: {{^}}partial_mask:
+; GCN: s_mov_b64 exec, 0x1e240
+; GCN: v_add_f32_e32 v0,
+define amdgpu_ps float @partial_mask(float %a, float %b) {
+main_body:
+ %s = fadd float %a, %b
+ call void @llvm.amdgcn.init.exec(i64 123456)
+ ret float %s
+}
+
+; GCN-LABEL: {{^}}input_s3off8:
+; GCN: s_bfe_u32 s0, s3, 0x70008
+; GCN: s_bfm_b64 exec, s0, 0
+; GCN: s_cmp_eq_u32 s0, 64
+; GCN: s_cmov_b64 exec, -1
+; GCN: v_add_f32_e32 v0,
+define amdgpu_ps float @input_s3off8(i32 inreg, i32 inreg, i32 inreg, i32 inreg %count, float %a, float %b) {
+main_body:
+ %s = fadd float %a, %b
+ call void @llvm.amdgcn.init.exec.from.input(i32 %count, i32 8)
+ ret float %s
+}
+
+; GCN-LABEL: {{^}}input_s0off19:
+; GCN: s_bfe_u32 s0, s0, 0x70013
+; GCN: s_bfm_b64 exec, s0, 0
+; GCN: s_cmp_eq_u32 s0, 64
+; GCN: s_cmov_b64 exec, -1
+; GCN: v_add_f32_e32 v0,
+define amdgpu_ps float @input_s0off19(i32 inreg %count, float %a, float %b) {
+main_body:
+ %s = fadd float %a, %b
+ call void @llvm.amdgcn.init.exec.from.input(i32 %count, i32 19)
+ ret float %s
+}
+
+; GCN-LABEL: {{^}}reuse_input:
+; GCN: s_bfe_u32 s1, s0, 0x70013
+; GCN: s_bfm_b64 exec, s1, 0
+; GCN: s_cmp_eq_u32 s1, 64
+; GCN: s_cmov_b64 exec, -1
+; GCN: v_add_i32_e32 v0, vcc, s0, v0
+define amdgpu_ps float @reuse_input(i32 inreg %count, i32 %a) {
+main_body:
+ call void @llvm.amdgcn.init.exec.from.input(i32 %count, i32 19)
+ %s = add i32 %a, %count
+ %f = sitofp i32 %s to float
+ ret float %f
+}
+
+; GCN-LABEL: {{^}}reuse_input2:
+; GCN: s_bfe_u32 s1, s0, 0x70013
+; GCN: s_bfm_b64 exec, s1, 0
+; GCN: s_cmp_eq_u32 s1, 64
+; GCN: s_cmov_b64 exec, -1
+; GCN: v_add_i32_e32 v0, vcc, s0, v0
+define amdgpu_ps float @reuse_input2(i32 inreg %count, i32 %a) {
+main_body:
+ %s = add i32 %a, %count
+ %f = sitofp i32 %s to float
+ call void @llvm.amdgcn.init.exec.from.input(i32 %count, i32 19)
+ ret float %f
+}
+
+declare void @llvm.amdgcn.init.exec(i64) #1
+declare void @llvm.amdgcn.init.exec.from.input(i32, i32) #1
+
+attributes #1 = { convergent }
diff --git a/test/CodeGen/AMDGPU/zext-lid.ll b/test/CodeGen/AMDGPU/zext-lid.ll
index 8eeff53ff99f..066f29277270 100644
--- a/test/CodeGen/AMDGPU/zext-lid.ll
+++ b/test/CodeGen/AMDGPU/zext-lid.ll
@@ -4,19 +4,19 @@
; CHECK-NOT: and_b32
; OPT-LABEL: @zext_grp_size_128
-; OPT: tail call i32 @llvm.amdgcn.workitem.id.x() #2, !range !0
-; OPT: tail call i32 @llvm.amdgcn.workitem.id.y() #2, !range !0
-; OPT: tail call i32 @llvm.amdgcn.workitem.id.z() #2, !range !0
+; OPT: tail call i32 @llvm.amdgcn.workitem.id.x(), !range !0
+; OPT: tail call i32 @llvm.amdgcn.workitem.id.y(), !range !0
+; OPT: tail call i32 @llvm.amdgcn.workitem.id.z(), !range !0
define amdgpu_kernel void @zext_grp_size_128(i32 addrspace(1)* nocapture %arg) #0 {
bb:
- %tmp = tail call i32 @llvm.amdgcn.workitem.id.x() #2
+ %tmp = tail call i32 @llvm.amdgcn.workitem.id.x()
%tmp1 = and i32 %tmp, 127
store i32 %tmp1, i32 addrspace(1)* %arg, align 4
- %tmp2 = tail call i32 @llvm.amdgcn.workitem.id.y() #2
+ %tmp2 = tail call i32 @llvm.amdgcn.workitem.id.y()
%tmp3 = and i32 %tmp2, 127
%tmp4 = getelementptr inbounds i32, i32 addrspace(1)* %arg, i64 1
store i32 %tmp3, i32 addrspace(1)* %tmp4, align 4
- %tmp5 = tail call i32 @llvm.amdgcn.workitem.id.z() #2
+ %tmp5 = tail call i32 @llvm.amdgcn.workitem.id.z()
%tmp6 = and i32 %tmp5, 127
%tmp7 = getelementptr inbounds i32, i32 addrspace(1)* %arg, i64 2
store i32 %tmp6, i32 addrspace(1)* %tmp7, align 4
@@ -24,19 +24,19 @@ bb:
}
; OPT-LABEL: @zext_grp_size_32x4x1
-; OPT: tail call i32 @llvm.amdgcn.workitem.id.x() #2, !range !2
-; OPT: tail call i32 @llvm.amdgcn.workitem.id.y() #2, !range !3
-; OPT: tail call i32 @llvm.amdgcn.workitem.id.z() #2, !range !4
+; OPT: tail call i32 @llvm.amdgcn.workitem.id.x(), !range !2
+; OPT: tail call i32 @llvm.amdgcn.workitem.id.y(), !range !3
+; OPT: tail call i32 @llvm.amdgcn.workitem.id.z(), !range !4
define amdgpu_kernel void @zext_grp_size_32x4x1(i32 addrspace(1)* nocapture %arg) #0 !reqd_work_group_size !0 {
bb:
- %tmp = tail call i32 @llvm.amdgcn.workitem.id.x() #2
+ %tmp = tail call i32 @llvm.amdgcn.workitem.id.x()
%tmp1 = and i32 %tmp, 31
store i32 %tmp1, i32 addrspace(1)* %arg, align 4
- %tmp2 = tail call i32 @llvm.amdgcn.workitem.id.y() #2
+ %tmp2 = tail call i32 @llvm.amdgcn.workitem.id.y()
%tmp3 = and i32 %tmp2, 3
%tmp4 = getelementptr inbounds i32, i32 addrspace(1)* %arg, i64 1
store i32 %tmp3, i32 addrspace(1)* %tmp4, align 4
- %tmp5 = tail call i32 @llvm.amdgcn.workitem.id.z() #2
+ %tmp5 = tail call i32 @llvm.amdgcn.workitem.id.z()
%tmp6 = and i32 %tmp5, 1
%tmp7 = getelementptr inbounds i32, i32 addrspace(1)* %arg, i64 2
store i32 %tmp6, i32 addrspace(1)* %tmp7, align 4
@@ -44,19 +44,19 @@ bb:
}
; OPT-LABEL: @zext_grp_size_512
-; OPT: tail call i32 @llvm.amdgcn.workitem.id.x() #2, !range !5
-; OPT: tail call i32 @llvm.amdgcn.workitem.id.y() #2, !range !5
-; OPT: tail call i32 @llvm.amdgcn.workitem.id.z() #2, !range !5
+; OPT: tail call i32 @llvm.amdgcn.workitem.id.x(), !range !5
+; OPT: tail call i32 @llvm.amdgcn.workitem.id.y(), !range !5
+; OPT: tail call i32 @llvm.amdgcn.workitem.id.z(), !range !5
define amdgpu_kernel void @zext_grp_size_512(i32 addrspace(1)* nocapture %arg) #1 {
bb:
- %tmp = tail call i32 @llvm.amdgcn.workitem.id.x() #2
+ %tmp = tail call i32 @llvm.amdgcn.workitem.id.x()
%tmp1 = and i32 %tmp, 65535
store i32 %tmp1, i32 addrspace(1)* %arg, align 4
- %tmp2 = tail call i32 @llvm.amdgcn.workitem.id.y() #2
+ %tmp2 = tail call i32 @llvm.amdgcn.workitem.id.y()
%tmp3 = and i32 %tmp2, 65535
%tmp4 = getelementptr inbounds i32, i32 addrspace(1)* %arg, i64 1
store i32 %tmp3, i32 addrspace(1)* %tmp4, align 4
- %tmp5 = tail call i32 @llvm.amdgcn.workitem.id.z() #2
+ %tmp5 = tail call i32 @llvm.amdgcn.workitem.id.z()
%tmp6 = and i32 %tmp5, 65535
%tmp7 = getelementptr inbounds i32, i32 addrspace(1)* %arg, i64 2
store i32 %tmp6, i32 addrspace(1)* %tmp7, align 4
@@ -71,7 +71,8 @@ declare i32 @llvm.amdgcn.workitem.id.z() #2
attributes #0 = { nounwind "amdgpu-flat-work-group-size"="64,128" }
attributes #1 = { nounwind "amdgpu-flat-work-group-size"="512,512" }
-attributes #2 = { nounwind readnone }
+attributes #2 = { nounwind readnone speculatable }
+attributes #3 = { nounwind readnone }
!0 = !{i32 32, i32 4, i32 1}
diff --git a/test/CodeGen/ARM/GlobalISel/arm-irtranslator.ll b/test/CodeGen/ARM/GlobalISel/arm-irtranslator.ll
index cf77ce352074..44fe7410b42c 100644
--- a/test/CodeGen/ARM/GlobalISel/arm-irtranslator.ll
+++ b/test/CodeGen/ARM/GlobalISel/arm-irtranslator.ll
@@ -128,10 +128,10 @@ define i32 @test_stack_args(i32 %p0, i32 %p1, i32 %p2, i32 %p3, i32 %p4, i32 %p5
; CHECK-DAG: id: [[P4:[0-9]]]{{.*}}offset: 0{{.*}}size: 4
; CHECK-DAG: id: [[P5:[0-9]]]{{.*}}offset: 4{{.*}}size: 4
; CHECK: liveins: %r0, %r1, %r2, %r3
-; CHECK: [[VREGP2:%[0-9]+]]{{.*}} = COPY %r2
-; CHECK: [[FIP5:%[0-9]+]]{{.*}} = G_FRAME_INDEX %fixed-stack.[[P5]]
-; CHECK: [[VREGP5:%[0-9]+]]{{.*}} = G_LOAD [[FIP5]]
-; CHECK: [[SUM:%[0-9]+]]{{.*}} = G_ADD [[VREGP2]], [[VREGP5]]
+; CHECK: [[VREGP2:%[0-9]+]](s32) = COPY %r2
+; CHECK: [[FIP5:%[0-9]+]](p0) = G_FRAME_INDEX %fixed-stack.[[P5]]
+; CHECK: [[VREGP5:%[0-9]+]](s32) = G_LOAD [[FIP5]]{{.*}}load 4
+; CHECK: [[SUM:%[0-9]+]](s32) = G_ADD [[VREGP2]], [[VREGP5]]
; CHECK: %r0 = COPY [[SUM]]
; CHECK: BX_RET 14, _, implicit %r0
entry:
@@ -146,10 +146,11 @@ define i16 @test_stack_args_signext(i32 %p0, i16 %p1, i8 %p2, i1 %p3,
; CHECK-DAG: id: [[P4:[0-9]]]{{.*}}offset: 0{{.*}}size: 1
; CHECK-DAG: id: [[P5:[0-9]]]{{.*}}offset: 4{{.*}}size: 2
; CHECK: liveins: %r0, %r1, %r2, %r3
-; CHECK: [[VREGP1:%[0-9]+]]{{.*}} = COPY %r1
-; CHECK: [[FIP5:%[0-9]+]]{{.*}} = G_FRAME_INDEX %fixed-stack.[[P5]]
-; CHECK: [[VREGP5:%[0-9]+]]{{.*}} = G_LOAD [[FIP5]](p0)
-; CHECK: [[SUM:%[0-9]+]]{{.*}} = G_ADD [[VREGP1]], [[VREGP5]]
+; CHECK: [[VREGP1:%[0-9]+]](s16) = COPY %r1
+; CHECK: [[FIP5:%[0-9]+]](p0) = G_FRAME_INDEX %fixed-stack.[[P5]]
+; CHECK: [[VREGP5EXT:%[0-9]+]](s32) = G_LOAD [[FIP5]](p0){{.*}}load 4
+; CHECK: [[VREGP5:%[0-9]+]](s16) = G_TRUNC [[VREGP5EXT]]
+; CHECK: [[SUM:%[0-9]+]](s16) = G_ADD [[VREGP1]], [[VREGP5]]
; CHECK: %r0 = COPY [[SUM]]
; CHECK: BX_RET 14, _, implicit %r0
entry:
@@ -164,10 +165,29 @@ define i8 @test_stack_args_zeroext(i32 %p0, i16 %p1, i8 %p2, i1 %p3,
; CHECK-DAG: id: [[P4:[0-9]]]{{.*}}offset: 0{{.*}}size: 1
; CHECK-DAG: id: [[P5:[0-9]]]{{.*}}offset: 4{{.*}}size: 2
; CHECK: liveins: %r0, %r1, %r2, %r3
-; CHECK: [[VREGP2:%[0-9]+]]{{.*}} = COPY %r2
-; CHECK: [[FIP4:%[0-9]+]]{{.*}} = G_FRAME_INDEX %fixed-stack.[[P4]]
-; CHECK: [[VREGP4:%[0-9]+]]{{.*}} = G_LOAD [[FIP4]](p0)
-; CHECK: [[SUM:%[0-9]+]]{{.*}} = G_ADD [[VREGP2]], [[VREGP4]]
+; CHECK: [[VREGP2:%[0-9]+]](s8) = COPY %r2
+; CHECK: [[FIP4:%[0-9]+]](p0) = G_FRAME_INDEX %fixed-stack.[[P4]]
+; CHECK: [[VREGP4EXT:%[0-9]+]](s32) = G_LOAD [[FIP4]](p0){{.*}}load 4
+; CHECK: [[VREGP4:%[0-9]+]](s8) = G_TRUNC [[VREGP4EXT]]
+; CHECK: [[SUM:%[0-9]+]](s8) = G_ADD [[VREGP2]], [[VREGP4]]
+; CHECK: %r0 = COPY [[SUM]]
+; CHECK: BX_RET 14, _, implicit %r0
+entry:
+ %sum = add i8 %p2, %p4
+ ret i8 %sum
+}
+
+define i8 @test_stack_args_noext(i32 %p0, i16 %p1, i8 %p2, i1 %p3,
+ i8 %p4, i16 %p5) {
+; CHECK-LABEL: name: test_stack_args_noext
+; CHECK: fixedStack:
+; CHECK-DAG: id: [[P4:[0-9]]]{{.*}}offset: 0{{.*}}size: 1
+; CHECK-DAG: id: [[P5:[0-9]]]{{.*}}offset: 4{{.*}}size: 2
+; CHECK: liveins: %r0, %r1, %r2, %r3
+; CHECK: [[VREGP2:%[0-9]+]](s8) = COPY %r2
+; CHECK: [[FIP4:%[0-9]+]](p0) = G_FRAME_INDEX %fixed-stack.[[P4]]
+; CHECK: [[VREGP4:%[0-9]+]](s8) = G_LOAD [[FIP4]](p0){{.*}}load 1
+; CHECK: [[SUM:%[0-9]+]](s8) = G_ADD [[VREGP2]], [[VREGP4]]
; CHECK: %r0 = COPY [[SUM]]
; CHECK: BX_RET 14, _, implicit %r0
entry:
@@ -175,11 +195,28 @@ entry:
ret i8 %sum
}
+define zeroext i16 @test_stack_args_extend_the_extended(i32 %p0, i16 %p1, i8 %p2, i1 %p3,
+ i8 signext %p4, i16 signext %p5) {
+; CHECK-LABEL: name: test_stack_args_extend_the_extended
+; CHECK: fixedStack:
+; CHECK-DAG: id: [[P4:[0-9]]]{{.*}}offset: 0{{.*}}size: 1
+; CHECK-DAG: id: [[P5:[0-9]]]{{.*}}offset: 4{{.*}}size: 2
+; CHECK: liveins: %r0, %r1, %r2, %r3
+; CHECK: [[FIP5:%[0-9]+]](p0) = G_FRAME_INDEX %fixed-stack.[[P5]]
+; CHECK: [[VREGP5SEXT:%[0-9]+]](s32) = G_LOAD [[FIP5]](p0){{.*}}load 4
+; CHECK: [[VREGP5:%[0-9]+]](s16) = G_TRUNC [[VREGP5SEXT]]
+; CHECK: [[VREGP5ZEXT:%[0-9]+]](s32) = G_ZEXT [[VREGP5]]
+; CHECK: %r0 = COPY [[VREGP5ZEXT]]
+; CHECK: BX_RET 14, _, implicit %r0
+entry:
+ ret i16 %p5
+}
+
define i16 @test_ptr_arg(i16* %p) {
; CHECK-LABEL: name: test_ptr_arg
; CHECK: liveins: %r0
; CHECK: [[VREGP:%[0-9]+]](p0) = COPY %r0
-; CHECK: [[VREGV:%[0-9]+]](s16) = G_LOAD [[VREGP]](p0)
+; CHECK: [[VREGV:%[0-9]+]](s16) = G_LOAD [[VREGP]](p0){{.*}}load 2
entry:
%v = load i16, i16* %p
ret i16 %v
@@ -190,7 +227,7 @@ define i32* @test_ptr_ret(i32** %p) {
; CHECK-LABEL: name: test_ptr_ret
; CHECK: liveins: %r0
; CHECK: [[VREGP:%[0-9]+]](p0) = COPY %r0
-; CHECK: [[VREGV:%[0-9]+]](p0) = G_LOAD [[VREGP]](p0)
+; CHECK: [[VREGV:%[0-9]+]](p0) = G_LOAD [[VREGP]](p0){{.*}}load 4
; CHECK: %r0 = COPY [[VREGV]]
; CHECK: BX_RET 14, _, implicit %r0
entry:
@@ -203,9 +240,9 @@ define i32 @test_ptr_arg_on_stack(i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32* %p) {
; CHECK: fixedStack:
; CHECK: id: [[P:[0-9]+]]{{.*}}offset: 0{{.*}}size: 4
; CHECK: liveins: %r0, %r1, %r2, %r3
-; CHECK: [[FIP:%[0-9]+]]{{.*}} = G_FRAME_INDEX %fixed-stack.[[P]]
-; CHECK: [[VREGP:%[0-9]+]](p0) = G_LOAD [[FIP]](p0)
-; CHECK: [[VREGV:%[0-9]+]](s32) = G_LOAD [[VREGP]](p0)
+; CHECK: [[FIP:%[0-9]+]](p0) = G_FRAME_INDEX %fixed-stack.[[P]]
+; CHECK: [[VREGP:%[0-9]+]](p0) = G_LOAD [[FIP]](p0){{.*}}load 4
+; CHECK: [[VREGV:%[0-9]+]](s32) = G_LOAD [[VREGP]](p0){{.*}}load 4
; CHECK: %r0 = COPY [[VREGV]]
; CHECK: BX_RET 14, _, implicit %r0
entry:
@@ -222,7 +259,7 @@ define arm_aapcscc float @test_float_aapcscc(float %p0, float %p1, float %p2,
; CHECK: liveins: %r0, %r1, %r2, %r3
; CHECK: [[VREGP1:%[0-9]+]](s32) = COPY %r1
; CHECK: [[FIP5:%[0-9]+]](p0) = G_FRAME_INDEX %fixed-stack.[[P5]]
-; CHECK: [[VREGP5:%[0-9]+]](s32) = G_LOAD [[FIP5]](p0)
+; CHECK: [[VREGP5:%[0-9]+]](s32) = G_LOAD [[FIP5]](p0){{.*}}load 4
; CHECK: [[VREGV:%[0-9]+]](s32) = G_FADD [[VREGP1]], [[VREGP5]]
; CHECK: %r0 = COPY [[VREGV]]
; CHECK: BX_RET 14, _, implicit %r0
@@ -251,7 +288,7 @@ define arm_aapcs_vfpcc float @test_float_vfpcc(float %p0, float %p1, float %p2,
; CHECK: liveins: %s0, %s1, %s2, %s3, %s4, %s5, %s6, %s7, %s8, %s9, %s10, %s11, %s12, %s13, %s14, %s15
; CHECK: [[VREGP1:%[0-9]+]](s32) = COPY %s1
; CHECK: [[FIQ1:%[0-9]+]](p0) = G_FRAME_INDEX %fixed-stack.[[Q1]]
-; CHECK: [[VREGQ1:%[0-9]+]](s32) = G_LOAD [[FIQ1]](p0)
+; CHECK: [[VREGQ1:%[0-9]+]](s32) = G_LOAD [[FIQ1]](p0){{.*}}load 4
; CHECK: [[VREGV:%[0-9]+]](s32) = G_FADD [[VREGP1]], [[VREGQ1]]
; CHECK: %s0 = COPY [[VREGV]]
; CHECK: BX_RET 14, _, implicit %s0
@@ -272,7 +309,7 @@ define arm_aapcs_vfpcc double @test_double_vfpcc(double %p0, double %p1, double
; CHECK: liveins: %d0, %d1, %d2, %d3, %d4, %d5, %d6, %d7
; CHECK: [[VREGP1:%[0-9]+]](s64) = COPY %d1
; CHECK: [[FIQ1:%[0-9]+]](p0) = G_FRAME_INDEX %fixed-stack.[[Q1]]
-; CHECK: [[VREGQ1:%[0-9]+]](s64) = G_LOAD [[FIQ1]](p0)
+; CHECK: [[VREGQ1:%[0-9]+]](s64) = G_LOAD [[FIQ1]](p0){{.*}}load 8
; CHECK: [[VREGV:%[0-9]+]](s64) = G_FADD [[VREGP1]], [[VREGQ1]]
; CHECK: %d0 = COPY [[VREGV]]
; CHECK: BX_RET 14, _, implicit %d0
@@ -295,7 +332,7 @@ define arm_aapcscc double @test_double_aapcscc(double %p0, double %p1, double %p
; LITTLE: [[VREGP1:%[0-9]+]](s64) = G_SEQUENCE [[VREGP1LO]](s32), 0, [[VREGP1HI]](s32), 32
; BIG: [[VREGP1:%[0-9]+]](s64) = G_SEQUENCE [[VREGP1HI]](s32), 0, [[VREGP1LO]](s32), 32
; CHECK: [[FIP5:%[0-9]+]](p0) = G_FRAME_INDEX %fixed-stack.[[P5]]
-; CHECK: [[VREGP5:%[0-9]+]](s64) = G_LOAD [[FIP5]](p0)
+; CHECK: [[VREGP5:%[0-9]+]](s64) = G_LOAD [[FIP5]](p0){{.*}}load 8
; CHECK: [[VREGV:%[0-9]+]](s64) = G_FADD [[VREGP1]], [[VREGP5]]
; LITTLE: [[VREGVLO:%[0-9]+]](s32) = G_EXTRACT [[VREGV]](s64), 0
; LITTLE: [[VREGVHI:%[0-9]+]](s32) = G_EXTRACT [[VREGV]](s64), 32
@@ -322,7 +359,7 @@ define arm_aapcs_vfpcc double @test_double_gap_vfpcc(double %p0, float %filler,
; CHECK: liveins: %d0, %d2, %d3, %d4, %d5, %d6, %d7, %s2
; CHECK: [[VREGP1:%[0-9]+]](s64) = COPY %d2
; CHECK: [[FIQ1:%[0-9]+]](p0) = G_FRAME_INDEX %fixed-stack.[[Q1]]
-; CHECK: [[VREGQ1:%[0-9]+]](s64) = G_LOAD [[FIQ1]](p0)
+; CHECK: [[VREGQ1:%[0-9]+]](s64) = G_LOAD [[FIQ1]](p0){{.*}}load 8
; CHECK: [[VREGV:%[0-9]+]](s64) = G_FADD [[VREGP1]], [[VREGQ1]]
; CHECK: %d0 = COPY [[VREGV]]
; CHECK: BX_RET 14, _, implicit %d0
@@ -342,7 +379,7 @@ define arm_aapcscc double @test_double_gap_aapcscc(float %filler, double %p0,
; LITTLE: [[VREGP0:%[0-9]+]](s64) = G_SEQUENCE [[VREGP0LO]](s32), 0, [[VREGP0HI]](s32), 32
; BIG: [[VREGP0:%[0-9]+]](s64) = G_SEQUENCE [[VREGP0HI]](s32), 0, [[VREGP0LO]](s32), 32
; CHECK: [[FIP1:%[0-9]+]](p0) = G_FRAME_INDEX %fixed-stack.[[P1]]
-; CHECK: [[VREGP1:%[0-9]+]](s64) = G_LOAD [[FIP1]](p0)
+; CHECK: [[VREGP1:%[0-9]+]](s64) = G_LOAD [[FIP1]](p0){{.*}}load 8
; CHECK: [[VREGV:%[0-9]+]](s64) = G_FADD [[VREGP0]], [[VREGP1]]
; LITTLE: [[VREGVLO:%[0-9]+]](s32) = G_EXTRACT [[VREGV]](s64), 0
; LITTLE: [[VREGVHI:%[0-9]+]](s32) = G_EXTRACT [[VREGV]](s64), 32
@@ -367,7 +404,7 @@ define arm_aapcscc double @test_double_gap2_aapcscc(double %p0, float %filler,
; LITTLE: [[VREGP0:%[0-9]+]](s64) = G_SEQUENCE [[VREGP0LO]](s32), 0, [[VREGP0HI]](s32), 32
; BIG: [[VREGP0:%[0-9]+]](s64) = G_SEQUENCE [[VREGP0HI]](s32), 0, [[VREGP0LO]](s32), 32
; CHECK: [[FIP1:%[0-9]+]](p0) = G_FRAME_INDEX %fixed-stack.[[P1]]
-; CHECK: [[VREGP1:%[0-9]+]](s64) = G_LOAD [[FIP1]](p0)
+; CHECK: [[VREGP1:%[0-9]+]](s64) = G_LOAD [[FIP1]](p0){{.*}}load 8
; CHECK: [[VREGV:%[0-9]+]](s64) = G_FADD [[VREGP0]], [[VREGP1]]
; LITTLE: [[VREGVLO:%[0-9]+]](s32) = G_EXTRACT [[VREGV]](s64), 0
; LITTLE: [[VREGVHI:%[0-9]+]](s32) = G_EXTRACT [[VREGV]](s64), 32
diff --git a/test/CodeGen/ARM/GlobalISel/arm-isel.ll b/test/CodeGen/ARM/GlobalISel/arm-isel.ll
index da02bfe68519..57ccff90c0bb 100644
--- a/test/CodeGen/ARM/GlobalISel/arm-isel.ll
+++ b/test/CodeGen/ARM/GlobalISel/arm-isel.ll
@@ -197,6 +197,17 @@ entry:
ret i8 %sum
}
+define i8 @test_stack_args_noext(i32 %p0, i16 %p1, i8 %p2, i1 %p3, i8 %p4) {
+; CHECK-LABEL: test_stack_args_noext:
+; CHECK: mov [[P4ADDR:r[0-9]+]], sp
+; CHECK: ldrb [[P4:r[0-9]+]], {{.*}}[[P4ADDR]]
+; CHECK: add r0, r2, [[P4]]
+; CHECK: bx lr
+entry:
+ %sum = add i8 %p2, %p4
+ ret i8 %sum
+}
+
define i32 @test_ptr_arg_in_reg(i32* %p) {
; CHECK-LABEL: test_ptr_arg_in_reg:
; CHECK: ldr r0, [r0]
diff --git a/test/CodeGen/ARM/bool-ext-inc.ll b/test/CodeGen/ARM/bool-ext-inc.ll
index b91b9b258991..5f2ba8b109a7 100644
--- a/test/CodeGen/ARM/bool-ext-inc.ll
+++ b/test/CodeGen/ARM/bool-ext-inc.ll
@@ -4,7 +4,7 @@
define i32 @sext_inc(i1 zeroext %x) {
; CHECK-LABEL: sext_inc:
; CHECK: @ BB#0:
-; CHECK-NEXT: rsb r0, r0, #1
+; CHECK-NEXT: eor r0, r0, #1
; CHECK-NEXT: mov pc, lr
%ext = sext i1 %x to i32
%add = add i32 %ext, 1
@@ -14,14 +14,12 @@ define i32 @sext_inc(i1 zeroext %x) {
define <4 x i32> @sext_inc_vec(<4 x i1> %x) {
; CHECK-LABEL: sext_inc_vec:
; CHECK: @ BB#0:
-; CHECK-NEXT: vmov d16, r0, r1
-; CHECK-NEXT: vmov.i32 q9, #0x1f
-; CHECK-NEXT: vmov.i32 q10, #0x1
+; CHECK-NEXT: vmov.i16 d16, #0x1
+; CHECK-NEXT: vmov d17, r0, r1
+; CHECK-NEXT: vmov.i32 q9, #0x1
+; CHECK-NEXT: veor d16, d17, d16
; CHECK-NEXT: vmovl.u16 q8, d16
-; CHECK-NEXT: vneg.s32 q9, q9
-; CHECK-NEXT: vshl.i32 q8, q8, #31
-; CHECK-NEXT: vshl.s32 q8, q8, q9
-; CHECK-NEXT: vadd.i32 q8, q8, q10
+; CHECK-NEXT: vand q8, q8, q9
; CHECK-NEXT: vmov r0, r1, d16
; CHECK-NEXT: vmov r2, r3, d17
; CHECK-NEXT: mov pc, lr
@@ -38,8 +36,8 @@ define <4 x i32> @cmpgt_sext_inc_vec(<4 x i32> %x, <4 x i32> %y) {
; CHECK-NEXT: vmov.i32 q10, #0x1
; CHECK-NEXT: vld1.64 {d16, d17}, [r12]
; CHECK-NEXT: vmov d18, r0, r1
-; CHECK-NEXT: vcgt.s32 q8, q9, q8
-; CHECK-NEXT: vadd.i32 q8, q8, q10
+; CHECK-NEXT: vcge.s32 q8, q8, q9
+; CHECK-NEXT: vand q8, q8, q10
; CHECK-NEXT: vmov r0, r1, d16
; CHECK-NEXT: vmov r2, r3, d17
; CHECK-NEXT: mov pc, lr
@@ -54,12 +52,11 @@ define <4 x i32> @cmpne_sext_inc_vec(<4 x i32> %x, <4 x i32> %y) {
; CHECK: @ BB#0:
; CHECK-NEXT: mov r12, sp
; CHECK-NEXT: vmov d19, r2, r3
+; CHECK-NEXT: vmov.i32 q10, #0x1
; CHECK-NEXT: vld1.64 {d16, d17}, [r12]
; CHECK-NEXT: vmov d18, r0, r1
; CHECK-NEXT: vceq.i32 q8, q9, q8
-; CHECK-NEXT: vmov.i32 q9, #0x1
-; CHECK-NEXT: vmvn q8, q8
-; CHECK-NEXT: vadd.i32 q8, q8, q9
+; CHECK-NEXT: vand q8, q8, q10
; CHECK-NEXT: vmov r0, r1, d16
; CHECK-NEXT: vmov r2, r3, d17
; CHECK-NEXT: mov pc, lr
diff --git a/test/CodeGen/AVR/calling-conv/c/stack.ll b/test/CodeGen/AVR/calling-conv/c/stack.ll
index 00ff7d1acd80..52b6427476ab 100644
--- a/test/CodeGen/AVR/calling-conv/c/stack.ll
+++ b/test/CodeGen/AVR/calling-conv/c/stack.ll
@@ -11,15 +11,15 @@ define void @ret_void_args_i64_i64_i32(i64 %a, i64 %b, i32 %c) {
; CHECK-NEXT: in r29, 62
; Load the top two bytes from the 32-bit int.
- ; CHECK-NEXT: ldd r24, Y+7
- ; CHECK-NEXT: ldd r25, Y+8
+ ; CHECK-NEXT: ldd r24, Y+5
+ ; CHECK-NEXT: ldd r25, Y+6
; Store the top two bytes of the 32-bit int to memory.
; CHECK-NEXT: sts 7, r25
; CHECK-NEXT: sts 6, r24
; Load the bottom two bytes from the 32-bit int.
- ; CHECK-NEXT: ldd r24, Y+5
- ; CHECK-NEXT: ldd r25, Y+6
+ ; CHECK-NEXT: ldd r24, Y+3
+ ; CHECK-NEXT: ldd r25, Y+4
; Store the bottom two bytes of the 32-bit int to memory.
; CHECK-NEXT: sts 5, r25
; CHECK-NEXT: sts 4, r24
diff --git a/test/CodeGen/AVR/return.ll b/test/CodeGen/AVR/return.ll
index d57f435fd11c..1f80576af288 100644
--- a/test/CodeGen/AVR/return.ll
+++ b/test/CodeGen/AVR/return.ll
@@ -96,14 +96,14 @@ define i64 @return64_arg2(i64 %x, i64 %y, i64 %z) {
; CHECK-LABEL: return64_arg2:
; CHECK: push r28
; CHECK: push r29
-; CHECK: ldd r18, Y+5
-; CHECK: ldd r19, Y+6
-; CHECK: ldd r20, Y+7
-; CHECK: ldd r21, Y+8
-; CHECK: ldd r22, Y+9
-; CHECK: ldd r23, Y+10
-; CHECK: ldd r24, Y+11
-; CHECK: ldd r25, Y+12
+; CHECK: ldd r18, Y+3
+; CHECK: ldd r19, Y+4
+; CHECK: ldd r20, Y+5
+; CHECK: ldd r21, Y+6
+; CHECK: ldd r22, Y+7
+; CHECK: ldd r23, Y+8
+; CHECK: ldd r24, Y+9
+; CHECK: ldd r25, Y+10
; CHECK: pop r29
; CHECK: pop r28
ret i64 %z
@@ -113,10 +113,10 @@ define i32 @return64_trunc(i32 %a, i32 %b, i32 %c, i64 %d) {
; CHECK-LABEL: return64_trunc:
; CHECK: push r28
; CHECK: push r29
-; CHECK: ldd r22, Y+5
-; CHECK: ldd r23, Y+6
-; CHECK: ldd r24, Y+7
-; CHECK: ldd r25, Y+8
+; CHECK: ldd r22, Y+3
+; CHECK: ldd r23, Y+4
+; CHECK: ldd r24, Y+5
+; CHECK: ldd r25, Y+6
; CHECK: pop r29
; CHECK: pop r28
%result = trunc i64 %d to i32
diff --git a/test/CodeGen/AVR/rot.ll b/test/CodeGen/AVR/rot.ll
new file mode 100644
index 000000000000..e43daf3e6aa8
--- /dev/null
+++ b/test/CodeGen/AVR/rot.ll
@@ -0,0 +1,55 @@
+; RUN: llc < %s -march=avr | FileCheck %s
+
+; Bit rotation tests.
+
+; CHECK-LABEL: rol8:
+define i8 @rol8(i8 %val, i8 %amt) {
+ ; CHECK: andi r22, 7
+
+ ; CHECK-NEXT: cp r22, r0
+ ; CHECK-NEXT: breq LBB0_2
+
+; CHECK-NEXT: LBB0_1:
+ ; CHECK-NEXT: rol r24
+ ; CHECK-NEXT: subi r22, 1
+ ; CHECK-NEXT: brne LBB0_1
+
+; CHECK-NEXT:LBB0_2:
+ ; CHECK-NEXT: ret
+ %mod = urem i8 %amt, 8
+
+ %inv = sub i8 8, %mod
+ %parta = shl i8 %val, %mod
+ %partb = lshr i8 %val, %inv
+
+ %rotl = or i8 %parta, %partb
+
+ ret i8 %rotl
+}
+
+
+; CHECK-LABEL: ror8:
+define i8 @ror8(i8 %val, i8 %amt) {
+ ; CHECK: andi r22, 7
+
+ ; CHECK-NEXT: cp r22, r0
+ ; CHECK-NEXT: breq LBB1_2
+
+; CHECK-NEXT: LBB1_1:
+ ; CHECK-NEXT: ror r24
+ ; CHECK-NEXT: subi r22, 1
+ ; CHECK-NEXT: brne LBB1_1
+
+; CHECK-NEXT:LBB1_2:
+ ; CHECK-NEXT: ret
+ %mod = urem i8 %amt, 8
+
+ %inv = sub i8 8, %mod
+ %parta = lshr i8 %val, %mod
+ %partb = shl i8 %val, %inv
+
+ %rotr = or i8 %parta, %partb
+
+ ret i8 %rotr
+}
+
diff --git a/test/CodeGen/AVR/varargs.ll b/test/CodeGen/AVR/varargs.ll
index 4959f2d880c8..6f727cda582d 100644
--- a/test/CodeGen/AVR/varargs.ll
+++ b/test/CodeGen/AVR/varargs.ll
@@ -7,12 +7,12 @@ declare void @llvm.va_end(i8*)
define i16 @varargs1(i8* nocapture %x, ...) {
; CHECK-LABEL: varargs1:
; CHECK: movw r20, r28
-; CHECK: subi r20, 215
+; CHECK: subi r20, 217
; CHECK: sbci r21, 255
; CHECK: movw r24, r28
; CHECK: adiw r24, 3
-; CHECK: ldd r22, Y+39
-; CHECK: ldd r23, Y+40
+; CHECK: ldd r22, Y+37
+; CHECK: ldd r23, Y+38
; CHECK: call
%buffer = alloca [32 x i8]
%ap = alloca i8*
diff --git a/test/CodeGen/BPF/mem_offset_be.ll b/test/CodeGen/BPF/mem_offset_be.ll
new file mode 100644
index 000000000000..e5e352783d70
--- /dev/null
+++ b/test/CodeGen/BPF/mem_offset_be.ll
@@ -0,0 +1,18 @@
+; RUN: llc -march=bpfeb -show-mc-encoding < %s | FileCheck %s
+
+; Function Attrs: nounwind
+define i32 @bpf_prog1(i8* nocapture readnone) local_unnamed_addr #0 {
+; CHECK: r1 = 590618314553ll # encoding: [0x18,0x10,0x00,0x00,0x83,0x98,0x47,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89]
+; CHECK: r1 += -1879113726 # encoding: [0x07,0x10,0x00,0x00,0x8f,0xff,0x00,0x02]
+; CHECK: r0 = *(u64 *)(r1 + 0) # encoding: [0x79,0x01,0x00,0x00,0x00,0x00,0x00,0x00]
+ %2 = alloca i64, align 8
+ %3 = bitcast i64* %2 to i8*
+ store volatile i64 590618314553, i64* %2, align 8
+ %4 = load volatile i64, i64* %2, align 8
+ %5 = add i64 %4, -1879113726
+ %6 = inttoptr i64 %5 to i64*
+ %7 = load i64, i64* %6, align 8
+ %8 = trunc i64 %7 to i32
+ ret i32 %8
+}
+
diff --git a/test/CodeGen/Hexagon/cfgopt-fall-through.ll b/test/CodeGen/Hexagon/cfgopt-fall-through.ll
new file mode 100644
index 000000000000..be234aafc0bb
--- /dev/null
+++ b/test/CodeGen/Hexagon/cfgopt-fall-through.ll
@@ -0,0 +1,71 @@
+; RUN: llc -march=hexagon -verify-machineinstrs < %s | FileCheck %s
+; REQUIRES: asserts
+
+; Check for some sane output. This test used to crash.
+; CHECK: jumpr r31
+
+
+define i32 @fred(i32 %a0, i8 zeroext %a1) local_unnamed_addr #0 {
+b2:
+ br i1 undef, label %b4, label %b3
+
+b3: ; preds = %b2
+ unreachable
+
+b4: ; preds = %b2
+ br i1 undef, label %b19, label %b5
+
+b5: ; preds = %b4
+ br i1 undef, label %b6, label %b12
+
+b6: ; preds = %b5
+ switch i8 %a1, label %b17 [
+ i8 2, label %b7
+ i8 5, label %b7
+ i8 1, label %b7
+ i8 3, label %b8
+ ]
+
+b7: ; preds = %b6, %b6, %b6
+ unreachable
+
+b8: ; preds = %b6
+ br i1 undef, label %b11, label %b9
+
+b9: ; preds = %b8
+ %v10 = or i32 undef, 0
+ br label %b15
+
+b11: ; preds = %b8
+ unreachable
+
+b12: ; preds = %b5
+ switch i8 %a1, label %b17 [
+ i8 5, label %b13
+ i8 1, label %b13
+ i8 2, label %b14
+ i8 3, label %b15
+ ]
+
+b13: ; preds = %b12, %b12
+ store i32 %a0, i32* undef, align 4
+ br label %b17
+
+b14: ; preds = %b12
+ store i16 undef, i16* undef, align 4
+ br label %b17
+
+b15: ; preds = %b12, %b9
+ %v16 = phi i32 [ 0, %b12 ], [ %v10, %b9 ]
+ store i32 undef, i32* undef, align 4
+ br label %b17
+
+b17: ; preds = %b15, %b14, %b13, %b12, %b6
+ %v18 = phi i32 [ 0, %b13 ], [ 0, %b12 ], [ %v16, %b15 ], [ 0, %b14 ], [ 0, %b6 ]
+ ret i32 %v18
+
+b19: ; preds = %b4
+ unreachable
+}
+
+attributes #0 = { nounwind "target-cpu"="hexagonv55" "target-features"="-hvx,-hvx-double,-long-calls" }
diff --git a/test/CodeGen/Hexagon/rdf-def-mask.ll b/test/CodeGen/Hexagon/rdf-def-mask.ll
new file mode 100644
index 000000000000..3d65968911ed
--- /dev/null
+++ b/test/CodeGen/Hexagon/rdf-def-mask.ll
@@ -0,0 +1,52 @@
+; RUN: llc -march=hexagon -O3 -verify-machineinstrs < %s | FileCheck %s
+; REQUIRES: asserts
+
+; Check for sane output. This testcase used to crash.
+; CHECK: jumpr r31
+
+target triple = "hexagon"
+
+@g0 = external hidden unnamed_addr constant [9 x i16], align 8
+
+; Function Attrs: nounwind readnone
+define i64 @fred(i32 %a0) local_unnamed_addr #0 {
+b1:
+ %v2 = icmp slt i32 %a0, 1
+ br i1 %v2, label %b26, label %b3
+
+b3: ; preds = %b1
+ %v4 = tail call i32 @llvm.hexagon.S2.clb(i32 %a0)
+ %v5 = add nsw i32 %v4, -12
+ %v6 = add nsw i32 %v4, -28
+ %v7 = tail call i32 @llvm.hexagon.S2.asl.r.r(i32 %a0, i32 %v6)
+ %v8 = add nsw i32 %v7, -8
+ %v9 = tail call i32 @llvm.hexagon.S2.asl.r.r(i32 %a0, i32 %v5)
+ %v10 = getelementptr inbounds [9 x i16], [9 x i16]* @g0, i32 0, i32 %v8
+ %v11 = load i16, i16* %v10, align 2
+ %v12 = sext i16 %v11 to i32
+ %v13 = shl nsw i32 %v12, 16
+ %v14 = add nsw i32 %v7, -7
+ %v15 = getelementptr inbounds [9 x i16], [9 x i16]* @g0, i32 0, i32 %v14
+ %v16 = load i16, i16* %v15, align 2
+ %v17 = sub i16 %v11, %v16
+ %v18 = and i32 %v9, 65535
+ %v19 = zext i16 %v17 to i32
+ %v20 = tail call i32 @llvm.hexagon.M2.mpyu.nac.ll.s0(i32 %v13, i32 %v18, i32 %v19) #1
+ %v21 = add nsw i32 %v4, -32
+ %v22 = zext i32 %v21 to i64
+ %v23 = shl nuw i64 %v22, 32
+ %v24 = zext i32 %v20 to i64
+ %v25 = or i64 %v23, %v24
+ br label %b26
+
+b26: ; preds = %b3, %b1
+ %v27 = phi i64 [ %v25, %b3 ], [ 2147483648, %b1 ]
+ ret i64 %v27
+}
+
+declare i32 @llvm.hexagon.S2.clb(i32) #1
+declare i32 @llvm.hexagon.S2.asl.r.r(i32, i32) #1
+declare i32 @llvm.hexagon.M2.mpyu.nac.ll.s0(i32, i32, i32) #1
+
+attributes #0 = { nounwind readnone "target-cpu"="hexagonv55" "target-features"="-hvx,-hvx-double,-long-calls" }
+attributes #1 = { nounwind readnone }
diff --git a/test/CodeGen/Hexagon/unreachable-mbb-phi-subreg.mir b/test/CodeGen/Hexagon/unreachable-mbb-phi-subreg.mir
new file mode 100644
index 000000000000..6d6549201abf
--- /dev/null
+++ b/test/CodeGen/Hexagon/unreachable-mbb-phi-subreg.mir
@@ -0,0 +1,25 @@
+# RUN: llc -march=hexagon -run-pass unreachable-mbb-elimination %s -o - | FileCheck %s
+
+---
+name: fred
+tracksRegLiveness: true
+body: |
+ bb.0:
+ liveins: %d0
+ successors: %bb.2
+
+ %0 : doubleregs = COPY %d0
+ J2_jump %bb.2, implicit-def %pc
+
+ bb.1:
+ successors: %bb.2
+ A2_nop
+
+ bb.2:
+ ; Make sure that the subregister from the PHI operand is preserved.
+ ; CHECK: %[[REG:[0-9]+]] = COPY %0.isub_lo
+ ; CHECK: %r0 = COPY %[[REG]]
+ %1 : intregs = PHI %0.isub_lo, %bb.0, %0.isub_hi, %bb.1
+ %r0 = COPY %1
+...
+
diff --git a/test/CodeGen/MIR/Generic/frame-info.mir b/test/CodeGen/MIR/Generic/frame-info.mir
index 7c6e6ebbfeee..157eb99e149e 100644
--- a/test/CodeGen/MIR/Generic/frame-info.mir
+++ b/test/CodeGen/MIR/Generic/frame-info.mir
@@ -36,7 +36,6 @@ tracksRegLiveness: true
# CHECK-NEXT: maxAlignment:
# CHECK-NEXT: adjustsStack: false
# CHECK-NEXT: hasCalls: false
-# CHECK-NEXT: maxCallFrameSize: 0
# CHECK-NEXT: hasOpaqueSPAdjustment: false
# CHECK-NEXT: hasVAStart: false
# CHECK-NEXT: hasMustTailInVarArgFunc: false
diff --git a/test/CodeGen/Mips/llvm-ir/add.ll b/test/CodeGen/Mips/llvm-ir/add.ll
index eece03091044..a5ecdda94ce2 100644
--- a/test/CodeGen/Mips/llvm-ir/add.ll
+++ b/test/CodeGen/Mips/llvm-ir/add.ll
@@ -24,7 +24,7 @@
; RUN: -check-prefixes=ALL,R2-R6,GP64
; RUN: llc < %s -march=mips64 -mcpu=mips64r6 | FileCheck %s \
; RUN: -check-prefixes=ALL,R2-R6,GP64
-; RUN: llc < %s -march=mips -mcpu=mips32r3 -mattr=+micromips -O2 | FileCheck %s \
+; RUN: llc < %s -march=mips -mcpu=mips32r3 -mattr=+micromips -O2 -verify-machineinstrs | FileCheck %s \
; RUN: -check-prefixes=ALL,MMR6,MM32
; RUN: llc < %s -march=mips -mcpu=mips32r6 -mattr=+micromips -O2 | FileCheck %s \
; RUN: -check-prefixes=ALL,MMR6,MM32
@@ -117,7 +117,7 @@ entry:
; GP64: daddu $2, $4, $5
- ; MM32: addu $3, $5, $7
+ ; MM32: addu16 $3, $5, $7
; MM32: sltu $[[T0:[0-9]+]], $3, $7
; MM32: addu $[[T1:[0-9]+]], $[[T0]], $6
; MM32: addu $2, $4, $[[T1]]
@@ -158,16 +158,16 @@ entry:
; MM32: addu $[[T1:[0-9]+]], $7, $[[T0]]
; MM32: sltu $[[T2:[0-9]+]], $[[T1]], $[[T0]]
; MM32: lw $[[T3:[0-9]+]], 24($sp)
- ; MM32: addu $[[T4:[0-9]+]], $[[T2]], $[[T3]]
- ; MM32: addu $[[T5:[0-9]+]], $6, $[[T4]]
+ ; MM32: addu16 $[[T4:[0-9]+]], $[[T2]], $[[T3]]
+ ; MM32: addu16 $[[T5:[0-9]+]], $6, $[[T4]]
; MM32: sltu $[[T6:[0-9]+]], $[[T5]], $[[T3]]
; MM32: lw $[[T7:[0-9]+]], 20($sp)
- ; MM32: addu $[[T8:[0-9]+]], $[[T6]], $[[T7]]
+ ; MM32: addu16 $[[T8:[0-9]+]], $[[T6]], $[[T7]]
; MM32: lw $[[T9:[0-9]+]], 16($sp)
- ; MM32: addu $[[T10:[0-9]+]], $5, $[[T8]]
+ ; MM32: addu16 $[[T10:[0-9]+]], $5, $[[T8]]
; MM32: sltu $[[T11:[0-9]+]], $[[T10]], $[[T7]]
; MM32: addu $[[T12:[0-9]+]], $[[T11]], $[[T9]]
- ; MM32: addu $[[T13:[0-9]+]], $4, $[[T12]]
+ ; MM32: addu16 $[[T13:[0-9]+]], $4, $[[T12]]
; MM32: move $4, $[[T5]]
; MM32: move $5, $[[T1]]
@@ -289,12 +289,12 @@ define signext i128 @add_i128_4(i128 signext %a) {
; MM32: addiu $[[T0:[0-9]+]], $7, 4
; MM32: li16 $[[T1:[0-9]+]], 4
; MM32: sltu $[[T1]], $[[T0]], $[[T1]]
- ; MM32: addu $[[T2:[0-9]+]], $6, $[[T1]]
+ ; MM32: addu16 $[[T2:[0-9]+]], $6, $[[T1]]
; MM32: li16 $[[T1]], 0
; MM32: sltu $[[T3:[0-9]+]], $[[T2]], $[[T1]]
- ; MM32: addu $[[T3]], $5, $[[T3]]
+ ; MM32: addu16 $[[T3]], $5, $[[T3]]
; MM32: sltu $[[T1]], $[[T3]], $[[T1]]
- ; MM32: addu $[[T1]], $4, $[[T1]]
+ ; MM32: addu16 $[[T1]], $4, $[[T1]]
; MM32: move $4, $[[T2]]
; MM32: move $5, $[[T0]]
@@ -419,12 +419,12 @@ define signext i128 @add_i128_3(i128 signext %a) {
; MM32: addiu $[[T0:[0-9]+]], $7, 3
; MM32: li16 $[[T1:[0-9]+]], 3
; MM32: sltu $[[T1]], $[[T0]], $[[T1]]
- ; MM32: addu $[[T2:[0-9]+]], $6, $[[T1]]
+ ; MM32: addu16 $[[T2:[0-9]+]], $6, $[[T1]]
; MM32: li16 $[[T3:[0-9]+]], 0
; MM32: sltu $[[T4:[0-9]+]], $[[T2]], $[[T3]]
- ; MM32: addu $[[T4]], $5, $[[T4]]
+ ; MM32: addu16 $[[T4]], $5, $[[T4]]
; MM32: sltu $[[T5:[0-9]+]], $[[T4]], $[[T3]]
- ; MM32: addu $[[T5]], $4, $[[T5]]
+ ; MM32: addu16 $[[T5]], $4, $[[T5]]
; MM32: move $4, $[[T2]]
; MM32: move $5, $[[T0]]
diff --git a/test/CodeGen/Mips/llvm-ir/sub.ll b/test/CodeGen/Mips/llvm-ir/sub.ll
index 617ab3c1a21c..a730063c552f 100644
--- a/test/CodeGen/Mips/llvm-ir/sub.ll
+++ b/test/CodeGen/Mips/llvm-ir/sub.ll
@@ -10,7 +10,7 @@
; RUN: -check-prefixes=R2-R6,GP32,GP32-NOT-MM,NOT-MM
; RUN: llc < %s -march=mips -mcpu=mips32r6 | FileCheck %s \
; RUN: -check-prefixes=R2-R6,GP32,GP32-NOT-MM,NOT-MM
-; RUN: llc < %s -march=mips -mcpu=mips32r3 -mattr=+micromips | FileCheck %s \
+; RUN: llc < %s -march=mips -mcpu=mips32r3 -mattr=+micromips -verify-machineinstrs | FileCheck %s \
; RUN: -check-prefixes=GP32-MM,GP32,MM
; RUN: llc < %s -march=mips -mcpu=mips32r6 -mattr=+micromips | FileCheck %s \
; RUN: -check-prefixes=GP32-MM,GP32,MM
@@ -100,7 +100,7 @@ define signext i64 @sub_i64(i64 signext %a, i64 signext %b) {
entry:
; ALL-LABEL: sub_i64:
- ; GP32: subu $3, $5, $7
+ ; GP32-NOT-MM subu $3, $5, $7
; GP32: sltu $[[T0:[0-9]+]], $5, $7
; GP32: addu $[[T1:[0-9]+]], $[[T0]], $6
; GP32: subu $2, $4, $[[T1]]
@@ -138,13 +138,13 @@ entry:
; GP32-MM: lw $[[T4:[0-9]+]], 24($sp)
; GP32-MM: lw $[[T5:[0-9]+]], 28($sp)
; GP32-MM: subu $[[T1]], $7, $[[T5]]
- ; GP32-MM: subu $[[T3]], $[[T6:[0-9]+]], $[[T3]]
+ ; GP32-MM: subu16 $[[T3]], $[[T6:[0-9]+]], $[[T3]]
; GP32-MM: sltu $[[T6]], $6, $[[T4]]
- ; GP32-MM: addu $[[T0]], $[[T6]], $[[T0]]
- ; GP32-MM: subu $[[T0]], $5, $[[T0]]
+ ; GP32-MM: addu16 $[[T0]], $[[T6]], $[[T0]]
+ ; GP32-MM: subu16 $[[T0]], $5, $[[T0]]
; GP32-MM: sltu $[[T6]], $7, $[[T5]]
; GP32-MM: addu $[[T6]], $[[T6]], $[[T4]]
- ; GP32-MM: subu $[[T6]], $6, $[[T6]]
+ ; GP32-MM: subu16 $[[T6]], $6, $[[T6]]
; GP32-MM: move $[[T2]], $[[T1]]
; GP64: dsubu $3, $5, $7
diff --git a/test/CodeGen/Mips/micromips-sizereduction/micromips-lwsp-swsp.ll b/test/CodeGen/Mips/micromips-sizereduction/micromips-lwsp-swsp.ll
new file mode 100644
index 000000000000..b92554854c04
--- /dev/null
+++ b/test/CodeGen/Mips/micromips-sizereduction/micromips-lwsp-swsp.ll
@@ -0,0 +1,11 @@
+; RUN: llc -march=mipsel -mcpu=mips32r2 -mattr=+micromips -asm-show-inst -verify-machineinstrs < %s | FileCheck %s
+
+; Function Attrs: nounwind
+define i32 @function1(i32 (i32)* %f) {
+entry:
+; CHECK-LABEL: function1:
+; CHECK: SWSP_MM
+; CHECK: LWSP_MM
+ %call = call i32 %f(i32 0)
+ ret i32 0
+}
diff --git a/test/CodeGen/NVPTX/f16-instructions.ll b/test/CodeGen/NVPTX/f16-instructions.ll
index 403a67f02f80..3d4140820794 100644
--- a/test/CodeGen/NVPTX/f16-instructions.ll
+++ b/test/CodeGen/NVPTX/f16-instructions.ll
@@ -36,6 +36,21 @@ define half @test_fadd(half %a, half %b) #0 {
ret half %r
}
+; CHECK-LABEL: test_fadd_v1f16(
+; CHECK-DAG: ld.param.b16 [[A:%h[0-9]+]], [test_fadd_v1f16_param_0];
+; CHECK-DAG: ld.param.b16 [[B:%h[0-9]+]], [test_fadd_v1f16_param_1];
+; CHECK-F16-NEXT: add.rn.f16 [[R:%h[0-9]+]], [[A]], [[B]];
+; CHECK-NOF16-DAG: cvt.f32.f16 [[A32:%f[0-9]+]], [[A]]
+; CHECK-NOF16-DAG: cvt.f32.f16 [[B32:%f[0-9]+]], [[B]]
+; CHECK-NOF16-NEXT: add.rn.f32 [[R32:%f[0-9]+]], [[A32]], [[B32]];
+; CHECK-NOF16-NEXT: cvt.rn.f16.f32 [[R:%h[0-9]+]], [[R32]]
+; CHECK-NEXT: st.param.b16 [func_retval0+0], [[R]];
+; CHECK-NEXT: ret;
+define <1 x half> @test_fadd_v1f16(<1 x half> %a, <1 x half> %b) #0 {
+ %r = fadd <1 x half> %a, %b
+ ret <1 x half> %r
+}
+
; Check that we can lower fadd with immediate arguments.
; CHECK-LABEL: test_fadd_imm_0(
; CHECK-DAG: ld.param.b16 [[B:%h[0-9]+]], [test_fadd_imm_0_param_0];
diff --git a/test/CodeGen/PowerPC/build-vector-tests.ll b/test/CodeGen/PowerPC/build-vector-tests.ll
index fa4d212932f6..1bce9d4cb439 100644
--- a/test/CodeGen/PowerPC/build-vector-tests.ll
+++ b/test/CodeGen/PowerPC/build-vector-tests.ll
@@ -875,8 +875,8 @@ entry:
; P9LE: blr
; P8BE: lxvw4x
; P8BE: blr
-; P8LE: lxvd2x
-; P8LE: xxswapd
+; P8LE: lvx
+; P8LE-NOT: xxswapd
; P8LE: blr
}
@@ -942,8 +942,7 @@ entry:
; P8BE: vperm
; P8BE: blr
; P8LE: lxvd2x
-; P8LE-DAG: lxvd2x
-; P8LE-DAG: xxswapd
+; P8LE-DAG: lvx
; P8LE: xxswapd
; P8LE: vperm
; P8LE: blr
@@ -1036,7 +1035,6 @@ entry:
; P8LE: sldi {{r[0-9]+}}, r4, 2
; P8LE-DAG: lxvd2x
; P8LE-DAG: lxvd2x
-; P8LE-DAG: xxswapd
; P8LE: xxswapd
; P8LE: vperm
; P8LE: blr
@@ -1289,8 +1287,8 @@ entry:
; P9LE: blr
; P8BE: lxvw4x
; P8BE: blr
-; P8LE: lxvd2x
-; P8LE: xxswapd
+; P8LE: lvx
+; P8LE-NOT: xxswapd
; P8LE: blr
}
@@ -1315,7 +1313,7 @@ entry:
; P8BE: xvcvspsxws v2, [[REG1]]
; P8BE: blr
; P8LE: lxvd2x [[REG1:[vs0-9]+]], 0, r3
-; P8LE: xxswapd v2, [[REG1]]
+; P8LE: xxswapd
; P8LE: xvcvspsxws v2, v2
; P8LE: blr
}
@@ -1359,8 +1357,7 @@ entry:
; P8BE: xvcvspsxws
; P8BE: blr
; P8LE: lxvd2x
-; P8LE-DAG: lxvd2x
-; P8LE-DAG: xxswapd
+; P8LE-DAG: lvx
; P8LE: xxswapd
; P8LE: vperm
; P8LE: xvcvspsxws
@@ -1566,8 +1563,8 @@ entry:
; P9LE: blr
; P8BE: lxvw4x
; P8BE: blr
-; P8LE: lxvd2x
-; P8LE: xxswapd
+; P8LE: lvx
+; P8LE-NOT: xxswapd
; P8LE: blr
}
@@ -2036,8 +2033,8 @@ entry:
; P9LE: blr
; P8BE: lxvw4x
; P8BE: blr
-; P8LE: lxvd2x
-; P8LE: xxswapd
+; P8LE: lvx
+; P8LE-NOT: xxswapd
; P8LE: blr
}
@@ -2103,8 +2100,8 @@ entry:
; P8BE: vperm
; P8BE: blr
; P8LE: lxvd2x
-; P8LE-DAG: lxvd2x
-; P8LE-DAG: xxswapd
+; P8LE-DAG: lvx
+; P8LE-NOT: xxswapd
; P8LE: xxswapd
; P8LE: vperm
; P8LE: blr
@@ -2195,10 +2192,8 @@ entry:
; P8BE: vperm
; P8BE: blr
; P8LE-DAG: sldi {{r[0-9]+}}, r4, 2
-; P8LE-DAG: lxvd2x
-; P8LE-DAG: lxvd2x
-; P8LE-DAG: xxswapd
-; P8LE: xxswapd
+; P8LE-DAG: lvx
+; P8LE-DAG: lvx
; P8LE: vperm
; P8LE: blr
}
@@ -2450,8 +2445,8 @@ entry:
; P9LE: blr
; P8BE: lxvw4x
; P8BE: blr
-; P8LE: lxvd2x
-; P8LE: xxswapd
+; P8LE: lvx
+; P8LE-NOT: xxswapd
; P8LE: blr
}
@@ -2519,9 +2514,8 @@ entry:
; P8BE: vperm
; P8BE: xvcvspuxws
; P8BE: blr
-; P8LE: lxvd2x
; P8LE-DAG: lxvd2x
-; P8LE-DAG: xxswapd
+; P8LE-DAG: lvx
; P8LE: xxswapd
; P8LE: vperm
; P8LE: xvcvspuxws
@@ -2727,8 +2721,8 @@ entry:
; P9LE: blr
; P8BE: lxvw4x
; P8BE: blr
-; P8LE: lxvd2x
-; P8LE: xxswapd
+; P8LE: lvx
+; P8LE-NOT: xxswapd
; P8LE: blr
}
diff --git a/test/CodeGen/PowerPC/ppc64-anyregcc.ll b/test/CodeGen/PowerPC/ppc64-anyregcc.ll
index 4af118b567b2..06ec561a45dd 100644
--- a/test/CodeGen/PowerPC/ppc64-anyregcc.ll
+++ b/test/CodeGen/PowerPC/ppc64-anyregcc.ll
@@ -31,7 +31,7 @@ target triple = "powerpc64-unknown-linux-gnu"
; CHECK-LABEL: .section .llvm_stackmaps
; CHECK-NEXT: __LLVM_StackMaps:
; Header
-; CHECK-NEXT: .byte 2
+; CHECK-NEXT: .byte 3
; CHECK-NEXT: .byte 0
; CHECK-NEXT: .short 0
; Num Functions
@@ -75,18 +75,24 @@ target triple = "powerpc64-unknown-linux-gnu"
; CHECK-NEXT: .short 3
; Loc 0: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 4
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 4
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 2: Constant 3
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
-; CHECK-NEXT: .short 0
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 3
define i64 @test() nounwind ssp uwtable {
entry:
@@ -96,18 +102,22 @@ entry:
; property access 1 - %obj is an anyreg call argument and should therefore be in a register
; CHECK: .long .L{{.*}}-.L[[property_access1_BEGIN]]
-; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
; 2 locations
; CHECK-NEXT: .short 2
; Loc 0: Register <-- this is the return register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define i64 @property_access1(i8* %obj) nounwind ssp uwtable {
entry:
@@ -118,18 +128,22 @@ entry:
; property access 2 - %obj is an anyreg call argument and should therefore be in a register
; CHECK: .long .L{{.*}}-.L[[property_access2_BEGIN]]
-; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
; 2 locations
; CHECK-NEXT: .short 2
; Loc 0: Register <-- this is the return register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define i64 @property_access2() nounwind ssp uwtable {
entry:
@@ -141,18 +155,22 @@ entry:
; property access 3 - %obj is a frame index
; CHECK: .long .L{{.*}}-.L[[property_access3_BEGIN]]
-; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
; 2 locations
; CHECK-NEXT: .short 2
; Loc 0: Register <-- this is the return register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Direct FP - 8
; CHECK-NEXT: .byte 2
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short 31
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 112
define i64 @property_access3() nounwind ssp uwtable {
entry:
@@ -164,78 +182,106 @@ entry:
; anyreg_test1
; CHECK: .long .L{{.*}}-.L[[anyreg_test1_BEGIN]]
-; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
; 14 locations
; CHECK-NEXT: .short 14
; Loc 0: Register <-- this is the return register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 2: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 3: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 4: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 5: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 6: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 7: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 8: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 9: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 10: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 11: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 12: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 13: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define i64 @anyreg_test1(i8* %a1, i8* %a2, i8* %a3, i8* %a4, i8* %a5, i8* %a6, i8* %a7, i8* %a8, i8* %a9, i8* %a10, i8* %a11, i8* %a12, i8* %a13) nounwind ssp uwtable {
entry:
@@ -246,78 +292,106 @@ entry:
; anyreg_test2
; CHECK: .long .L{{.*}}-.L[[anyreg_test2_BEGIN]]
-; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
; 14 locations
; CHECK-NEXT: .short 14
; Loc 0: Register <-- this is the return register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 2: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 3: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 4: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 5: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 6: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 7: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 8: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 9: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 10: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 11: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 12: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 13: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define i64 @anyreg_test2(i8* %a1, i8* %a2, i8* %a3, i8* %a4, i8* %a5, i8* %a6, i8* %a7, i8* %a8, i8* %a9, i8* %a10, i8* %a11, i8* %a12, i8* %a13) nounwind ssp uwtable {
entry:
@@ -335,18 +409,24 @@ entry:
; CHECK-NEXT: .short 3
; Loc 0: Register (some register that will be spilled to the stack)
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define i64 @patchpoint_spilldef(i64 %p1, i64 %p2, i64 %p3, i64 %p4) {
entry:
@@ -365,28 +445,38 @@ entry:
; CHECK-NEXT: .short 5
; Loc 0: Return a register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Arg0 in a Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 2: Arg1 in a Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 3: Arg2 spilled to FP -96
; CHECK-NEXT: .byte 3
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short 31
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 128
; Loc 4: Arg3 spilled to FP - 88
; CHECK-NEXT: .byte 3
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short 31
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 136
define i64 @patchpoint_spillargs(i64 %p1, i64 %p2, i64 %p3, i64 %p4) {
entry:
diff --git a/test/CodeGen/PowerPC/ppc64-i128-abi.ll b/test/CodeGen/PowerPC/ppc64-i128-abi.ll
index 924e04a34a95..4a8fd90db3eb 100644
--- a/test/CodeGen/PowerPC/ppc64-i128-abi.ll
+++ b/test/CodeGen/PowerPC/ppc64-i128-abi.ll
@@ -1,5 +1,6 @@
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
-; RUN: -mcpu=pwr8 < %s | FileCheck %s -check-prefix=CHECK-LE
+; RUN: -mcpu=pwr8 < %s | FileCheck %s -check-prefix=CHECK-LE \
+; RUN: --implicit-check-not xxswapd
; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \
; RUN: -mcpu=pwr8 < %s | FileCheck %s -check-prefix=CHECK-BE
@@ -8,13 +9,15 @@
; RUN: -mcpu=pwr8 -mattr=-vsx < %s | FileCheck %s -check-prefix=CHECK-NOVSX
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
-; RUN: -mcpu=pwr8 -mattr=-vsx < %s | FileCheck %s -check-prefix=CHECK-NOVSX
+; RUN: -mcpu=pwr8 -mattr=-vsx < %s | FileCheck %s -check-prefix=CHECK-NOVSX \
+; RUN: --implicit-check-not xxswapd
; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \
; RUN: -mcpu=pwr8 -mattr=-vsx < %s | FileCheck %s -check-prefix=CHECK-BE-NOVSX
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
-; RUN: -mcpu=pwr8 -mattr=-vsx < %s | FileCheck %s -check-prefix=CHECK-LE-NOVSX
+; RUN: -mcpu=pwr8 -mattr=-vsx < %s | \
+; RUN: FileCheck %s -check-prefix=CHECK-LE-NOVSX --implicit-check-not xxswapd
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
; RUN: -mcpu=pwr9 -ppc-vsr-nums-as-vr < %s | FileCheck %s \
@@ -26,7 +29,7 @@
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
; RUN: -mcpu=pwr9 -mattr=-power9-vector -mattr=-direct-move < %s | \
-; RUN: FileCheck %s -check-prefix=CHECK-LE
+; RUN: FileCheck %s -check-prefix=CHECK-LE --implicit-check-not xxswapd
@x = common global <1 x i128> zeroinitializer, align 16
@y = common global <1 x i128> zeroinitializer, align 16
@@ -199,8 +202,7 @@ define <1 x i128> @call_v1i128_increment_by_one() nounwind {
ret <1 x i128> %ret
; CHECK-LE-LABEL: @call_v1i128_increment_by_one
-; CHECK-LE: lxvd2x [[PARAM:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}
-; CHECK-LE: xxswapd 34, [[PARAM]]
+; CHECK-LE: lvx 2, {{[0-9]+}}, {{[0-9]+}}
; CHECK-LE: bl v1i128_increment_by_one
; CHECK-LE: blr
@@ -229,10 +231,8 @@ define <1 x i128> @call_v1i128_increment_by_val() nounwind {
ret <1 x i128> %ret
; CHECK-LE-LABEL: @call_v1i128_increment_by_val
-; CHECK-LE: lxvd2x [[PARAM1:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}
-; CHECK-LE: lxvd2x [[PARAM2:[0-9]+]], {{[0-9]+}}, {{[0-9]+}}
-; CHECK-LE-DAG: xxswapd 34, [[PARAM1]]
-; CHECK-LE-DAG: xxswapd 35, [[PARAM2]]
+; CHECK-LE: lvx 2, {{[0-9]+}}, {{[0-9]+}}
+; CHECK-LE: lvx 3, {{[0-9]+}}, {{[0-9]+}}
; CHECK-LE: bl v1i128_increment_by_val
; CHECK-LE: blr
diff --git a/test/CodeGen/PowerPC/ppc64-stackmap.ll b/test/CodeGen/PowerPC/ppc64-stackmap.ll
index 854cee22c342..5abc2a2a2173 100644
--- a/test/CodeGen/PowerPC/ppc64-stackmap.ll
+++ b/test/CodeGen/PowerPC/ppc64-stackmap.ll
@@ -44,7 +44,7 @@ target triple = "powerpc64-unknown-linux-gnu"
; CHECK-LABEL: .section .llvm_stackmaps
; CHECK-NEXT: __LLVM_StackMaps:
; Header
-; CHECK-NEXT: .byte 2
+; CHECK-NEXT: .byte 3
; CHECK-NEXT: .byte 0
; CHECK-NEXT: .short 0
; Num Functions
@@ -101,22 +101,30 @@ target triple = "powerpc64-unknown-linux-gnu"
; CHECK-NEXT: .short 4
; SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 65535
; SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 65536
; SmallConstant
; CHECK-NEXT: .byte 5
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; LargeConstant at index 0
; CHECK-NEXT: .byte 5
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 1
@@ -133,12 +141,16 @@ entry:
; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 2
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define void @osrinline(i64 %a, i64 %b) {
entry:
@@ -157,12 +169,16 @@ entry:
; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 2
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define void @osrcold(i64 %a, i64 %b) {
entry:
@@ -197,12 +213,16 @@ entry:
; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 2
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define void @propertyWrite(i64 %dummy1, i64* %obj, i64 %dummy2, i64 %a) {
entry:
@@ -219,12 +239,16 @@ entry:
; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 2
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define void @jsVoidCall(i64 %dummy1, i64* %obj, i64 %arg, i64 %l1, i64 %l2) {
entry:
@@ -241,12 +265,16 @@ entry:
; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 2
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define i64 @jsIntCall(i64 %dummy1, i64* %obj, i64 %arg, i64 %l1, i64 %l2) {
entry:
@@ -267,8 +295,11 @@ entry:
; Check that at least one is a spilled entry from r31.
; Location: Indirect FP + ...
; CHECK: .byte 3
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short
; CHECK-NEXT: .short 31
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long
define void @spilledValue(i64 %arg0, i64 %arg1, i64 %arg2, i64 %arg3, i64 %arg4, i64 %l0, i64 %l1, i64 %l2, i64 %l3, i64 %l4, i64 %l5, i64 %l6, i64 %l7, i64 %l8, i64 %l9, i64 %l10, i64 %l11, i64 %l12, i64 %l13, i64 %l14, i64 %l15, i64 %l16, i64 %l17, i64 %l18, i64 %l19, i64 %l20, i64 %l21, i64 %l22, i64 %l23, i64 %l24, i64 %l25, i64 %l26, i64 %l27) {
entry:
call void (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.void(i64 11, i32 40, i8* null, i32 5, i64 %arg0, i64 %arg1, i64 %arg2, i64 %arg3, i64 %arg4, i64 %l0, i64 %l1, i64 %l2, i64 %l3, i64 %l4, i64 %l5, i64 %l6, i64 %l7, i64 %l8, i64 %l9, i64 %l10, i64 %l11, i64 %l12, i64 %l13, i64 %l14, i64 %l15, i64 %l16, i64 %l17, i64 %l18, i64 %l19, i64 %l20, i64 %l21, i64 %l22, i64 %l23, i64 %l24, i64 %l25, i64 %l26, i64 %l27)
@@ -286,8 +317,11 @@ entry:
; Check that at least one is a spilled entry from r31.
; Location: Indirect FP + ...
; CHECK: .byte 3
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short
; CHECK-NEXT: .short 31
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long
define webkit_jscc void @spilledStackMapValue(i64 %l0, i64 %l1, i64 %l2, i64 %l3, i64 %l4, i64 %l5, i64 %l6, i64 %l7, i64 %l8, i64 %l9, i64 %l10, i64 %l11, i64 %l12, i64 %l13, i64 %l14, i64 %l15, i64 %l16, i64 %l17, i64 %l18, i64 %l19, i64 %l20, i64 %l21, i64 %l22, i64 %l23, i64 %l24, i64 %l25, i64 %l26, i64 %l27, i64 %l28, i64 %l29) {
entry:
call void (i64, i32, ...) @llvm.experimental.stackmap(i64 12, i32 16, i64 %l0, i64 %l1, i64 %l2, i64 %l3, i64 %l4, i64 %l5, i64 %l6, i64 %l7, i64 %l8, i64 %l9, i64 %l10, i64 %l11, i64 %l12, i64 %l13, i64 %l14, i64 %l15, i64 %l16, i64 %l17, i64 %l18, i64 %l19, i64 %l20, i64 %l21, i64 %l22, i64 %l23, i64 %l24, i64 %l25, i64 %l26, i64 %l27, i64 %l28, i64 %l29)
@@ -303,7 +337,9 @@ entry:
; CHECK-NEXT: .short 1
; Loc 0: SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 33
@@ -320,8 +356,10 @@ define void @liveConstant() {
; CHECK-NEXT: .short 1
; Loc 0: Indirect FP (r31) - offset
; CHECK-NEXT: .byte 3
-; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 4
; CHECK-NEXT: .short 31
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long {{[0-9]+}}
define void @clobberLR(i32 %a) {
tail call void asm sideeffect "nop", "~{r0},~{r3},~{r4},~{r5},~{r6},~{r7},~{r8},~{r9},~{r10},~{r11},~{r12},~{r14},~{r15},~{r16},~{r17},~{r18},~{r19},~{r20},~{r21},~{r22},~{r23},~{r24},~{r25},~{r26},~{r27},~{r28},~{r29},~{r30},~{r31}"() nounwind
diff --git a/test/CodeGen/PowerPC/swaps-le-1.ll b/test/CodeGen/PowerPC/swaps-le-1.ll
index f3db4f5c4823..762640552703 100644
--- a/test/CodeGen/PowerPC/swaps-le-1.ll
+++ b/test/CodeGen/PowerPC/swaps-le-1.ll
@@ -13,6 +13,12 @@
; RUN: -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu < %s \
; RUN: | FileCheck -check-prefix=NOOPTSWAP %s
+; LH: 2016-11-17
+; Updated align attritue from 16 to 8 to keep swap instructions tests.
+; Changes have been made on little-endian to use lvx and stvx
+; instructions instead of lxvd2x/xxswapd and xxswapd/stxvd2x for
+; aligned vectors with elements up to 4 bytes
+
; This test was generated from the following source:
;
; #define N 4096
@@ -29,10 +35,10 @@
; }
; }
-@cb = common global [4096 x i32] zeroinitializer, align 16
-@cc = common global [4096 x i32] zeroinitializer, align 16
-@cd = common global [4096 x i32] zeroinitializer, align 16
-@ca = common global [4096 x i32] zeroinitializer, align 16
+@cb = common global [4096 x i32] zeroinitializer, align 8
+@cc = common global [4096 x i32] zeroinitializer, align 8
+@cd = common global [4096 x i32] zeroinitializer, align 8
+@ca = common global [4096 x i32] zeroinitializer, align 8
define void @foo() {
entry:
@@ -42,63 +48,63 @@ vector.body:
%index = phi i64 [ 0, %entry ], [ %index.next.3, %vector.body ]
%0 = getelementptr inbounds [4096 x i32], [4096 x i32]* @cb, i64 0, i64 %index
%1 = bitcast i32* %0 to <4 x i32>*
- %wide.load = load <4 x i32>, <4 x i32>* %1, align 16
+ %wide.load = load <4 x i32>, <4 x i32>* %1, align 8
%2 = getelementptr inbounds [4096 x i32], [4096 x i32]* @cc, i64 0, i64 %index
%3 = bitcast i32* %2 to <4 x i32>*
- %wide.load13 = load <4 x i32>, <4 x i32>* %3, align 16
+ %wide.load13 = load <4 x i32>, <4 x i32>* %3, align 8
%4 = add nsw <4 x i32> %wide.load13, %wide.load
%5 = getelementptr inbounds [4096 x i32], [4096 x i32]* @cd, i64 0, i64 %index
%6 = bitcast i32* %5 to <4 x i32>*
- %wide.load14 = load <4 x i32>, <4 x i32>* %6, align 16
+ %wide.load14 = load <4 x i32>, <4 x i32>* %6, align 8
%7 = mul nsw <4 x i32> %4, %wide.load14
%8 = getelementptr inbounds [4096 x i32], [4096 x i32]* @ca, i64 0, i64 %index
%9 = bitcast i32* %8 to <4 x i32>*
- store <4 x i32> %7, <4 x i32>* %9, align 16
+ store <4 x i32> %7, <4 x i32>* %9, align 8
%index.next = add nuw nsw i64 %index, 4
%10 = getelementptr inbounds [4096 x i32], [4096 x i32]* @cb, i64 0, i64 %index.next
%11 = bitcast i32* %10 to <4 x i32>*
- %wide.load.1 = load <4 x i32>, <4 x i32>* %11, align 16
+ %wide.load.1 = load <4 x i32>, <4 x i32>* %11, align 8
%12 = getelementptr inbounds [4096 x i32], [4096 x i32]* @cc, i64 0, i64 %index.next
%13 = bitcast i32* %12 to <4 x i32>*
- %wide.load13.1 = load <4 x i32>, <4 x i32>* %13, align 16
+ %wide.load13.1 = load <4 x i32>, <4 x i32>* %13, align 8
%14 = add nsw <4 x i32> %wide.load13.1, %wide.load.1
%15 = getelementptr inbounds [4096 x i32], [4096 x i32]* @cd, i64 0, i64 %index.next
%16 = bitcast i32* %15 to <4 x i32>*
- %wide.load14.1 = load <4 x i32>, <4 x i32>* %16, align 16
+ %wide.load14.1 = load <4 x i32>, <4 x i32>* %16, align 8
%17 = mul nsw <4 x i32> %14, %wide.load14.1
%18 = getelementptr inbounds [4096 x i32], [4096 x i32]* @ca, i64 0, i64 %index.next
%19 = bitcast i32* %18 to <4 x i32>*
- store <4 x i32> %17, <4 x i32>* %19, align 16
+ store <4 x i32> %17, <4 x i32>* %19, align 8
%index.next.1 = add nuw nsw i64 %index.next, 4
%20 = getelementptr inbounds [4096 x i32], [4096 x i32]* @cb, i64 0, i64 %index.next.1
%21 = bitcast i32* %20 to <4 x i32>*
- %wide.load.2 = load <4 x i32>, <4 x i32>* %21, align 16
+ %wide.load.2 = load <4 x i32>, <4 x i32>* %21, align 8
%22 = getelementptr inbounds [4096 x i32], [4096 x i32]* @cc, i64 0, i64 %index.next.1
%23 = bitcast i32* %22 to <4 x i32>*
- %wide.load13.2 = load <4 x i32>, <4 x i32>* %23, align 16
+ %wide.load13.2 = load <4 x i32>, <4 x i32>* %23, align 8
%24 = add nsw <4 x i32> %wide.load13.2, %wide.load.2
%25 = getelementptr inbounds [4096 x i32], [4096 x i32]* @cd, i64 0, i64 %index.next.1
%26 = bitcast i32* %25 to <4 x i32>*
- %wide.load14.2 = load <4 x i32>, <4 x i32>* %26, align 16
+ %wide.load14.2 = load <4 x i32>, <4 x i32>* %26, align 8
%27 = mul nsw <4 x i32> %24, %wide.load14.2
%28 = getelementptr inbounds [4096 x i32], [4096 x i32]* @ca, i64 0, i64 %index.next.1
%29 = bitcast i32* %28 to <4 x i32>*
- store <4 x i32> %27, <4 x i32>* %29, align 16
+ store <4 x i32> %27, <4 x i32>* %29, align 8
%index.next.2 = add nuw nsw i64 %index.next.1, 4
%30 = getelementptr inbounds [4096 x i32], [4096 x i32]* @cb, i64 0, i64 %index.next.2
%31 = bitcast i32* %30 to <4 x i32>*
- %wide.load.3 = load <4 x i32>, <4 x i32>* %31, align 16
+ %wide.load.3 = load <4 x i32>, <4 x i32>* %31, align 8
%32 = getelementptr inbounds [4096 x i32], [4096 x i32]* @cc, i64 0, i64 %index.next.2
%33 = bitcast i32* %32 to <4 x i32>*
- %wide.load13.3 = load <4 x i32>, <4 x i32>* %33, align 16
+ %wide.load13.3 = load <4 x i32>, <4 x i32>* %33, align 8
%34 = add nsw <4 x i32> %wide.load13.3, %wide.load.3
%35 = getelementptr inbounds [4096 x i32], [4096 x i32]* @cd, i64 0, i64 %index.next.2
%36 = bitcast i32* %35 to <4 x i32>*
- %wide.load14.3 = load <4 x i32>, <4 x i32>* %36, align 16
+ %wide.load14.3 = load <4 x i32>, <4 x i32>* %36, align 8
%37 = mul nsw <4 x i32> %34, %wide.load14.3
%38 = getelementptr inbounds [4096 x i32], [4096 x i32]* @ca, i64 0, i64 %index.next.2
%39 = bitcast i32* %38 to <4 x i32>*
- store <4 x i32> %37, <4 x i32>* %39, align 16
+ store <4 x i32> %37, <4 x i32>* %39, align 8
%index.next.3 = add nuw nsw i64 %index.next.2, 4
%40 = icmp eq i64 %index.next.3, 4096
br i1 %40, label %for.end, label %vector.body
diff --git a/test/CodeGen/PowerPC/swaps-le-2.ll b/test/CodeGen/PowerPC/swaps-le-2.ll
index 0963b92609f7..e7751a194f7f 100644
--- a/test/CodeGen/PowerPC/swaps-le-2.ll
+++ b/test/CodeGen/PowerPC/swaps-le-2.ll
@@ -2,6 +2,13 @@
; Test swap removal when a vector splat must be adjusted to make it legal.
;
+
+; LH: 2016-11-17
+; Updated align attritue from 16 to 8 to keep swap instructions tests.
+; Changes have been made on little-endian to use lvx and stvx
+; instructions instead of lxvd2x/xxswapd and xxswapd/stxvd2x for
+; aligned vectors with elements up to 4 bytes
+
; Test generated from following C code:
;
; vector char vc = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
@@ -28,37 +35,37 @@
; vir = (vector int){vi[1], vi[1], vi[1], vi[1]};
; }
-@vc = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16
-@vs = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16
-@vi = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16
-@vcr = common global <16 x i8> zeroinitializer, align 16
-@vsr = common global <8 x i16> zeroinitializer, align 16
-@vir = common global <4 x i32> zeroinitializer, align 16
+@vc = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 8
+@vs = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 8
+@vi = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 8
+@vcr = common global <16 x i8> zeroinitializer, align 8
+@vsr = common global <8 x i16> zeroinitializer, align 8
+@vir = common global <4 x i32> zeroinitializer, align 8
; Function Attrs: nounwind
define void @cfoo() {
entry:
- %0 = load <16 x i8>, <16 x i8>* @vc, align 16
+ %0 = load <16 x i8>, <16 x i8>* @vc, align 8
%vecinit30 = shufflevector <16 x i8> %0, <16 x i8> undef, <16 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
- store <16 x i8> %vecinit30, <16 x i8>* @vcr, align 16
+ store <16 x i8> %vecinit30, <16 x i8>* @vcr, align 8
ret void
}
; Function Attrs: nounwind
define void @sfoo() {
entry:
- %0 = load <8 x i16>, <8 x i16>* @vs, align 16
+ %0 = load <8 x i16>, <8 x i16>* @vs, align 8
%vecinit14 = shufflevector <8 x i16> %0, <8 x i16> undef, <8 x i32> <i32 6, i32 6, i32 6, i32 6, i32 6, i32 6, i32 6, i32 6>
- store <8 x i16> %vecinit14, <8 x i16>* @vsr, align 16
+ store <8 x i16> %vecinit14, <8 x i16>* @vsr, align 8
ret void
}
; Function Attrs: nounwind
define void @ifoo() {
entry:
- %0 = load <4 x i32>, <4 x i32>* @vi, align 16
+ %0 = load <4 x i32>, <4 x i32>* @vi, align 8
%vecinit6 = shufflevector <4 x i32> %0, <4 x i32> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
- store <4 x i32> %vecinit6, <4 x i32>* @vir, align 16
+ store <4 x i32> %vecinit6, <4 x i32>* @vir, align 8
ret void
}
diff --git a/test/CodeGen/PowerPC/vsx-ldst.ll b/test/CodeGen/PowerPC/vsx-ldst.ll
index a146182de99b..d8dd635aab5f 100644
--- a/test/CodeGen/PowerPC/vsx-ldst.ll
+++ b/test/CodeGen/PowerPC/vsx-ldst.ll
@@ -14,8 +14,10 @@
; RUN: llc -verify-machineinstrs -mcpu=pwr8 -mattr=+vsx -O2 \
; RUN: -mtriple=powerpc64le-unknown-linux-gnu < %s > %t
-; RUN: grep lxvd2x < %t | count 6
-; RUN: grep stxvd2x < %t | count 6
+; RUN: grep lxvd2x < %t | count 3
+; RUN: grep lvx < %t | count 3
+; RUN: grep stxvd2x < %t | count 3
+; RUN: grep stvx < %t | count 3
; RUN: llc -verify-machineinstrs -mcpu=pwr9 -O2 \
; RUN: -mtriple=powerpc64le-unknown-linux-gnu < %s > %t
diff --git a/test/CodeGen/PowerPC/vsx.ll b/test/CodeGen/PowerPC/vsx.ll
index a5dd494a7cc3..cfea3e5696de 100644
--- a/test/CodeGen/PowerPC/vsx.ll
+++ b/test/CodeGen/PowerPC/vsx.ll
@@ -645,8 +645,8 @@ define <4 x float> @test32(<4 x float>* %a) {
; CHECK-FISL: blr
; CHECK-LE-LABEL: @test32
-; CHECK-LE: lxvd2x [[V1:[0-9]+]], 0, 3
-; CHECK-LE: xxswapd 34, [[V1]]
+; CHECK-LE: lvx 2, 0, 3
+; CHECK-LE-NOT: xxswapd
; CHECK-LE: blr
}
@@ -663,8 +663,8 @@ define void @test33(<4 x float>* %a, <4 x float> %b) {
; CHECK-FISL: blr
; CHECK-LE-LABEL: @test33
-; CHECK-LE: xxswapd [[V1:[0-9]+]], 34
-; CHECK-LE: stxvd2x [[V1]], 0, 3
+; CHECK-LE-NOT: xxswapd
+; CHECK-LE: stvx 2, 0, 3
; CHECK-LE: blr
}
@@ -716,8 +716,8 @@ define <4 x i32> @test34(<4 x i32>* %a) {
; CHECK-FISL: blr
; CHECK-LE-LABEL: @test34
-; CHECK-LE: lxvd2x [[V1:[0-9]+]], 0, 3
-; CHECK-LE: xxswapd 34, [[V1]]
+; CHECK-LE: lvx 2, 0, 3
+; CHECK-LE-NOT: xxswapd
; CHECK-LE: blr
}
@@ -734,8 +734,8 @@ define void @test35(<4 x i32>* %a, <4 x i32> %b) {
; CHECK-FISL: blr
; CHECK-LE-LABEL: @test35
-; CHECK-LE: xxswapd [[V1:[0-9]+]], 34
-; CHECK-LE: stxvd2x [[V1]], 0, 3
+; CHECK-LE-NOT: xxswapd
+; CHECK-LE: stvx 2, 0, 3
; CHECK-LE: blr
}
@@ -1150,9 +1150,9 @@ define <2 x i32> @test80(i32 %v) {
; CHECK-LE-DAG: mtvsrd [[R1:[0-9]+]], 3
; CHECK-LE-DAG: xxswapd [[V1:[0-9]+]], [[R1]]
; CHECK-LE-DAG: addi [[R2:[0-9]+]], {{[0-9]+}}, .LCPI
-; CHECK-LE-DAG: lxvd2x [[V2:[0-9]+]], 0, [[R2]]
+; CHECK-LE-DAG: lvx 3, 0, [[R2]]
; CHECK-LE-DAG: xxspltw 34, [[V1]]
-; CHECK-LE-DAG: xxswapd 35, [[V2]]
+; CHECK-LE-NOT: xxswapd 35, [[V2]]
; CHECK-LE: vadduwm 2, 2, 3
; CHECK-LE: blr
}
diff --git a/test/CodeGen/X86/GlobalISel/binop.ll b/test/CodeGen/X86/GlobalISel/binop.ll
index 8499dd958447..bf4c42cb4292 100644
--- a/test/CodeGen/X86/GlobalISel/binop.ll
+++ b/test/CodeGen/X86/GlobalISel/binop.ll
@@ -24,6 +24,28 @@ define i32 @test_add_i32(i32 %arg1, i32 %arg2) {
ret i32 %ret
}
+define i16 @test_add_i16(i16 %arg1, i16 %arg2) {
+; ALL-LABEL: test_add_i16:
+; ALL: # BB#0:
+; ALL-NEXT: # kill: %DI<def> %DI<kill> %RDI<def>
+; ALL-NEXT: # kill: %SI<def> %SI<kill> %RSI<def>
+; ALL-NEXT: leal (%rsi,%rdi), %eax
+; ALL-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill>
+; ALL-NEXT: retq
+ %ret = add i16 %arg1, %arg2
+ ret i16 %ret
+}
+
+define i8 @test_add_i8(i8 %arg1, i8 %arg2) {
+; ALL-LABEL: test_add_i8:
+; ALL: # BB#0:
+; ALL-NEXT: addb %dil, %sil
+; ALL-NEXT: movl %esi, %eax
+; ALL-NEXT: retq
+ %ret = add i8 %arg1, %arg2
+ ret i8 %ret
+}
+
define i64 @test_sub_i64(i64 %arg1, i64 %arg2) {
; ALL-LABEL: test_sub_i64:
; ALL: # BB#0:
diff --git a/test/CodeGen/X86/GlobalISel/callingconv.ll b/test/CodeGen/X86/GlobalISel/callingconv.ll
index ec62ece6d408..c7e4d91ac3c7 100644
--- a/test/CodeGen/X86/GlobalISel/callingconv.ll
+++ b/test/CodeGen/X86/GlobalISel/callingconv.ll
@@ -37,6 +37,44 @@ define i64 @test_ret_i64() {
ret i64 68719476735
}
+define i8 @test_arg_i8(i8 %a) {
+; X32_GISEL-LABEL: test_arg_i8:
+; X32_GISEL: # BB#0:
+; X32_GISEL-NEXT: leal 4(%esp), %eax
+; X32_GISEL-NEXT: movb (%eax), %al
+; X32_GISEL-NEXT: retl
+;
+; X32_ISEL-LABEL: test_arg_i8:
+; X32_ISEL: # BB#0:
+; X32_ISEL-NEXT: movb 4(%esp), %al
+; X32_ISEL-NEXT: retl
+;
+; X64-LABEL: test_arg_i8:
+; X64: # BB#0:
+; X64-NEXT: movl %edi, %eax
+; X64-NEXT: retq
+ ret i8 %a
+}
+
+define i16 @test_arg_i16(i16 %a) {
+; X32_GISEL-LABEL: test_arg_i16:
+; X32_GISEL: # BB#0:
+; X32_GISEL-NEXT: leal 4(%esp), %eax
+; X32_GISEL-NEXT: movzwl (%eax), %eax
+; X32_GISEL-NEXT: retl
+;
+; X32_ISEL-LABEL: test_arg_i16:
+; X32_ISEL: # BB#0:
+; X32_ISEL-NEXT: movzwl 4(%esp), %eax
+; X32_ISEL-NEXT: retl
+;
+; X64-LABEL: test_arg_i16:
+; X64: # BB#0:
+; X64-NEXT: movl %edi, %eax
+; X64-NEXT: retq
+ ret i16 %a
+}
+
define i32 @test_arg_i32(i32 %a) {
; X32_GISEL-LABEL: test_arg_i32:
; X32_GISEL: # BB#0:
diff --git a/test/CodeGen/X86/GlobalISel/ext-x86-64.ll b/test/CodeGen/X86/GlobalISel/ext-x86-64.ll
new file mode 100644
index 000000000000..c4d3566008b1
--- /dev/null
+++ b/test/CodeGen/X86/GlobalISel/ext-x86-64.ll
@@ -0,0 +1,29 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=x86_64-linux-gnu -global-isel < %s -o - | FileCheck %s --check-prefix=X64
+
+; TODO merge with ext.ll after i64 sext suported on 32bit platform
+
+define i64 @test_sext_i8(i8 %val) {
+; X64-LABEL: test_sext_i8:
+; X64: # BB#0:
+; X64-NEXT: movsbq %dil, %rax
+; X64-NEXT: retq
+ %r = sext i8 %val to i64
+ ret i64 %r
+}
+
+define i64 @test_sext_i16(i16 %val) {
+; X64-LABEL: test_sext_i16:
+; X64: # BB#0:
+; X64-NEXT: movswq %di, %rax
+; X64-NEXT: retq
+ %r = sext i16 %val to i64
+ ret i64 %r
+}
+
+; TODO enable after selection supported
+;define i64 @test_sext_i32(i32 %val) {
+; %r = sext i32 %val to i64
+; ret i64 %r
+;}
+
diff --git a/test/CodeGen/X86/GlobalISel/ext.ll b/test/CodeGen/X86/GlobalISel/ext.ll
new file mode 100644
index 000000000000..3c032686130e
--- /dev/null
+++ b/test/CodeGen/X86/GlobalISel/ext.ll
@@ -0,0 +1,64 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=x86_64-linux-gnu -global-isel < %s -o - | FileCheck %s --check-prefix=X64
+; RUN: llc -mtriple=i386-linux-gnu -global-isel < %s -o - | FileCheck %s --check-prefix=X32
+
+define i32 @test_zext_i8(i8 %val) {
+; X64-LABEL: test_zext_i8:
+; X64: # BB#0:
+; X64-NEXT: movzbl %dil, %eax
+; X64-NEXT: retq
+;
+; X32-LABEL: test_zext_i8:
+; X32: # BB#0:
+; X32-NEXT: leal 4(%esp), %eax
+; X32-NEXT: movzbl (%eax), %eax
+; X32-NEXT: retl
+ %r = zext i8 %val to i32
+ ret i32 %r
+}
+
+define i32 @test_zext_i16(i16 %val) {
+; X64-LABEL: test_zext_i16:
+; X64: # BB#0:
+; X64-NEXT: movzwl %di, %eax
+; X64-NEXT: retq
+;
+; X32-LABEL: test_zext_i16:
+; X32: # BB#0:
+; X32-NEXT: leal 4(%esp), %eax
+; X32-NEXT: movzwl (%eax), %eax
+; X32-NEXT: retl
+ %r = zext i16 %val to i32
+ ret i32 %r
+}
+
+define i32 @test_sext_i8(i8 %val) {
+; X64-LABEL: test_sext_i8:
+; X64: # BB#0:
+; X64-NEXT: movsbl %dil, %eax
+; X64-NEXT: retq
+;
+; X32-LABEL: test_sext_i8:
+; X32: # BB#0:
+; X32-NEXT: leal 4(%esp), %eax
+; X32-NEXT: movsbl (%eax), %eax
+; X32-NEXT: retl
+ %r = sext i8 %val to i32
+ ret i32 %r
+}
+
+define i32 @test_sext_i16(i16 %val) {
+; X64-LABEL: test_sext_i16:
+; X64: # BB#0:
+; X64-NEXT: movswl %di, %eax
+; X64-NEXT: retq
+;
+; X32-LABEL: test_sext_i16:
+; X32: # BB#0:
+; X32-NEXT: leal 4(%esp), %eax
+; X32-NEXT: movswl (%eax), %eax
+; X32-NEXT: retl
+ %r = sext i16 %val to i32
+ ret i32 %r
+}
+
diff --git a/test/CodeGen/X86/GlobalISel/irtranslator-call.ll b/test/CodeGen/X86/GlobalISel/irtranslator-call.ll
index c1bf44417666..bc394f6e156f 100644
--- a/test/CodeGen/X86/GlobalISel/irtranslator-call.ll
+++ b/test/CodeGen/X86/GlobalISel/irtranslator-call.ll
@@ -20,7 +20,6 @@ define void @test_void_return() {
; CHECK-NEXT: maxAlignment: 0
; CHECK-NEXT: adjustsStack: false
; CHECK-NEXT: hasCalls: false
-; CHECK-NEXT: maxCallFrameSize: 0
; CHECK-NEXT: hasOpaqueSPAdjustment: false
; CHECK-NEXT: hasVAStart: false
; CHECK-NEXT: hasMustTailInVarArgFunc: false
diff --git a/test/CodeGen/X86/GlobalISel/legalize-ext-x86-64.mir b/test/CodeGen/X86/GlobalISel/legalize-ext-x86-64.mir
new file mode 100644
index 000000000000..25af600f2299
--- /dev/null
+++ b/test/CodeGen/X86/GlobalISel/legalize-ext-x86-64.mir
@@ -0,0 +1,172 @@
+# RUN: llc -mtriple=x86_64-linux-gnu -global-isel -run-pass=legalizer %s -o - | FileCheck %s
+
+--- |
+ define i64 @test_sext_i8(i8 %val) {
+ %r = sext i8 %val to i64
+ ret i64 %r
+ }
+
+ define i64 @test_sext_i16(i16 %val) {
+ %r = sext i16 %val to i64
+ ret i64 %r
+ }
+
+ define i64 @test_sext_i32(i32 %val) {
+ %r = sext i32 %val to i64
+ ret i64 %r
+ }
+
+ define i64 @test_zext_i8(i8 %val) {
+ %r = zext i8 %val to i64
+ ret i64 %r
+ }
+
+ define i64 @test_zext_i16(i16 %val) {
+ %r = zext i16 %val to i64
+ ret i64 %r
+ }
+
+ define i64 @test_zext_i32(i32 %val) {
+ %r = zext i32 %val to i64
+ ret i64 %r
+ }
+
+...
+---
+name: test_sext_i8
+# CHECK-LABEL: name: test_sext_i8
+alignment: 4
+legalized: false
+regBankSelected: false
+registers:
+ - { id: 0, class: _ }
+ - { id: 1, class: _ }
+# CHECK: %0(s8) = COPY %edi
+# CHECK-NEXT: %1(s64) = G_SEXT %0(s8)
+# CHECK-NEXT: %rax = COPY %1(s64)
+# CHECK-NEXT: RET 0, implicit %rax
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi
+
+ %0(s8) = COPY %edi
+ %1(s64) = G_SEXT %0(s8)
+ %rax = COPY %1(s64)
+ RET 0, implicit %rax
+
+...
+---
+name: test_sext_i16
+# CHECK-LABEL: name: test_sext_i16
+alignment: 4
+legalized: false
+regBankSelected: false
+registers:
+ - { id: 0, class: _ }
+ - { id: 1, class: _ }
+# CHECK: %0(s16) = COPY %edi
+# CHECK-NEXT: %1(s64) = G_SEXT %0(s16)
+# CHECK-NEXT: %rax = COPY %1(s64)
+# CHECK-NEXT: RET 0, implicit %rax
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi
+
+ %0(s16) = COPY %edi
+ %1(s64) = G_SEXT %0(s16)
+ %rax = COPY %1(s64)
+ RET 0, implicit %rax
+
+...
+---
+name: test_sext_i32
+# CHECK-LABEL: name: test_sext_i32
+alignment: 4
+legalized: false
+regBankSelected: false
+registers:
+ - { id: 0, class: _ }
+ - { id: 1, class: _ }
+# CHECK: %0(s32) = COPY %edi
+# CHECK-NEXT: %1(s64) = G_SEXT %0(s32)
+# CHECK-NEXT: %rax = COPY %1(s64)
+# CHECK-NEXT: RET 0, implicit %rax
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi
+
+ %0(s32) = COPY %edi
+ %1(s64) = G_SEXT %0(s32)
+ %rax = COPY %1(s64)
+ RET 0, implicit %rax
+
+...
+---
+name: test_zext_i8
+# CHECK-LABEL: name: test_zext_i8
+alignment: 4
+legalized: false
+regBankSelected: false
+registers:
+ - { id: 0, class: _ }
+ - { id: 1, class: _ }
+# CHECK: %0(s8) = COPY %edi
+# CHECK-NEXT: %1(s64) = G_ZEXT %0(s8)
+# CHECK-NEXT: %rax = COPY %1(s64)
+# CHECK-NEXT: RET 0, implicit %rax
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi
+
+ %0(s8) = COPY %edi
+ %1(s64) = G_ZEXT %0(s8)
+ %rax = COPY %1(s64)
+ RET 0, implicit %rax
+
+...
+---
+name: test_zext_i16
+# CHECK-LABEL: name: test_zext_i16
+alignment: 4
+legalized: false
+regBankSelected: false
+registers:
+ - { id: 0, class: _ }
+ - { id: 1, class: _ }
+# CHECK: %0(s16) = COPY %edi
+# CHECK-NEXT: %1(s64) = G_ZEXT %0(s16)
+# CHECK-NEXT: %rax = COPY %1(s64)
+# CHECK-NEXT: RET 0, implicit %rax
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi
+
+ %0(s16) = COPY %edi
+ %1(s64) = G_ZEXT %0(s16)
+ %rax = COPY %1(s64)
+ RET 0, implicit %rax
+
+...
+---
+name: test_zext_i32
+# CHECK-LABEL: name: test_zext_i32
+alignment: 4
+legalized: false
+regBankSelected: false
+registers:
+ - { id: 0, class: _ }
+ - { id: 1, class: _ }
+# CHECK: %0(s32) = COPY %edi
+# CHECK-NEXT: %1(s64) = G_ZEXT %0(s32)
+# CHECK-NEXT: %rax = COPY %1(s64)
+# CHECK-NEXT: RET 0, implicit %rax
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi
+
+ %0(s32) = COPY %edi
+ %1(s64) = G_ZEXT %0(s32)
+ %rax = COPY %1(s64)
+ RET 0, implicit %rax
+
+...
diff --git a/test/CodeGen/X86/GlobalISel/legalize-ext.mir b/test/CodeGen/X86/GlobalISel/legalize-ext.mir
new file mode 100644
index 000000000000..46457e0fff59
--- /dev/null
+++ b/test/CodeGen/X86/GlobalISel/legalize-ext.mir
@@ -0,0 +1,116 @@
+# RUN: llc -mtriple=i386-linux-gnu -global-isel -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X32
+# RUN: llc -mtriple=x86_64-linux-gnu -global-isel -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X64
+--- |
+ define i32 @test_zext_i8(i8 %val) {
+ %r = zext i8 %val to i32
+ ret i32 %r
+ }
+
+ define i32 @test_zext_i16(i16 %val) {
+ %r = zext i16 %val to i32
+ ret i32 %r
+ }
+
+ define i32 @test_sext_i8(i8 %val) {
+ %r = sext i8 %val to i32
+ ret i32 %r
+ }
+
+ define i32 @test_sext_i16(i16 %val) {
+ %r = sext i16 %val to i32
+ ret i32 %r
+ }
+
+...
+---
+name: test_zext_i8
+# ALL-LABEL: name: test_zext_i8
+alignment: 4
+legalized: false
+regBankSelected: false
+registers:
+ - { id: 0, class: _ }
+ - { id: 1, class: _ }
+# ALL: %0(s8) = COPY %edi
+# ALL-NEXT: %1(s32) = G_ZEXT %0(s8)
+# ALL-NEXT: %eax = COPY %1(s32)
+# ALL-NEXT: RET 0, implicit %eax
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi
+
+ %0(s8) = COPY %edi
+ %1(s32) = G_ZEXT %0(s8)
+ %eax = COPY %1(s32)
+ RET 0, implicit %eax
+
+...
+---
+name: test_zext_i16
+# ALL-LABEL: name: test_zext_i16
+alignment: 4
+legalized: false
+regBankSelected: false
+registers:
+ - { id: 0, class: _ }
+ - { id: 1, class: _ }
+# ALL: %0(s16) = COPY %edi
+# ALL-NEXT: %1(s32) = G_ZEXT %0(s16)
+# ALL-NEXT: %eax = COPY %1(s32)
+# ALL-NEXT: RET 0, implicit %eax
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi
+
+ %0(s16) = COPY %edi
+ %1(s32) = G_ZEXT %0(s16)
+ %eax = COPY %1(s32)
+ RET 0, implicit %eax
+
+...
+---
+name: test_sext_i8
+# ALL-LABEL: name: test_sext_i8
+alignment: 4
+legalized: false
+regBankSelected: false
+registers:
+ - { id: 0, class: _ }
+ - { id: 1, class: _ }
+# ALL: %0(s8) = COPY %edi
+# ALL-NEXT: %1(s32) = G_SEXT %0(s8)
+# ALL-NEXT: %eax = COPY %1(s32)
+# ALL-NEXT: RET 0, implicit %eax
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi
+
+ %0(s8) = COPY %edi
+ %1(s32) = G_SEXT %0(s8)
+ %eax = COPY %1(s32)
+ RET 0, implicit %eax
+
+...
+---
+name: test_sext_i16
+# ALL-LABEL: name: test_sext_i16
+alignment: 4
+legalized: false
+regBankSelected: false
+registers:
+ - { id: 0, class: _ }
+ - { id: 1, class: _ }
+# ALL: %0(s16) = COPY %edi
+# ALL-NEXT: %1(s32) = G_SEXT %0(s16)
+# ALL-NEXT: %eax = COPY %1(s32)
+# ALL-NEXT: RET 0, implicit %eax
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi
+
+ %0(s16) = COPY %edi
+ %1(s32) = G_SEXT %0(s16)
+ %eax = COPY %1(s32)
+ RET 0, implicit %eax
+
+...
diff --git a/test/CodeGen/X86/GlobalISel/memop-x32.ll b/test/CodeGen/X86/GlobalISel/memop-x32.ll
new file mode 100644
index 000000000000..49a7fd79f8b2
--- /dev/null
+++ b/test/CodeGen/X86/GlobalISel/memop-x32.ll
@@ -0,0 +1,101 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=i386-linux-gnu -global-isel < %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE_FAST
+; RUN: llc -mtriple=i386-linux-gnu -regbankselect-greedy -global-isel < %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE_GREEDY
+
+;TODO merge with x86-64 tests (many operations not suppored yet)
+
+define i8 @test_load_i8(i8 * %p1) {
+; ALL-LABEL: test_load_i8:
+; ALL: # BB#0:
+; ALL-NEXT: leal 4(%esp), %eax
+; ALL-NEXT: movl (%eax), %eax
+; ALL-NEXT: movb (%eax), %al
+; ALL-NEXT: retl
+ %r = load i8, i8* %p1
+ ret i8 %r
+}
+
+define i16 @test_load_i16(i16 * %p1) {
+; ALL-LABEL: test_load_i16:
+; ALL: # BB#0:
+; ALL-NEXT: leal 4(%esp), %eax
+; ALL-NEXT: movl (%eax), %eax
+; ALL-NEXT: movzwl (%eax), %eax
+; ALL-NEXT: retl
+ %r = load i16, i16* %p1
+ ret i16 %r
+}
+
+define i32 @test_load_i32(i32 * %p1) {
+; ALL-LABEL: test_load_i32:
+; ALL: # BB#0:
+; ALL-NEXT: leal 4(%esp), %eax
+; ALL-NEXT: movl (%eax), %eax
+; ALL-NEXT: movl (%eax), %eax
+; ALL-NEXT: retl
+ %r = load i32, i32* %p1
+ ret i32 %r
+}
+
+define i8 * @test_store_i8(i8 %val, i8 * %p1) {
+; ALL-LABEL: test_store_i8:
+; ALL: # BB#0:
+; ALL-NEXT: leal 4(%esp), %eax
+; ALL-NEXT: movb (%eax), %cl
+; ALL-NEXT: leal 8(%esp), %eax
+; ALL-NEXT: movl (%eax), %eax
+; ALL-NEXT: movb %cl, (%eax)
+; ALL-NEXT: retl
+ store i8 %val, i8* %p1
+ ret i8 * %p1;
+}
+
+define i16 * @test_store_i16(i16 %val, i16 * %p1) {
+; ALL-LABEL: test_store_i16:
+; ALL: # BB#0:
+; ALL-NEXT: leal 4(%esp), %eax
+; ALL-NEXT: movzwl (%eax), %ecx
+; ALL-NEXT: leal 8(%esp), %eax
+; ALL-NEXT: movl (%eax), %eax
+; ALL-NEXT: movw %cx, (%eax)
+; ALL-NEXT: retl
+ store i16 %val, i16* %p1
+ ret i16 * %p1;
+}
+
+define i32 * @test_store_i32(i32 %val, i32 * %p1) {
+; ALL-LABEL: test_store_i32:
+; ALL: # BB#0:
+; ALL-NEXT: leal 4(%esp), %eax
+; ALL-NEXT: movl (%eax), %ecx
+; ALL-NEXT: leal 8(%esp), %eax
+; ALL-NEXT: movl (%eax), %eax
+; ALL-NEXT: movl %ecx, (%eax)
+; ALL-NEXT: retl
+ store i32 %val, i32* %p1
+ ret i32 * %p1;
+}
+
+define i32* @test_load_ptr(i32** %ptr1) {
+; ALL-LABEL: test_load_ptr:
+; ALL: # BB#0:
+; ALL-NEXT: leal 4(%esp), %eax
+; ALL-NEXT: movl (%eax), %eax
+; ALL-NEXT: movl (%eax), %eax
+; ALL-NEXT: retl
+ %p = load i32*, i32** %ptr1
+ ret i32* %p
+}
+
+define void @test_store_ptr(i32** %ptr1, i32* %a) {
+; ALL-LABEL: test_store_ptr:
+; ALL: # BB#0:
+; ALL-NEXT: leal 4(%esp), %eax
+; ALL-NEXT: movl (%eax), %eax
+; ALL-NEXT: leal 8(%esp), %ecx
+; ALL-NEXT: movl (%ecx), %ecx
+; ALL-NEXT: movl %ecx, (%eax)
+; ALL-NEXT: retl
+ store i32* %a, i32** %ptr1
+ ret void
+}
diff --git a/test/CodeGen/X86/GlobalISel/memop.ll b/test/CodeGen/X86/GlobalISel/memop.ll
index f793e36026b1..a7407c0e6b75 100644
--- a/test/CodeGen/X86/GlobalISel/memop.ll
+++ b/test/CodeGen/X86/GlobalISel/memop.ll
@@ -187,3 +187,20 @@ define double * @test_store_double(double %val, double * %p1) {
ret double * %p1;
}
+define i32* @test_load_ptr(i32** %ptr1) {
+; ALL-LABEL: test_load_ptr:
+; ALL: # BB#0:
+; ALL-NEXT: movq (%rdi), %rax
+; ALL-NEXT: retq
+ %p = load i32*, i32** %ptr1
+ ret i32* %p
+}
+
+define void @test_store_ptr(i32** %ptr1, i32* %a) {
+; ALL-LABEL: test_store_ptr:
+; ALL: # BB#0:
+; ALL-NEXT: movq %rsi, (%rdi)
+; ALL-NEXT: retq
+ store i32* %a, i32** %ptr1
+ ret void
+}
diff --git a/test/CodeGen/X86/GlobalISel/X86-regbankselect.mir b/test/CodeGen/X86/GlobalISel/regbankselect-X86_64.mir
index 8e04239041a8..8e04239041a8 100644
--- a/test/CodeGen/X86/GlobalISel/X86-regbankselect.mir
+++ b/test/CodeGen/X86/GlobalISel/regbankselect-X86_64.mir
diff --git a/test/CodeGen/X86/GlobalISel/select-add.mir b/test/CodeGen/X86/GlobalISel/select-add.mir
index 27fcc223d2bb..7337ce12c395 100644
--- a/test/CodeGen/X86/GlobalISel/select-add.mir
+++ b/test/CodeGen/X86/GlobalISel/select-add.mir
@@ -14,6 +14,16 @@
ret i32 %ret
}
+ define i16 @test_add_i16(i16 %arg1, i16 %arg2) {
+ %ret = add i16 %arg1, %arg2
+ ret i16 %ret
+ }
+
+ define i8 @test_add_i8(i8 %arg1, i8 %arg2) {
+ %ret = add i8 %arg1, %arg2
+ ret i8 %ret
+ }
+
define float @test_add_float(float %arg1, float %arg2) {
%ret = fadd float %arg1, %arg2
ret float %ret
@@ -37,6 +47,7 @@
---
name: test_add_i64
+# ALL-LABEL: name: test_add_i64
legalized: true
regBankSelected: true
# ALL: registers:
@@ -63,6 +74,7 @@ body: |
---
name: test_add_i32
+# ALL-LABEL: name: test_add_i32
legalized: true
regBankSelected: true
# ALL: registers:
@@ -87,7 +99,66 @@ body: |
...
---
+name: test_add_i16
+# ALL-LABEL: name: test_add_i16
+alignment: 4
+legalized: true
+regBankSelected: true
+selected: false
+# ALL: registers:
+# ALL-NEXT: - { id: 0, class: gr16 }
+# ALL-NEXT: - { id: 1, class: gr16 }
+# ALL-NEXT: - { id: 2, class: gr16 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+ - { id: 2, class: gpr }
+# ALL: %0 = COPY %di
+# ALL: %1 = COPY %si
+# ALL: %2 = ADD16rr %0, %1, implicit-def %eflags
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi, %esi
+
+ %0(s16) = COPY %edi
+ %1(s16) = COPY %esi
+ %2(s16) = G_ADD %0, %1
+ %ax = COPY %2(s16)
+ RET 0, implicit %ax
+
+...
+---
+name: test_add_i8
+# ALL-LABEL: name: test_add_i8
+alignment: 4
+legalized: true
+regBankSelected: true
+selected: false
+# ALL: registers:
+# ALL-NEXT: - { id: 0, class: gr8 }
+# ALL-NEXT: - { id: 1, class: gr8 }
+# ALL-NEXT: - { id: 2, class: gr8 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+ - { id: 2, class: gpr }
+# ALL: %0 = COPY %dil
+# ALL: %1 = COPY %sil
+# ALL: %2 = ADD8rr %0, %1, implicit-def %eflags
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi, %esi
+
+ %0(s8) = COPY %edi
+ %1(s8) = COPY %esi
+ %2(s8) = G_ADD %0, %1
+ %al = COPY %2(s8)
+ RET 0, implicit %al
+
+...
+---
name: test_add_float
+# ALL-LABEL: name: test_add_float
alignment: 4
legalized: true
regBankSelected: true
@@ -122,6 +193,7 @@ body: |
...
---
name: test_add_double
+# ALL-LABEL: name: test_add_double
alignment: 4
legalized: true
regBankSelected: true
@@ -156,6 +228,7 @@ body: |
...
---
name: test_add_v4i32
+# ALL-LABEL: name: test_add_v4i32
alignment: 4
legalized: true
regBankSelected: true
@@ -191,6 +264,7 @@ body: |
...
---
name: test_add_v4f32
+# ALL-LABEL: name: test_add_v4f32
alignment: 4
legalized: true
regBankSelected: true
diff --git a/test/CodeGen/X86/GlobalISel/select-ext-x86-64.mir b/test/CodeGen/X86/GlobalISel/select-ext-x86-64.mir
new file mode 100644
index 000000000000..85b3f61a9e44
--- /dev/null
+++ b/test/CodeGen/X86/GlobalISel/select-ext-x86-64.mir
@@ -0,0 +1,66 @@
+# RUN: llc -mtriple=x86_64-linux-gnu -global-isel -run-pass=instruction-select %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X64
+
+--- |
+ define i64 @test_sext_i8(i8 %val) {
+ %r = sext i8 %val to i64
+ ret i64 %r
+ }
+
+ define i64 @test_sext_i16(i16 %val) {
+ %r = sext i16 %val to i64
+ ret i64 %r
+ }
+
+...
+---
+name: test_sext_i8
+# ALL-LABEL: name: test_sext_i8
+alignment: 4
+legalized: true
+regBankSelected: true
+# ALL: registers:
+# ALL-NEXT: - { id: 0, class: gr8 }
+# ALL-NEXT: - { id: 1, class: gr64 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+# ALL: %0 = COPY %dil
+# ALL-NEXT: %1 = MOVSX64rr8 %0
+# ALL-NEXT: %rax = COPY %1
+# ALL-NEXT: RET 0, implicit %rax
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi
+
+ %0(s8) = COPY %edi
+ %1(s64) = G_SEXT %0(s8)
+ %rax = COPY %1(s64)
+ RET 0, implicit %rax
+
+...
+---
+name: test_sext_i16
+# ALL-LABEL: name: test_sext_i16
+alignment: 4
+legalized: true
+regBankSelected: true
+# ALL: registers:
+# ALL-NEXT: - { id: 0, class: gr16 }
+# ALL-NEXT: - { id: 1, class: gr64 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+# ALL: %0 = COPY %di
+# ALL-NEXT: %1 = MOVSX64rr16 %0
+# ALL-NEXT: %rax = COPY %1
+# ALL-NEXT: RET 0, implicit %rax
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi
+
+ %0(s16) = COPY %edi
+ %1(s64) = G_SEXT %0(s16)
+ %rax = COPY %1(s64)
+ RET 0, implicit %rax
+
+...
diff --git a/test/CodeGen/X86/GlobalISel/select-ext.mir b/test/CodeGen/X86/GlobalISel/select-ext.mir
new file mode 100644
index 000000000000..63aeae89bd1a
--- /dev/null
+++ b/test/CodeGen/X86/GlobalISel/select-ext.mir
@@ -0,0 +1,129 @@
+# RUN: llc -mtriple=i386-linux-gnu -global-isel -run-pass=instruction-select %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X32
+# RUN: llc -mtriple=x86_64-linux-gnu -global-isel -run-pass=instruction-select %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=X64
+
+--- |
+ define i32 @test_zext_i8(i8 %val) {
+ %r = zext i8 %val to i32
+ ret i32 %r
+ }
+
+ define i32 @test_zext_i16(i16 %val) {
+ %r = zext i16 %val to i32
+ ret i32 %r
+ }
+
+ define i32 @test_sext_i8(i8 %val) {
+ %r = sext i8 %val to i32
+ ret i32 %r
+ }
+
+ define i32 @test_sext_i16(i16 %val) {
+ %r = sext i16 %val to i32
+ ret i32 %r
+ }
+
+...
+---
+name: test_zext_i8
+# ALL-LABEL: name: test_zext_i8
+alignment: 4
+legalized: true
+regBankSelected: true
+# ALL: registers:
+# ALL-NEXT: - { id: 0, class: gr8 }
+# ALL-NEXT: - { id: 1, class: gr32 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+# ALL: %0 = COPY %dil
+# ALL-NEXT: %1 = MOVZX32rr8 %0
+# ALL-NEXT: %eax = COPY %1
+# ALL-NEXT: RET 0, implicit %eax
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi
+
+ %0(s8) = COPY %edi
+ %1(s32) = G_ZEXT %0(s8)
+ %eax = COPY %1(s32)
+ RET 0, implicit %eax
+
+...
+---
+name: test_zext_i16
+# ALL-LABEL: name: test_zext_i16
+alignment: 4
+legalized: true
+regBankSelected: true
+# ALL: registers:
+# ALL-NEXT: - { id: 0, class: gr16 }
+# ALL-NEXT: - { id: 1, class: gr32 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+# ALL: %0 = COPY %di
+# ALL-NEXT: %1 = MOVZX32rr16 %0
+# ALL-NEXT: %eax = COPY %1
+# ALL-NEXT: RET 0, implicit %eax
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi
+
+ %0(s16) = COPY %edi
+ %1(s32) = G_ZEXT %0(s16)
+ %eax = COPY %1(s32)
+ RET 0, implicit %eax
+
+...
+---
+name: test_sext_i8
+# ALL-LABEL: name: test_sext_i8
+alignment: 4
+legalized: true
+regBankSelected: true
+# ALL: registers:
+# ALL-NEXT: - { id: 0, class: gr8 }
+# ALL-NEXT: - { id: 1, class: gr32 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+# ALL: %0 = COPY %dil
+# ALL-NEXT: %1 = MOVSX32rr8 %0
+# ALL-NEXT: %eax = COPY %1
+# ALL-NEXT: RET 0, implicit %eax
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi
+
+ %0(s8) = COPY %edi
+ %1(s32) = G_SEXT %0(s8)
+ %eax = COPY %1(s32)
+ RET 0, implicit %eax
+
+...
+---
+name: test_sext_i16
+# ALL-LABEL: name: test_sext_i16
+alignment: 4
+legalized: true
+regBankSelected: true
+# ALL: registers:
+# ALL-NEXT: - { id: 0, class: gr16 }
+# ALL-NEXT: - { id: 1, class: gr32 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+# ALL: %0 = COPY %di
+# ALL-NEXT: %1 = MOVSX32rr16 %0
+# ALL-NEXT: %eax = COPY %1
+# ALL-NEXT: RET 0, implicit %eax
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %edi
+
+ %0(s16) = COPY %edi
+ %1(s32) = G_SEXT %0(s16)
+ %eax = COPY %1(s32)
+ RET 0, implicit %eax
+
+...
diff --git a/test/CodeGen/X86/GlobalISel/select-inc.mir b/test/CodeGen/X86/GlobalISel/select-inc.mir
new file mode 100644
index 000000000000..7a77864091d3
--- /dev/null
+++ b/test/CodeGen/X86/GlobalISel/select-inc.mir
@@ -0,0 +1,37 @@
+# RUN: llc -mtriple=x86_64-linux-gnu -global-isel -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=ALL,INC
+# RUN: llc -mtriple=x86_64-linux-gnu -mattr=+slow-incdec -global-isel -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=ALL,ADD
+
+--- |
+ define i8 @test_add_i8(i8 %arg1) {
+ %ret = add i8 %arg1, 1
+ ret i8 %ret
+ }
+...
+
+---
+name: test_add_i8
+legalized: true
+regBankSelected: true
+# ALL: registers:
+# ALL-NEXT: - { id: 0, class: gr8 }
+# INC-NEXT: - { id: 1, class: gpr }
+# ADD-NEXT: - { id: 1, class: gr8 }
+# ALL-NEXT: - { id: 2, class: gr8 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+ - { id: 2, class: gpr }
+# ALL: %0 = COPY %al
+# INC-NEXT: %2 = INC8r %0
+# ADD-NEXT: %1 = MOV8ri 1
+# ADD-NEXT: %2 = ADD8rr %0, %1
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %al
+
+ %0(s8) = COPY %al
+ %1(s8) = G_CONSTANT i8 1
+ %2(s8) = G_ADD %0, %1
+ %al = COPY %2(s8)
+
+...
diff --git a/test/CodeGen/X86/GlobalISel/select-memop-x32.mir b/test/CodeGen/X86/GlobalISel/select-memop-x32.mir
new file mode 100644
index 000000000000..8e6a2771db6e
--- /dev/null
+++ b/test/CodeGen/X86/GlobalISel/select-memop-x32.mir
@@ -0,0 +1,310 @@
+# RUN: llc -mtriple=i386-linux-gnu -global-isel -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=ALL
+
+--- |
+ define i8 @test_load_i8(i8* %p1) {
+ %r = load i8, i8* %p1
+ ret i8 %r
+ }
+
+ define i16 @test_load_i16(i16* %p1) {
+ %r = load i16, i16* %p1
+ ret i16 %r
+ }
+
+ define i32 @test_load_i32(i32* %p1) {
+ %r = load i32, i32* %p1
+ ret i32 %r
+ }
+
+ define i8* @test_store_i8(i8 %val, i8* %p1) {
+ store i8 %val, i8* %p1
+ ret i8* %p1
+ }
+
+ define i16* @test_store_i16(i16 %val, i16* %p1) {
+ store i16 %val, i16* %p1
+ ret i16* %p1
+ }
+
+ define i32* @test_store_i32(i32 %val, i32* %p1) {
+ store i32 %val, i32* %p1
+ ret i32* %p1
+ }
+
+ define i32* @test_load_ptr(i32** %ptr1) {
+ %p = load i32*, i32** %ptr1
+ ret i32* %p
+ }
+
+ define void @test_store_ptr(i32** %ptr1, i32* %a) {
+ store i32* %a, i32** %ptr1
+ ret void
+ }
+
+...
+---
+name: test_load_i8
+# ALL-LABEL: name: test_load_i8
+alignment: 4
+legalized: true
+regBankSelected: true
+# ALL: registers:
+# ALL-NEXT: - { id: 0, class: gr32 }
+# ALL-NEXT: - { id: 1, class: gr32 }
+# ALL-NEXT: - { id: 2, class: gr8 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+ - { id: 2, class: gpr }
+fixedStack:
+ - { id: 0, offset: 0, size: 4, alignment: 16, isImmutable: true, isAliased: false }
+# ALL: %1 = LEA32r %fixed-stack.0, 1, _, 0, _
+# ALL-NEXT: %0 = MOV32rm %1, 1, _, 0, _ :: (invariant load 4 from %fixed-stack.0, align 0)
+# ALL-NEXT: %2 = MOV8rm %0, 1, _, 0, _ :: (load 1 from %ir.p1)
+# ALL-NEXT: %al = COPY %2
+# ALL-NEXT: RET 0, implicit %al
+body: |
+ bb.1 (%ir-block.0):
+ %1(p0) = G_FRAME_INDEX %fixed-stack.0
+ %0(p0) = G_LOAD %1(p0) :: (invariant load 4 from %fixed-stack.0, align 0)
+ %2(s8) = G_LOAD %0(p0) :: (load 1 from %ir.p1)
+ %al = COPY %2(s8)
+ RET 0, implicit %al
+
+...
+---
+name: test_load_i16
+# ALL-LABEL: name: test_load_i16
+alignment: 4
+legalized: true
+regBankSelected: true
+# ALL: registers:
+# ALL-NEXT: - { id: 0, class: gr32 }
+# ALL-NEXT: - { id: 1, class: gr32 }
+# ALL-NEXT: - { id: 2, class: gr16 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+ - { id: 2, class: gpr }
+fixedStack:
+ - { id: 0, offset: 0, size: 4, alignment: 16, isImmutable: true, isAliased: false }
+# ALL: %1 = LEA32r %fixed-stack.0, 1, _, 0, _
+# ALL-NEXT: %0 = MOV32rm %1, 1, _, 0, _ :: (invariant load 4 from %fixed-stack.0, align 0)
+# ALL-NEXT: %2 = MOV16rm %0, 1, _, 0, _ :: (load 2 from %ir.p1)
+# ALL-NEXT: %ax = COPY %2
+# ALL-NEXT: RET 0, implicit %ax
+body: |
+ bb.1 (%ir-block.0):
+ %1(p0) = G_FRAME_INDEX %fixed-stack.0
+ %0(p0) = G_LOAD %1(p0) :: (invariant load 4 from %fixed-stack.0, align 0)
+ %2(s16) = G_LOAD %0(p0) :: (load 2 from %ir.p1)
+ %ax = COPY %2(s16)
+ RET 0, implicit %ax
+
+...
+---
+name: test_load_i32
+# ALL-LABEL: name: test_load_i32
+alignment: 4
+legalized: true
+regBankSelected: true
+# ALL: registers:
+# ALL-NEXT: - { id: 0, class: gr32 }
+# ALL-NEXT: - { id: 1, class: gr32 }
+# ALL-NEXT: - { id: 2, class: gr32 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+ - { id: 2, class: gpr }
+fixedStack:
+ - { id: 0, offset: 0, size: 4, alignment: 16, isImmutable: true, isAliased: false }
+# ALL: %1 = LEA32r %fixed-stack.0, 1, _, 0, _
+# ALL-NEXT: %0 = MOV32rm %1, 1, _, 0, _ :: (invariant load 4 from %fixed-stack.0, align 0)
+# ALL-NEXT: %2 = MOV32rm %0, 1, _, 0, _ :: (load 4 from %ir.p1)
+# ALL-NEXT: %eax = COPY %2
+# ALL-NEXT: RET 0, implicit %eax
+body: |
+ bb.1 (%ir-block.0):
+ %1(p0) = G_FRAME_INDEX %fixed-stack.0
+ %0(p0) = G_LOAD %1(p0) :: (invariant load 4 from %fixed-stack.0, align 0)
+ %2(s32) = G_LOAD %0(p0) :: (load 4 from %ir.p1)
+ %eax = COPY %2(s32)
+ RET 0, implicit %eax
+
+...
+---
+name: test_store_i8
+# ALL-LABEL: name: test_store_i8
+alignment: 4
+legalized: true
+regBankSelected: true
+# ALL: registers:
+# ALL-NEXT: - { id: 0, class: gr8 }
+# ALL-NEXT: - { id: 1, class: gr32 }
+# ALL-NEXT: - { id: 2, class: gr32 }
+# ALL-NEXT: - { id: 3, class: gr32 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+ - { id: 2, class: gpr }
+ - { id: 3, class: gpr }
+fixedStack:
+ - { id: 0, offset: 4, size: 4, alignment: 4, isImmutable: true, isAliased: false }
+ - { id: 1, offset: 0, size: 1, alignment: 16, isImmutable: true, isAliased: false }
+# ALL: %2 = LEA32r %fixed-stack.0, 1, _, 0, _
+# ALL-NEXT: %0 = MOV8rm %2, 1, _, 0, _ :: (invariant load 1 from %fixed-stack.0, align 0)
+# ALL-NEXT: %3 = LEA32r %fixed-stack.1, 1, _, 0, _
+# ALL-NEXT: %1 = MOV32rm %3, 1, _, 0, _ :: (invariant load 4 from %fixed-stack.1, align 0)
+# ALL-NEXT: MOV8mr %1, 1, _, 0, _, %0 :: (store 1 into %ir.p1)
+# ALL-NEXT: %eax = COPY %1
+# ALL-NEXT: RET 0, implicit %eax
+body: |
+ bb.1 (%ir-block.0):
+ %2(p0) = G_FRAME_INDEX %fixed-stack.1
+ %0(s8) = G_LOAD %2(p0) :: (invariant load 1 from %fixed-stack.1, align 0)
+ %3(p0) = G_FRAME_INDEX %fixed-stack.0
+ %1(p0) = G_LOAD %3(p0) :: (invariant load 4 from %fixed-stack.0, align 0)
+ G_STORE %0(s8), %1(p0) :: (store 1 into %ir.p1)
+ %eax = COPY %1(p0)
+ RET 0, implicit %eax
+
+...
+---
+name: test_store_i16
+# ALL-LABEL: name: test_store_i16
+alignment: 4
+legalized: true
+regBankSelected: true
+# ALL: registers:
+# ALL-NEXT: - { id: 0, class: gr16 }
+# ALL-NEXT: - { id: 1, class: gr32 }
+# ALL-NEXT: - { id: 2, class: gr32 }
+# ALL-NEXT: - { id: 3, class: gr32 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+ - { id: 2, class: gpr }
+ - { id: 3, class: gpr }
+fixedStack:
+ - { id: 0, offset: 4, size: 4, alignment: 4, isImmutable: true, isAliased: false }
+ - { id: 1, offset: 0, size: 2, alignment: 16, isImmutable: true, isAliased: false }
+# ALL: %2 = LEA32r %fixed-stack.0, 1, _, 0, _
+# ALL-NEXT: %0 = MOV16rm %2, 1, _, 0, _ :: (invariant load 2 from %fixed-stack.0, align 0)
+# ALL-NEXT: %3 = LEA32r %fixed-stack.1, 1, _, 0, _
+# ALL-NEXT: %1 = MOV32rm %3, 1, _, 0, _ :: (invariant load 4 from %fixed-stack.1, align 0)
+# ALL-NEXT: MOV16mr %1, 1, _, 0, _, %0 :: (store 2 into %ir.p1)
+# ALL-NEXT: %eax = COPY %1
+# ALL-NEXT: RET 0, implicit %eax
+body: |
+ bb.1 (%ir-block.0):
+ %2(p0) = G_FRAME_INDEX %fixed-stack.1
+ %0(s16) = G_LOAD %2(p0) :: (invariant load 2 from %fixed-stack.1, align 0)
+ %3(p0) = G_FRAME_INDEX %fixed-stack.0
+ %1(p0) = G_LOAD %3(p0) :: (invariant load 4 from %fixed-stack.0, align 0)
+ G_STORE %0(s16), %1(p0) :: (store 2 into %ir.p1)
+ %eax = COPY %1(p0)
+ RET 0, implicit %eax
+
+...
+---
+name: test_store_i32
+# ALL-LABEL: name: test_store_i32
+alignment: 4
+legalized: true
+regBankSelected: true
+# ALL: registers:
+# ALL-NEXT: - { id: 0, class: gr32 }
+# ALL-NEXT: - { id: 1, class: gr32 }
+# ALL-NEXT: - { id: 2, class: gr32 }
+# ALL-NEXT: - { id: 3, class: gr32 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+ - { id: 2, class: gpr }
+ - { id: 3, class: gpr }
+fixedStack:
+ - { id: 0, offset: 4, size: 4, alignment: 4, isImmutable: true, isAliased: false }
+ - { id: 1, offset: 0, size: 4, alignment: 16, isImmutable: true, isAliased: false }
+# ALL: %2 = LEA32r %fixed-stack.0, 1, _, 0, _
+# ALL-NEXT: %0 = MOV32rm %2, 1, _, 0, _ :: (invariant load 4 from %fixed-stack.0, align 0)
+# ALL-NEXT: %3 = LEA32r %fixed-stack.1, 1, _, 0, _
+# ALL-NEXT: %1 = MOV32rm %3, 1, _, 0, _ :: (invariant load 4 from %fixed-stack.1, align 0)
+# ALL-NEXT: MOV32mr %1, 1, _, 0, _, %0 :: (store 4 into %ir.p1)
+# ALL-NEXT: %eax = COPY %1
+# ALL-NEXT: RET 0, implicit %eax
+body: |
+ bb.1 (%ir-block.0):
+ %2(p0) = G_FRAME_INDEX %fixed-stack.1
+ %0(s32) = G_LOAD %2(p0) :: (invariant load 4 from %fixed-stack.1, align 0)
+ %3(p0) = G_FRAME_INDEX %fixed-stack.0
+ %1(p0) = G_LOAD %3(p0) :: (invariant load 4 from %fixed-stack.0, align 0)
+ G_STORE %0(s32), %1(p0) :: (store 4 into %ir.p1)
+ %eax = COPY %1(p0)
+ RET 0, implicit %eax
+
+...
+---
+name: test_load_ptr
+# ALL-LABEL: name: test_load_ptr
+alignment: 4
+legalized: true
+regBankSelected: true
+# ALL: registers:
+# ALL-NEXT: - { id: 0, class: gr32 }
+# ALL-NEXT: - { id: 1, class: gr32 }
+# ALL-NEXT: - { id: 2, class: gr32 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+ - { id: 2, class: gpr }
+fixedStack:
+ - { id: 0, offset: 0, size: 4, alignment: 16, isImmutable: true, isAliased: false }
+# ALL: %1 = LEA32r %fixed-stack.0, 1, _, 0, _
+# ALL-NEXT: %0 = MOV32rm %1, 1, _, 0, _ :: (invariant load 4 from %fixed-stack.0, align 0)
+# ALL-NEXT: %2 = MOV32rm %0, 1, _, 0, _ :: (load 4 from %ir.ptr1)
+# ALL-NEXT: %eax = COPY %2
+# ALL-NEXT: RET 0, implicit %eax
+body: |
+ bb.1 (%ir-block.0):
+ %1(p0) = G_FRAME_INDEX %fixed-stack.0
+ %0(p0) = G_LOAD %1(p0) :: (invariant load 4 from %fixed-stack.0, align 0)
+ %2(p0) = G_LOAD %0(p0) :: (load 4 from %ir.ptr1)
+ %eax = COPY %2(p0)
+ RET 0, implicit %eax
+
+...
+---
+name: test_store_ptr
+# ALL-LABEL: name: test_store_ptr
+alignment: 4
+legalized: true
+regBankSelected: true
+# ALL: registers:
+# ALL-NEXT: - { id: 0, class: gr32 }
+# ALL-NEXT: - { id: 1, class: gr32 }
+# ALL-NEXT: - { id: 2, class: gr32 }
+# ALL-NEXT: - { id: 3, class: gr32 }
+registers:
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+ - { id: 2, class: gpr }
+ - { id: 3, class: gpr }
+fixedStack:
+ - { id: 0, offset: 4, size: 4, alignment: 4, isImmutable: true, isAliased: false }
+ - { id: 1, offset: 0, size: 4, alignment: 16, isImmutable: true, isAliased: false }
+# ALL: %2 = LEA32r %fixed-stack.0, 1, _, 0, _
+# ALL-NEXT: %0 = MOV32rm %2, 1, _, 0, _ :: (invariant load 4 from %fixed-stack.0, align 0)
+# ALL-NEXT: %3 = LEA32r %fixed-stack.1, 1, _, 0, _
+# ALL-NEXT: %1 = MOV32rm %3, 1, _, 0, _ :: (invariant load 4 from %fixed-stack.1, align 0)
+# ALL-NEXT: MOV32mr %0, 1, _, 0, _, %1 :: (store 4 into %ir.ptr1)
+# ALL-NEXT: RET 0
+body: |
+ bb.1 (%ir-block.0):
+ %2(p0) = G_FRAME_INDEX %fixed-stack.1
+ %0(p0) = G_LOAD %2(p0) :: (invariant load 4 from %fixed-stack.1, align 0)
+ %3(p0) = G_FRAME_INDEX %fixed-stack.0
+ %1(p0) = G_LOAD %3(p0) :: (invariant load 4 from %fixed-stack.0, align 0)
+ G_STORE %1(p0), %0(p0) :: (store 4 into %ir.ptr1)
+ RET 0
+
+...
diff --git a/test/CodeGen/X86/GlobalISel/select-memop.mir b/test/CodeGen/X86/GlobalISel/select-memop.mir
index 943c9aceb4d1..817dc3cc9764 100644
--- a/test/CodeGen/X86/GlobalISel/select-memop.mir
+++ b/test/CodeGen/X86/GlobalISel/select-memop.mir
@@ -95,6 +95,15 @@
ret <4 x i32>* %p1
}
+ define i32* @test_load_ptr(i32** %ptr1) {
+ %p = load i32*, i32** %ptr1
+ ret i32* %p
+ }
+
+ define void @test_store_ptr(i32** %ptr1, i32* %a) {
+ store i32* %a, i32** %ptr1
+ ret void
+ }
...
---
# ALL-LABEL: name: test_load_i8
@@ -580,3 +589,49 @@ body: |
RET 0, implicit %rax
...
+---
+# ALL-LABEL: name: test_load_ptr
+name: test_load_ptr
+alignment: 4
+legalized: true
+regBankSelected: true
+selected: false
+registers:
+# ALL: - { id: 0, class: gr64 }
+# ALL: - { id: 1, class: gr64 }
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+# ALL: %1 = MOV64rm %0, 1, _, 0, _ :: (load 8 from %ir.ptr1)
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %rdi
+
+ %0(p0) = COPY %rdi
+ %1(p0) = G_LOAD %0(p0) :: (load 8 from %ir.ptr1)
+ %rax = COPY %1(p0)
+ RET 0, implicit %rax
+
+...
+---
+# ALL-LABEL: name: test_store_ptr
+name: test_store_ptr
+alignment: 4
+legalized: true
+regBankSelected: true
+selected: false
+registers:
+# ALL: - { id: 0, class: gr64 }
+# ALL: - { id: 1, class: gr64 }
+ - { id: 0, class: gpr }
+ - { id: 1, class: gpr }
+# ALL: MOV64mr %0, 1, _, 0, _, %1 :: (store 8 into %ir.ptr1)
+body: |
+ bb.1 (%ir-block.0):
+ liveins: %rdi, %rsi
+
+ %0(p0) = COPY %rdi
+ %1(p0) = COPY %rsi
+ G_STORE %1(p0), %0(p0) :: (store 8 into %ir.ptr1)
+ RET 0
+
+...
diff --git a/test/CodeGen/X86/adde-carry.ll b/test/CodeGen/X86/addcarry.ll
index 9483a6b492c5..6fc07cd84dea 100644
--- a/test/CodeGen/X86/adde-carry.ll
+++ b/test/CodeGen/X86/addcarry.ll
@@ -47,7 +47,7 @@ define void @c(i16* nocapture %r, i64 %a, i64 %b, i16 %c) nounwind {
; CHECK-LABEL: c:
; CHECK: # BB#0: # %entry
; CHECK-NEXT: addq %rdx, %rsi
-; CHECK-NEXT: adcl $0, %ecx
+; CHECK-NEXT: adcw $0, %cx
; CHECK-NEXT: movw %cx, (%rdi)
; CHECK-NEXT: retq
entry:
@@ -66,7 +66,7 @@ define void @d(i8* nocapture %r, i64 %a, i64 %b, i8 %c) nounwind {
; CHECK-LABEL: d:
; CHECK: # BB#0: # %entry
; CHECK-NEXT: addq %rdx, %rsi
-; CHECK-NEXT: adcl $0, %ecx
+; CHECK-NEXT: adcb $0, %cl
; CHECK-NEXT: movb %cl, (%rdi)
; CHECK-NEXT: retq
entry:
@@ -86,25 +86,21 @@ entry:
define %scalar @pr31719(%scalar* nocapture readonly %this, %scalar %arg.b) {
; CHECK-LABEL: pr31719:
; CHECK: # BB#0: # %entry
-; CHECK-NEXT: addq (%rsi), %rdx
+; CHECK-NEXT: addq 8(%rsi), %rcx
; CHECK-NEXT: sbbq %r10, %r10
; CHECK-NEXT: andl $1, %r10d
-; CHECK-NEXT: addq 8(%rsi), %rcx
-; CHECK-NEXT: sbbq %r11, %r11
-; CHECK-NEXT: andl $1, %r11d
-; CHECK-NEXT: addq %r10, %rcx
-; CHECK-NEXT: adcq $0, %r11
; CHECK-NEXT: addq 16(%rsi), %r8
; CHECK-NEXT: sbbq %rax, %rax
; CHECK-NEXT: andl $1, %eax
-; CHECK-NEXT: addq %r11, %r8
-; CHECK-NEXT: adcq $0, %rax
; CHECK-NEXT: addq 24(%rsi), %r9
-; CHECK-NEXT: addq %rax, %r9
+; CHECK-NEXT: addq (%rsi), %rdx
+; CHECK-NEXT: adcq $0, %rcx
+; CHECK-NEXT: adcq %r8, %r10
+; CHECK-NEXT: adcq %r9, %rax
; CHECK-NEXT: movq %rdx, (%rdi)
; CHECK-NEXT: movq %rcx, 8(%rdi)
-; CHECK-NEXT: movq %r8, 16(%rdi)
-; CHECK-NEXT: movq %r9, 24(%rdi)
+; CHECK-NEXT: movq %r10, 16(%rdi)
+; CHECK-NEXT: movq %rax, 24(%rdi)
; CHECK-NEXT: movq %rdi, %rax
; CHECK-NEXT: retq
entry:
@@ -159,12 +155,10 @@ define void @muladd(%accumulator* nocapture %this, i64 %arg.a, i64 %arg.b) {
; CHECK-NEXT: movq %rdx, %rax
; CHECK-NEXT: mulq %rsi
; CHECK-NEXT: addq (%rdi), %rax
-; CHECK-NEXT: adcq $0, %rdx
; CHECK-NEXT: movq %rax, (%rdi)
-; CHECK-NEXT: addq 8(%rdi), %rdx
+; CHECK-NEXT: adcq 8(%rdi), %rdx
; CHECK-NEXT: movq %rdx, 8(%rdi)
-; CHECK-NEXT: sbbl %eax, %eax
-; CHECK-NEXT: subl %eax, 16(%rdi)
+; CHECK-NEXT: adcl $0, 16(%rdi)
; CHECK-NEXT: retq
entry:
%0 = zext i64 %arg.a to i128
@@ -192,3 +186,21 @@ entry:
store i32 %19, i32* %15, align 4
ret void
}
+
+define i64 @shiftadd(i64 %a, i64 %b, i64 %c, i64 %d) {
+; CHECK-LABEL: shiftadd:
+; CHECK: # BB#0: # %entry
+; CHECK-NEXT: leaq (%rdx,%rcx), %rax
+; CHECK-NEXT: addq %rsi, %rdi
+; CHECK-NEXT: adcq $0, %rax
+; CHECK-NEXT: retq
+entry:
+ %0 = zext i64 %a to i128
+ %1 = zext i64 %b to i128
+ %2 = add i128 %0, %1
+ %3 = lshr i128 %2, 64
+ %4 = trunc i128 %3 to i64
+ %5 = add i64 %c, %d
+ %6 = add i64 %4, %5
+ ret i64 %6
+}
diff --git a/test/CodeGen/X86/all-ones-vector.ll b/test/CodeGen/X86/all-ones-vector.ll
index 8e050ee2404c..35f488ea448c 100644
--- a/test/CodeGen/X86/all-ones-vector.ll
+++ b/test/CodeGen/X86/all-ones-vector.ll
@@ -10,368 +10,442 @@
; RUN: llc < %s -mtriple=x86_64-unknown -mcpu=knl | FileCheck %s --check-prefix=X64-AVX --check-prefix=X64-AVX256 --check-prefix=X64-AVX512 --check-prefix=X64-KNL
; RUN: llc < %s -mtriple=x86_64-unknown -mcpu=skx | FileCheck %s --check-prefix=X64-AVX --check-prefix=X64-AVX256 --check-prefix=X64-AVX512 --check-prefix=X64-SKX
-define <16 x i8> @coo() nounwind {
-; X32-SSE-LABEL: coo:
+define <16 x i8> @allones_v16i8() nounwind {
+; X32-SSE-LABEL: allones_v16i8:
; X32-SSE: # BB#0:
; X32-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X32-SSE-NEXT: retl
;
-; X32-AVX-LABEL: coo:
+; X32-AVX-LABEL: allones_v16i8:
; X32-AVX: # BB#0:
; X32-AVX-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X32-AVX-NEXT: retl
;
-; X64-SSE-LABEL: coo:
+; X64-SSE-LABEL: allones_v16i8:
; X64-SSE: # BB#0:
; X64-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X64-SSE-NEXT: retq
;
-; X64-AVX-LABEL: coo:
+; X64-AVX-LABEL: allones_v16i8:
; X64-AVX: # BB#0:
; X64-AVX-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X64-AVX-NEXT: retq
ret <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
}
-define <8 x i16> @soo() nounwind {
-; X32-SSE-LABEL: soo:
+define <8 x i16> @allones_v8i16() nounwind {
+; X32-SSE-LABEL: allones_v8i16:
; X32-SSE: # BB#0:
; X32-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X32-SSE-NEXT: retl
;
-; X32-AVX-LABEL: soo:
+; X32-AVX-LABEL: allones_v8i16:
; X32-AVX: # BB#0:
; X32-AVX-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X32-AVX-NEXT: retl
;
-; X64-SSE-LABEL: soo:
+; X64-SSE-LABEL: allones_v8i16:
; X64-SSE: # BB#0:
; X64-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X64-SSE-NEXT: retq
;
-; X64-AVX-LABEL: soo:
+; X64-AVX-LABEL: allones_v8i16:
; X64-AVX: # BB#0:
; X64-AVX-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X64-AVX-NEXT: retq
ret <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
}
-define <4 x i32> @ioo() nounwind {
-; X32-SSE-LABEL: ioo:
+define <4 x i32> @allones_v4i32() nounwind {
+; X32-SSE-LABEL: allones_v4i32:
; X32-SSE: # BB#0:
; X32-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X32-SSE-NEXT: retl
;
-; X32-AVX-LABEL: ioo:
+; X32-AVX-LABEL: allones_v4i32:
; X32-AVX: # BB#0:
; X32-AVX-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X32-AVX-NEXT: retl
;
-; X64-SSE-LABEL: ioo:
+; X64-SSE-LABEL: allones_v4i32:
; X64-SSE: # BB#0:
; X64-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X64-SSE-NEXT: retq
;
-; X64-AVX-LABEL: ioo:
+; X64-AVX-LABEL: allones_v4i32:
; X64-AVX: # BB#0:
; X64-AVX-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X64-AVX-NEXT: retq
ret <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>
}
-define <2 x i64> @loo() nounwind {
-; X32-SSE-LABEL: loo:
+define <2 x i64> @allones_v2i64() nounwind {
+; X32-SSE-LABEL: allones_v2i64:
; X32-SSE: # BB#0:
; X32-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X32-SSE-NEXT: retl
;
-; X32-AVX-LABEL: loo:
+; X32-AVX-LABEL: allones_v2i64:
; X32-AVX: # BB#0:
; X32-AVX-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X32-AVX-NEXT: retl
;
-; X64-SSE-LABEL: loo:
+; X64-SSE-LABEL: allones_v2i64:
; X64-SSE: # BB#0:
; X64-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X64-SSE-NEXT: retq
;
-; X64-AVX-LABEL: loo:
+; X64-AVX-LABEL: allones_v2i64:
; X64-AVX: # BB#0:
; X64-AVX-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X64-AVX-NEXT: retq
ret <2 x i64> <i64 -1, i64 -1>
}
-define <2 x double> @doo() nounwind {
-; X32-SSE-LABEL: doo:
+define <2 x double> @allones_v2f64() nounwind {
+; X32-SSE-LABEL: allones_v2f64:
; X32-SSE: # BB#0:
; X32-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X32-SSE-NEXT: retl
;
-; X32-AVX-LABEL: doo:
+; X32-AVX-LABEL: allones_v2f64:
; X32-AVX: # BB#0:
; X32-AVX-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X32-AVX-NEXT: retl
;
-; X64-SSE-LABEL: doo:
+; X64-SSE-LABEL: allones_v2f64:
; X64-SSE: # BB#0:
; X64-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X64-SSE-NEXT: retq
;
-; X64-AVX-LABEL: doo:
+; X64-AVX-LABEL: allones_v2f64:
; X64-AVX: # BB#0:
; X64-AVX-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X64-AVX-NEXT: retq
ret <2 x double> <double 0xffffffffffffffff, double 0xffffffffffffffff>
}
-define <4 x float> @foo() nounwind {
-; X32-SSE-LABEL: foo:
+define <4 x float> @allones_v4f32() nounwind {
+; X32-SSE-LABEL: allones_v4f32:
; X32-SSE: # BB#0:
; X32-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X32-SSE-NEXT: retl
;
-; X32-AVX-LABEL: foo:
+; X32-AVX-LABEL: allones_v4f32:
; X32-AVX: # BB#0:
; X32-AVX-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X32-AVX-NEXT: retl
;
-; X64-SSE-LABEL: foo:
+; X64-SSE-LABEL: allones_v4f32:
; X64-SSE: # BB#0:
; X64-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X64-SSE-NEXT: retq
;
-; X64-AVX-LABEL: foo:
+; X64-AVX-LABEL: allones_v4f32:
; X64-AVX: # BB#0:
; X64-AVX-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X64-AVX-NEXT: retq
ret <4 x float> <float 0xffffffffe0000000, float 0xffffffffe0000000, float 0xffffffffe0000000, float 0xffffffffe0000000>
}
-define <32 x i8> @coo256() nounwind {
-; X32-SSE-LABEL: coo256:
+define <32 x i8> @allones_v32i8() nounwind {
+; X32-SSE-LABEL: allones_v32i8:
; X32-SSE: # BB#0:
; X32-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X32-SSE-NEXT: pcmpeqd %xmm1, %xmm1
; X32-SSE-NEXT: retl
;
-; X32-AVX1-LABEL: coo256:
+; X32-AVX1-LABEL: allones_v32i8:
; X32-AVX1: # BB#0:
; X32-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; X32-AVX1-NEXT: retl
;
-; X32-AVX256-LABEL: coo256:
+; X32-AVX256-LABEL: allones_v32i8:
; X32-AVX256: # BB#0:
; X32-AVX256-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X32-AVX256-NEXT: retl
;
-; X64-SSE-LABEL: coo256:
+; X64-SSE-LABEL: allones_v32i8:
; X64-SSE: # BB#0:
; X64-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X64-SSE-NEXT: pcmpeqd %xmm1, %xmm1
; X64-SSE-NEXT: retq
;
-; X64-AVX1-LABEL: coo256:
+; X64-AVX1-LABEL: allones_v32i8:
; X64-AVX1: # BB#0:
; X64-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X64-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; X64-AVX1-NEXT: retq
;
-; X64-AVX256-LABEL: coo256:
+; X64-AVX256-LABEL: allones_v32i8:
; X64-AVX256: # BB#0:
; X64-AVX256-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X64-AVX256-NEXT: retq
ret <32 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
}
-define <16 x i16> @soo256() nounwind {
-; X32-SSE-LABEL: soo256:
+define <16 x i16> @allones_v16i16() nounwind {
+; X32-SSE-LABEL: allones_v16i16:
; X32-SSE: # BB#0:
; X32-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X32-SSE-NEXT: pcmpeqd %xmm1, %xmm1
; X32-SSE-NEXT: retl
;
-; X32-AVX1-LABEL: soo256:
+; X32-AVX1-LABEL: allones_v16i16:
; X32-AVX1: # BB#0:
; X32-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; X32-AVX1-NEXT: retl
;
-; X32-AVX256-LABEL: soo256:
+; X32-AVX256-LABEL: allones_v16i16:
; X32-AVX256: # BB#0:
; X32-AVX256-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X32-AVX256-NEXT: retl
;
-; X64-SSE-LABEL: soo256:
+; X64-SSE-LABEL: allones_v16i16:
; X64-SSE: # BB#0:
; X64-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X64-SSE-NEXT: pcmpeqd %xmm1, %xmm1
; X64-SSE-NEXT: retq
;
-; X64-AVX1-LABEL: soo256:
+; X64-AVX1-LABEL: allones_v16i16:
; X64-AVX1: # BB#0:
; X64-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X64-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; X64-AVX1-NEXT: retq
;
-; X64-AVX256-LABEL: soo256:
+; X64-AVX256-LABEL: allones_v16i16:
; X64-AVX256: # BB#0:
; X64-AVX256-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X64-AVX256-NEXT: retq
ret <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
}
-define <8 x i32> @ioo256() nounwind {
-; X32-SSE-LABEL: ioo256:
+define <8 x i32> @allones_v8i32() nounwind {
+; X32-SSE-LABEL: allones_v8i32:
; X32-SSE: # BB#0:
; X32-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X32-SSE-NEXT: pcmpeqd %xmm1, %xmm1
; X32-SSE-NEXT: retl
;
-; X32-AVX1-LABEL: ioo256:
+; X32-AVX1-LABEL: allones_v8i32:
; X32-AVX1: # BB#0:
; X32-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; X32-AVX1-NEXT: retl
;
-; X32-AVX256-LABEL: ioo256:
+; X32-AVX256-LABEL: allones_v8i32:
; X32-AVX256: # BB#0:
; X32-AVX256-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X32-AVX256-NEXT: retl
;
-; X64-SSE-LABEL: ioo256:
+; X64-SSE-LABEL: allones_v8i32:
; X64-SSE: # BB#0:
; X64-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X64-SSE-NEXT: pcmpeqd %xmm1, %xmm1
; X64-SSE-NEXT: retq
;
-; X64-AVX1-LABEL: ioo256:
+; X64-AVX1-LABEL: allones_v8i32:
; X64-AVX1: # BB#0:
; X64-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X64-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; X64-AVX1-NEXT: retq
;
-; X64-AVX256-LABEL: ioo256:
+; X64-AVX256-LABEL: allones_v8i32:
; X64-AVX256: # BB#0:
; X64-AVX256-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X64-AVX256-NEXT: retq
ret <8 x i32> <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
}
-define <4 x i64> @loo256() nounwind {
-; X32-SSE-LABEL: loo256:
+define <4 x i64> @allones_v4i64() nounwind {
+; X32-SSE-LABEL: allones_v4i64:
; X32-SSE: # BB#0:
; X32-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X32-SSE-NEXT: pcmpeqd %xmm1, %xmm1
; X32-SSE-NEXT: retl
;
-; X32-AVX1-LABEL: loo256:
+; X32-AVX1-LABEL: allones_v4i64:
; X32-AVX1: # BB#0:
; X32-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; X32-AVX1-NEXT: retl
;
-; X32-AVX256-LABEL: loo256:
+; X32-AVX256-LABEL: allones_v4i64:
; X32-AVX256: # BB#0:
; X32-AVX256-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X32-AVX256-NEXT: retl
;
-; X64-SSE-LABEL: loo256:
+; X64-SSE-LABEL: allones_v4i64:
; X64-SSE: # BB#0:
; X64-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X64-SSE-NEXT: pcmpeqd %xmm1, %xmm1
; X64-SSE-NEXT: retq
;
-; X64-AVX1-LABEL: loo256:
+; X64-AVX1-LABEL: allones_v4i64:
; X64-AVX1: # BB#0:
; X64-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X64-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; X64-AVX1-NEXT: retq
;
-; X64-AVX256-LABEL: loo256:
+; X64-AVX256-LABEL: allones_v4i64:
; X64-AVX256: # BB#0:
; X64-AVX256-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X64-AVX256-NEXT: retq
ret <4 x i64> <i64 -1, i64 -1, i64 -1, i64 -1>
}
-define <4 x double> @doo256() nounwind {
-; X32-SSE-LABEL: doo256:
+define <4 x double> @allones_v4f64() nounwind {
+; X32-SSE-LABEL: allones_v4f64:
; X32-SSE: # BB#0:
; X32-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X32-SSE-NEXT: pcmpeqd %xmm1, %xmm1
; X32-SSE-NEXT: retl
;
-; X32-AVX1-LABEL: doo256:
+; X32-AVX1-LABEL: allones_v4f64:
; X32-AVX1: # BB#0:
; X32-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; X32-AVX1-NEXT: retl
;
-; X32-AVX256-LABEL: doo256:
+; X32-AVX256-LABEL: allones_v4f64:
; X32-AVX256: # BB#0:
; X32-AVX256-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X32-AVX256-NEXT: retl
;
-; X64-SSE-LABEL: doo256:
+; X64-SSE-LABEL: allones_v4f64:
; X64-SSE: # BB#0:
; X64-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X64-SSE-NEXT: pcmpeqd %xmm1, %xmm1
; X64-SSE-NEXT: retq
;
-; X64-AVX1-LABEL: doo256:
+; X64-AVX1-LABEL: allones_v4f64:
; X64-AVX1: # BB#0:
; X64-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X64-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; X64-AVX1-NEXT: retq
;
-; X64-AVX256-LABEL: doo256:
+; X64-AVX256-LABEL: allones_v4f64:
; X64-AVX256: # BB#0:
; X64-AVX256-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X64-AVX256-NEXT: retq
ret <4 x double> <double 0xffffffffffffffff, double 0xffffffffffffffff, double 0xffffffffffffffff, double 0xffffffffffffffff>
}
-define <8 x float> @foo256() nounwind {
-; X32-SSE-LABEL: foo256:
+define <4 x double> @allones_v4f64_optsize() nounwind optsize {
+; X32-SSE-LABEL: allones_v4f64_optsize:
; X32-SSE: # BB#0:
; X32-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X32-SSE-NEXT: pcmpeqd %xmm1, %xmm1
; X32-SSE-NEXT: retl
;
-; X32-AVX1-LABEL: foo256:
+; X32-AVX1-LABEL: allones_v4f64_optsize:
; X32-AVX1: # BB#0:
; X32-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; X32-AVX1-NEXT: retl
;
-; X32-AVX256-LABEL: foo256:
+; X32-AVX256-LABEL: allones_v4f64_optsize:
; X32-AVX256: # BB#0:
; X32-AVX256-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X32-AVX256-NEXT: retl
;
-; X64-SSE-LABEL: foo256:
+; X64-SSE-LABEL: allones_v4f64_optsize:
; X64-SSE: # BB#0:
; X64-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X64-SSE-NEXT: pcmpeqd %xmm1, %xmm1
; X64-SSE-NEXT: retq
;
-; X64-AVX1-LABEL: foo256:
+; X64-AVX1-LABEL: allones_v4f64_optsize:
; X64-AVX1: # BB#0:
; X64-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X64-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; X64-AVX1-NEXT: retq
;
-; X64-AVX256-LABEL: foo256:
+; X64-AVX256-LABEL: allones_v4f64_optsize:
+; X64-AVX256: # BB#0:
+; X64-AVX256-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
+; X64-AVX256-NEXT: retq
+ ret <4 x double> <double 0xffffffffffffffff, double 0xffffffffffffffff, double 0xffffffffffffffff, double 0xffffffffffffffff>
+}
+
+define <8 x float> @allones_v8f32() nounwind {
+; X32-SSE-LABEL: allones_v8f32:
+; X32-SSE: # BB#0:
+; X32-SSE-NEXT: pcmpeqd %xmm0, %xmm0
+; X32-SSE-NEXT: pcmpeqd %xmm1, %xmm1
+; X32-SSE-NEXT: retl
+;
+; X32-AVX1-LABEL: allones_v8f32:
+; X32-AVX1: # BB#0:
+; X32-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
+; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
+; X32-AVX1-NEXT: retl
+;
+; X32-AVX256-LABEL: allones_v8f32:
+; X32-AVX256: # BB#0:
+; X32-AVX256-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
+; X32-AVX256-NEXT: retl
+;
+; X64-SSE-LABEL: allones_v8f32:
+; X64-SSE: # BB#0:
+; X64-SSE-NEXT: pcmpeqd %xmm0, %xmm0
+; X64-SSE-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE-NEXT: retq
+;
+; X64-AVX1-LABEL: allones_v8f32:
+; X64-AVX1: # BB#0:
+; X64-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
+; X64-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
+; X64-AVX1-NEXT: retq
+;
+; X64-AVX256-LABEL: allones_v8f32:
+; X64-AVX256: # BB#0:
+; X64-AVX256-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
+; X64-AVX256-NEXT: retq
+ ret <8 x float> <float 0xffffffffe0000000, float 0xffffffffe0000000, float 0xffffffffe0000000, float 0xffffffffe0000000, float 0xffffffffe0000000, float 0xffffffffe0000000, float 0xffffffffe0000000, float 0xffffffffe0000000>
+}
+
+define <8 x float> @allones_v8f32_optsize() nounwind optsize {
+; X32-SSE-LABEL: allones_v8f32_optsize:
+; X32-SSE: # BB#0:
+; X32-SSE-NEXT: pcmpeqd %xmm0, %xmm0
+; X32-SSE-NEXT: pcmpeqd %xmm1, %xmm1
+; X32-SSE-NEXT: retl
+;
+; X32-AVX1-LABEL: allones_v8f32_optsize:
+; X32-AVX1: # BB#0:
+; X32-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
+; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
+; X32-AVX1-NEXT: retl
+;
+; X32-AVX256-LABEL: allones_v8f32_optsize:
+; X32-AVX256: # BB#0:
+; X32-AVX256-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
+; X32-AVX256-NEXT: retl
+;
+; X64-SSE-LABEL: allones_v8f32_optsize:
+; X64-SSE: # BB#0:
+; X64-SSE-NEXT: pcmpeqd %xmm0, %xmm0
+; X64-SSE-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE-NEXT: retq
+;
+; X64-AVX1-LABEL: allones_v8f32_optsize:
+; X64-AVX1: # BB#0:
+; X64-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
+; X64-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
+; X64-AVX1-NEXT: retq
+;
+; X64-AVX256-LABEL: allones_v8f32_optsize:
; X64-AVX256: # BB#0:
; X64-AVX256-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X64-AVX256-NEXT: retq
ret <8 x float> <float 0xffffffffe0000000, float 0xffffffffe0000000, float 0xffffffffe0000000, float 0xffffffffe0000000, float 0xffffffffe0000000, float 0xffffffffe0000000, float 0xffffffffe0000000, float 0xffffffffe0000000>
}
-define <64 x i8> @coo512() nounwind {
-; X32-SSE-LABEL: coo512:
+define <64 x i8> @allones_v64i8() nounwind {
+; X32-SSE-LABEL: allones_v64i8:
; X32-SSE: # BB#0:
; X32-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X32-SSE-NEXT: pcmpeqd %xmm1, %xmm1
@@ -379,31 +453,31 @@ define <64 x i8> @coo512() nounwind {
; X32-SSE-NEXT: pcmpeqd %xmm3, %xmm3
; X32-SSE-NEXT: retl
;
-; X32-AVX1-LABEL: coo512:
+; X32-AVX1-LABEL: allones_v64i8:
; X32-AVX1: # BB#0:
; X32-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; X32-AVX1-NEXT: vmovaps %ymm0, %ymm1
; X32-AVX1-NEXT: retl
;
-; X32-AVX2-LABEL: coo512:
+; X32-AVX2-LABEL: allones_v64i8:
; X32-AVX2: # BB#0:
; X32-AVX2-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X32-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
; X32-AVX2-NEXT: retl
;
-; X32-KNL-LABEL: coo512:
+; X32-KNL-LABEL: allones_v64i8:
; X32-KNL: # BB#0:
; X32-KNL-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X32-KNL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
; X32-KNL-NEXT: retl
;
-; X32-SKX-LABEL: coo512:
+; X32-SKX-LABEL: allones_v64i8:
; X32-SKX: # BB#0:
; X32-SKX-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0
; X32-SKX-NEXT: retl
;
-; X64-SSE-LABEL: coo512:
+; X64-SSE-LABEL: allones_v64i8:
; X64-SSE: # BB#0:
; X64-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X64-SSE-NEXT: pcmpeqd %xmm1, %xmm1
@@ -411,34 +485,34 @@ define <64 x i8> @coo512() nounwind {
; X64-SSE-NEXT: pcmpeqd %xmm3, %xmm3
; X64-SSE-NEXT: retq
;
-; X64-AVX1-LABEL: coo512:
+; X64-AVX1-LABEL: allones_v64i8:
; X64-AVX1: # BB#0:
; X64-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X64-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; X64-AVX1-NEXT: vmovaps %ymm0, %ymm1
; X64-AVX1-NEXT: retq
;
-; X64-AVX2-LABEL: coo512:
+; X64-AVX2-LABEL: allones_v64i8:
; X64-AVX2: # BB#0:
; X64-AVX2-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X64-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
; X64-AVX2-NEXT: retq
;
-; X64-KNL-LABEL: coo512:
+; X64-KNL-LABEL: allones_v64i8:
; X64-KNL: # BB#0:
; X64-KNL-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X64-KNL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
; X64-KNL-NEXT: retq
;
-; X64-SKX-LABEL: coo512:
+; X64-SKX-LABEL: allones_v64i8:
; X64-SKX: # BB#0:
; X64-SKX-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0
; X64-SKX-NEXT: retq
ret <64 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
}
-define <32 x i16> @soo512() nounwind {
-; X32-SSE-LABEL: soo512:
+define <32 x i16> @allones_v32i16() nounwind {
+; X32-SSE-LABEL: allones_v32i16:
; X32-SSE: # BB#0:
; X32-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X32-SSE-NEXT: pcmpeqd %xmm1, %xmm1
@@ -446,31 +520,31 @@ define <32 x i16> @soo512() nounwind {
; X32-SSE-NEXT: pcmpeqd %xmm3, %xmm3
; X32-SSE-NEXT: retl
;
-; X32-AVX1-LABEL: soo512:
+; X32-AVX1-LABEL: allones_v32i16:
; X32-AVX1: # BB#0:
; X32-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; X32-AVX1-NEXT: vmovaps %ymm0, %ymm1
; X32-AVX1-NEXT: retl
;
-; X32-AVX2-LABEL: soo512:
+; X32-AVX2-LABEL: allones_v32i16:
; X32-AVX2: # BB#0:
; X32-AVX2-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X32-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
; X32-AVX2-NEXT: retl
;
-; X32-KNL-LABEL: soo512:
+; X32-KNL-LABEL: allones_v32i16:
; X32-KNL: # BB#0:
; X32-KNL-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X32-KNL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
; X32-KNL-NEXT: retl
;
-; X32-SKX-LABEL: soo512:
+; X32-SKX-LABEL: allones_v32i16:
; X32-SKX: # BB#0:
; X32-SKX-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0
; X32-SKX-NEXT: retl
;
-; X64-SSE-LABEL: soo512:
+; X64-SSE-LABEL: allones_v32i16:
; X64-SSE: # BB#0:
; X64-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X64-SSE-NEXT: pcmpeqd %xmm1, %xmm1
@@ -478,34 +552,34 @@ define <32 x i16> @soo512() nounwind {
; X64-SSE-NEXT: pcmpeqd %xmm3, %xmm3
; X64-SSE-NEXT: retq
;
-; X64-AVX1-LABEL: soo512:
+; X64-AVX1-LABEL: allones_v32i16:
; X64-AVX1: # BB#0:
; X64-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X64-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; X64-AVX1-NEXT: vmovaps %ymm0, %ymm1
; X64-AVX1-NEXT: retq
;
-; X64-AVX2-LABEL: soo512:
+; X64-AVX2-LABEL: allones_v32i16:
; X64-AVX2: # BB#0:
; X64-AVX2-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X64-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
; X64-AVX2-NEXT: retq
;
-; X64-KNL-LABEL: soo512:
+; X64-KNL-LABEL: allones_v32i16:
; X64-KNL: # BB#0:
; X64-KNL-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X64-KNL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
; X64-KNL-NEXT: retq
;
-; X64-SKX-LABEL: soo512:
+; X64-SKX-LABEL: allones_v32i16:
; X64-SKX: # BB#0:
; X64-SKX-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0
; X64-SKX-NEXT: retq
ret <32 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
}
-define <16 x i32> @ioo512() nounwind {
-; X32-SSE-LABEL: ioo512:
+define <16 x i32> @allones_v16i32() nounwind {
+; X32-SSE-LABEL: allones_v16i32:
; X32-SSE: # BB#0:
; X32-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X32-SSE-NEXT: pcmpeqd %xmm1, %xmm1
@@ -513,25 +587,25 @@ define <16 x i32> @ioo512() nounwind {
; X32-SSE-NEXT: pcmpeqd %xmm3, %xmm3
; X32-SSE-NEXT: retl
;
-; X32-AVX1-LABEL: ioo512:
+; X32-AVX1-LABEL: allones_v16i32:
; X32-AVX1: # BB#0:
; X32-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; X32-AVX1-NEXT: vmovaps %ymm0, %ymm1
; X32-AVX1-NEXT: retl
;
-; X32-AVX2-LABEL: ioo512:
+; X32-AVX2-LABEL: allones_v16i32:
; X32-AVX2: # BB#0:
; X32-AVX2-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X32-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
; X32-AVX2-NEXT: retl
;
-; X32-AVX512-LABEL: ioo512:
+; X32-AVX512-LABEL: allones_v16i32:
; X32-AVX512: # BB#0:
; X32-AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0
; X32-AVX512-NEXT: retl
;
-; X64-SSE-LABEL: ioo512:
+; X64-SSE-LABEL: allones_v16i32:
; X64-SSE: # BB#0:
; X64-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X64-SSE-NEXT: pcmpeqd %xmm1, %xmm1
@@ -539,28 +613,28 @@ define <16 x i32> @ioo512() nounwind {
; X64-SSE-NEXT: pcmpeqd %xmm3, %xmm3
; X64-SSE-NEXT: retq
;
-; X64-AVX1-LABEL: ioo512:
+; X64-AVX1-LABEL: allones_v16i32:
; X64-AVX1: # BB#0:
; X64-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X64-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; X64-AVX1-NEXT: vmovaps %ymm0, %ymm1
; X64-AVX1-NEXT: retq
;
-; X64-AVX2-LABEL: ioo512:
+; X64-AVX2-LABEL: allones_v16i32:
; X64-AVX2: # BB#0:
; X64-AVX2-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X64-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
; X64-AVX2-NEXT: retq
;
-; X64-AVX512-LABEL: ioo512:
+; X64-AVX512-LABEL: allones_v16i32:
; X64-AVX512: # BB#0:
; X64-AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0
; X64-AVX512-NEXT: retq
ret <16 x i32> <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
}
-define <8 x i64> @loo512() nounwind {
-; X32-SSE-LABEL: loo512:
+define <8 x i64> @allones_v8i64() nounwind {
+; X32-SSE-LABEL: allones_v8i64:
; X32-SSE: # BB#0:
; X32-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X32-SSE-NEXT: pcmpeqd %xmm1, %xmm1
@@ -568,25 +642,25 @@ define <8 x i64> @loo512() nounwind {
; X32-SSE-NEXT: pcmpeqd %xmm3, %xmm3
; X32-SSE-NEXT: retl
;
-; X32-AVX1-LABEL: loo512:
+; X32-AVX1-LABEL: allones_v8i64:
; X32-AVX1: # BB#0:
; X32-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; X32-AVX1-NEXT: vmovaps %ymm0, %ymm1
; X32-AVX1-NEXT: retl
;
-; X32-AVX2-LABEL: loo512:
+; X32-AVX2-LABEL: allones_v8i64:
; X32-AVX2: # BB#0:
; X32-AVX2-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X32-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
; X32-AVX2-NEXT: retl
;
-; X32-AVX512-LABEL: loo512:
+; X32-AVX512-LABEL: allones_v8i64:
; X32-AVX512: # BB#0:
; X32-AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0
; X32-AVX512-NEXT: retl
;
-; X64-SSE-LABEL: loo512:
+; X64-SSE-LABEL: allones_v8i64:
; X64-SSE: # BB#0:
; X64-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X64-SSE-NEXT: pcmpeqd %xmm1, %xmm1
@@ -594,28 +668,28 @@ define <8 x i64> @loo512() nounwind {
; X64-SSE-NEXT: pcmpeqd %xmm3, %xmm3
; X64-SSE-NEXT: retq
;
-; X64-AVX1-LABEL: loo512:
+; X64-AVX1-LABEL: allones_v8i64:
; X64-AVX1: # BB#0:
; X64-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X64-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; X64-AVX1-NEXT: vmovaps %ymm0, %ymm1
; X64-AVX1-NEXT: retq
;
-; X64-AVX2-LABEL: loo512:
+; X64-AVX2-LABEL: allones_v8i64:
; X64-AVX2: # BB#0:
; X64-AVX2-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X64-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
; X64-AVX2-NEXT: retq
;
-; X64-AVX512-LABEL: loo512:
+; X64-AVX512-LABEL: allones_v8i64:
; X64-AVX512: # BB#0:
; X64-AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0
; X64-AVX512-NEXT: retq
ret <8 x i64> <i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1>
}
-define <8 x double> @doo512() nounwind {
-; X32-SSE-LABEL: doo512:
+define <8 x double> @allones_v8f64() nounwind {
+; X32-SSE-LABEL: allones_v8f64:
; X32-SSE: # BB#0:
; X32-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X32-SSE-NEXT: pcmpeqd %xmm1, %xmm1
@@ -623,25 +697,25 @@ define <8 x double> @doo512() nounwind {
; X32-SSE-NEXT: pcmpeqd %xmm3, %xmm3
; X32-SSE-NEXT: retl
;
-; X32-AVX1-LABEL: doo512:
+; X32-AVX1-LABEL: allones_v8f64:
; X32-AVX1: # BB#0:
; X32-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; X32-AVX1-NEXT: vmovaps %ymm0, %ymm1
; X32-AVX1-NEXT: retl
;
-; X32-AVX2-LABEL: doo512:
+; X32-AVX2-LABEL: allones_v8f64:
; X32-AVX2: # BB#0:
; X32-AVX2-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X32-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
; X32-AVX2-NEXT: retl
;
-; X32-AVX512-LABEL: doo512:
+; X32-AVX512-LABEL: allones_v8f64:
; X32-AVX512: # BB#0:
; X32-AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0
; X32-AVX512-NEXT: retl
;
-; X64-SSE-LABEL: doo512:
+; X64-SSE-LABEL: allones_v8f64:
; X64-SSE: # BB#0:
; X64-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X64-SSE-NEXT: pcmpeqd %xmm1, %xmm1
@@ -649,28 +723,28 @@ define <8 x double> @doo512() nounwind {
; X64-SSE-NEXT: pcmpeqd %xmm3, %xmm3
; X64-SSE-NEXT: retq
;
-; X64-AVX1-LABEL: doo512:
+; X64-AVX1-LABEL: allones_v8f64:
; X64-AVX1: # BB#0:
; X64-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X64-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; X64-AVX1-NEXT: vmovaps %ymm0, %ymm1
; X64-AVX1-NEXT: retq
;
-; X64-AVX2-LABEL: doo512:
+; X64-AVX2-LABEL: allones_v8f64:
; X64-AVX2: # BB#0:
; X64-AVX2-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X64-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
; X64-AVX2-NEXT: retq
;
-; X64-AVX512-LABEL: doo512:
+; X64-AVX512-LABEL: allones_v8f64:
; X64-AVX512: # BB#0:
; X64-AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0
; X64-AVX512-NEXT: retq
ret <8 x double> <double 0xffffffffffffffff, double 0xffffffffffffffff, double 0xffffffffffffffff, double 0xffffffffffffffff, double 0xffffffffffffffff, double 0xffffffffffffffff, double 0xffffffffffffffff, double 0xffffffffffffffff>
}
-define <16 x float> @foo512() nounwind {
-; X32-SSE-LABEL: foo512:
+define <16 x float> @allones_v16f32() nounwind {
+; X32-SSE-LABEL: allones_v16f32:
; X32-SSE: # BB#0:
; X32-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X32-SSE-NEXT: pcmpeqd %xmm1, %xmm1
@@ -678,25 +752,25 @@ define <16 x float> @foo512() nounwind {
; X32-SSE-NEXT: pcmpeqd %xmm3, %xmm3
; X32-SSE-NEXT: retl
;
-; X32-AVX1-LABEL: foo512:
+; X32-AVX1-LABEL: allones_v16f32:
; X32-AVX1: # BB#0:
; X32-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X32-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; X32-AVX1-NEXT: vmovaps %ymm0, %ymm1
; X32-AVX1-NEXT: retl
;
-; X32-AVX2-LABEL: foo512:
+; X32-AVX2-LABEL: allones_v16f32:
; X32-AVX2: # BB#0:
; X32-AVX2-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X32-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
; X32-AVX2-NEXT: retl
;
-; X32-AVX512-LABEL: foo512:
+; X32-AVX512-LABEL: allones_v16f32:
; X32-AVX512: # BB#0:
; X32-AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0
; X32-AVX512-NEXT: retl
;
-; X64-SSE-LABEL: foo512:
+; X64-SSE-LABEL: allones_v16f32:
; X64-SSE: # BB#0:
; X64-SSE-NEXT: pcmpeqd %xmm0, %xmm0
; X64-SSE-NEXT: pcmpeqd %xmm1, %xmm1
@@ -704,20 +778,20 @@ define <16 x float> @foo512() nounwind {
; X64-SSE-NEXT: pcmpeqd %xmm3, %xmm3
; X64-SSE-NEXT: retq
;
-; X64-AVX1-LABEL: foo512:
+; X64-AVX1-LABEL: allones_v16f32:
; X64-AVX1: # BB#0:
; X64-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
; X64-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0
; X64-AVX1-NEXT: vmovaps %ymm0, %ymm1
; X64-AVX1-NEXT: retq
;
-; X64-AVX2-LABEL: foo512:
+; X64-AVX2-LABEL: allones_v16f32:
; X64-AVX2: # BB#0:
; X64-AVX2-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
; X64-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
; X64-AVX2-NEXT: retq
;
-; X64-AVX512-LABEL: foo512:
+; X64-AVX512-LABEL: allones_v16f32:
; X64-AVX512: # BB#0:
; X64-AVX512-NEXT: vpternlogd $255, %zmm0, %zmm0, %zmm0
; X64-AVX512-NEXT: retq
diff --git a/test/CodeGen/X86/anyregcc.ll b/test/CodeGen/X86/anyregcc.ll
index 1b51b53bd226..b75774ab12c0 100644
--- a/test/CodeGen/X86/anyregcc.ll
+++ b/test/CodeGen/X86/anyregcc.ll
@@ -7,7 +7,7 @@
; CHECK-LABEL: .section __LLVM_STACKMAPS,__llvm_stackmaps
; CHECK-NEXT: __LLVM_StackMaps:
; Header
-; CHECK-NEXT: .byte 2
+; CHECK-NEXT: .byte 3
; CHECK-NEXT: .byte 0
; CHECK-NEXT: .short 0
; Num Functions
@@ -53,18 +53,24 @@
; CHECK-NEXT: .short 3
; Loc 0: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 4
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 4
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 2: Constant 3
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 3
define i64 @test() nounwind ssp uwtable {
entry:
@@ -79,13 +85,17 @@ entry:
; CHECK-NEXT: .short 2
; Loc 0: Register <-- this is the return register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define i64 @property_access1(i8* %obj) nounwind ssp uwtable {
entry:
@@ -101,13 +111,17 @@ entry:
; CHECK-NEXT: .short 2
; Loc 0: Register <-- this is the return register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define i64 @property_access2() nounwind ssp uwtable {
entry:
@@ -124,13 +138,17 @@ entry:
; CHECK-NEXT: .short 2
; Loc 0: Register <-- this is the return register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Direct RBP - ofs
; CHECK-NEXT: .byte 2
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short 6
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long
define i64 @property_access3() nounwind ssp uwtable {
entry:
@@ -147,73 +165,101 @@ entry:
; CHECK-NEXT: .short 14
; Loc 0: Register <-- this is the return register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 2: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 3: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 4: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 5: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 6: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 7: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 8: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 9: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 10: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 11: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 12: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 13: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define i64 @anyreg_test1(i8* %a1, i8* %a2, i8* %a3, i8* %a4, i8* %a5, i8* %a6, i8* %a7, i8* %a8, i8* %a9, i8* %a10, i8* %a11, i8* %a12, i8* %a13) nounwind ssp uwtable {
entry:
@@ -229,73 +275,101 @@ entry:
; CHECK-NEXT: .short 14
; Loc 0: Register <-- this is the return register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 2: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 3: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 4: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 5: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 6: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 7: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 8: Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 9: Argument, still on stack
; CHECK-NEXT: .byte 3
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short 6
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long
; Loc 10: Argument, still on stack
; CHECK-NEXT: .byte 3
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short 6
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long
; Loc 11: Argument, still on stack
; CHECK-NEXT: .byte 3
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short 6
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long
; Loc 12: Argument, still on stack
; CHECK-NEXT: .byte 3
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short 6
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long
; Loc 13: Argument, still on stack
; CHECK-NEXT: .byte 3
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short 6
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long
define i64 @anyreg_test2(i8* %a1, i8* %a2, i8* %a3, i8* %a4, i8* %a5, i8* %a6, i8* %a7, i8* %a8, i8* %a9, i8* %a10, i8* %a11, i8* %a12, i8* %a13) nounwind ssp uwtable {
entry:
@@ -313,18 +387,24 @@ entry:
; CHECK-NEXT: .short 3
; Loc 0: Register (some register that will be spilled to the stack)
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Register RDI
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short 5
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Register RSI
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short 4
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define i64 @patchpoint_spilldef(i64 %p1, i64 %p2, i64 %p3, i64 %p4) {
entry:
@@ -342,28 +422,38 @@ entry:
; CHECK-NEXT: .short 5
; Loc 0: Return a register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 1: Arg0 in a Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 2: Arg1 in a Register
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; Loc 3: Arg2 spilled to RBP +
; CHECK-NEXT: .byte 3
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short 6
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long
; Loc 4: Arg3 spilled to RBP +
; CHECK-NEXT: .byte 3
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short 6
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long
define i64 @patchpoint_spillargs(i64 %p1, i64 %p2, i64 %p3, i64 %p4) {
entry:
diff --git a/test/CodeGen/X86/avx-intrinsics-fast-isel.ll b/test/CodeGen/X86/avx-intrinsics-fast-isel.ll
index 4a86fa22f081..1d925ff8e9bd 100644
--- a/test/CodeGen/X86/avx-intrinsics-fast-isel.ll
+++ b/test/CodeGen/X86/avx-intrinsics-fast-isel.ll
@@ -3774,4 +3774,58 @@ define void @test_mm256_zeroupper() nounwind {
}
declare void @llvm.x86.avx.vzeroupper() nounwind readnone
+define <4 x double> @test_mm256_zextpd128_pd256(<2 x double> %a0) nounwind {
+; X32-LABEL: test_mm256_zextpd128_pd256:
+; X32: # BB#0:
+; X32-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
+; X32-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X32-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
+; X32-NEXT: retl
+;
+; X64-LABEL: test_mm256_zextpd128_pd256:
+; X64: # BB#0:
+; X64-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
+; X64-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X64-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
+; X64-NEXT: retq
+ %res = shufflevector <2 x double> %a0, <2 x double> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
+ ret <4 x double> %res
+}
+
+define <8 x float> @test_mm256_zextps128_ps256(<4 x float> %a0) nounwind {
+; X32-LABEL: test_mm256_zextps128_ps256:
+; X32: # BB#0:
+; X32-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
+; X32-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X32-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
+; X32-NEXT: retl
+;
+; X64-LABEL: test_mm256_zextps128_ps256:
+; X64: # BB#0:
+; X64-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
+; X64-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X64-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
+; X64-NEXT: retq
+ %res = shufflevector <4 x float> %a0, <4 x float> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
+ ret <8 x float> %res
+}
+
+define <4 x i64> @test_mm256_zextsi128_si256(<2 x i64> %a0) nounwind {
+; X32-LABEL: test_mm256_zextsi128_si256:
+; X32: # BB#0:
+; X32-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
+; X32-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X32-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
+; X32-NEXT: retl
+;
+; X64-LABEL: test_mm256_zextsi128_si256:
+; X64: # BB#0:
+; X64-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
+; X64-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X64-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
+; X64-NEXT: retq
+ %res = shufflevector <2 x i64> %a0, <2 x i64> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
+ ret <4 x i64> %res
+}
+
!0 = !{i32 1}
diff --git a/test/CodeGen/X86/avx512-intrinsics-fast-isel.ll b/test/CodeGen/X86/avx512-intrinsics-fast-isel.ll
index 2d4bf6ebb257..652f85d8833b 100644
--- a/test/CodeGen/X86/avx512-intrinsics-fast-isel.ll
+++ b/test/CodeGen/X86/avx512-intrinsics-fast-isel.ll
@@ -1130,5 +1130,125 @@ define <16 x float> @test_mm512_maskz_unpacklo_ps(i16 %a0, <16 x float> %a1, <16
ret <16 x float> %res1
}
+define <8 x double> @test_mm512_zextpd128_pd512(<2 x double> %a0) nounwind {
+; X32-LABEL: test_mm512_zextpd128_pd512:
+; X32: # BB#0:
+; X32-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
+; X32-NEXT: vxorpd %xmm1, %xmm1, %xmm1
+; X32-NEXT: vinsertf128 $1, %xmm1, %ymm1, %ymm2
+; X32-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
+; X32-NEXT: vinsertf64x4 $1, %ymm2, %zmm0, %zmm0
+; X32-NEXT: retl
+;
+; X64-LABEL: test_mm512_zextpd128_pd512:
+; X64: # BB#0:
+; X64-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
+; X64-NEXT: vxorpd %xmm1, %xmm1, %xmm1
+; X64-NEXT: vinsertf128 $1, %xmm1, %ymm1, %ymm2
+; X64-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
+; X64-NEXT: vinsertf64x4 $1, %ymm2, %zmm0, %zmm0
+; X64-NEXT: retq
+ %res = shufflevector <2 x double> %a0, <2 x double> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 2, i32 3, i32 2, i32 3>
+ ret <8 x double> %res
+}
+
+define <8 x double> @test_mm512_zextpd256_pd512(<4 x double> %a0) nounwind {
+; X32-LABEL: test_mm512_zextpd256_pd512:
+; X32: # BB#0:
+; X32-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
+; X32-NEXT: vxorpd %ymm1, %ymm1, %ymm1
+; X32-NEXT: vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
+; X32-NEXT: retl
+;
+; X64-LABEL: test_mm512_zextpd256_pd512:
+; X64: # BB#0:
+; X64-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
+; X64-NEXT: vxorpd %ymm1, %ymm1, %ymm1
+; X64-NEXT: vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
+; X64-NEXT: retq
+ %res = shufflevector <4 x double> %a0, <4 x double> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
+ ret <8 x double> %res
+}
+
+define <16 x float> @test_mm512_zextps128_ps512(<4 x float> %a0) nounwind {
+; X32-LABEL: test_mm512_zextps128_ps512:
+; X32: # BB#0:
+; X32-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
+; X32-NEXT: vxorpd %xmm1, %xmm1, %xmm1
+; X32-NEXT: vinsertf128 $1, %xmm1, %ymm1, %ymm2
+; X32-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
+; X32-NEXT: vinsertf64x4 $1, %ymm2, %zmm0, %zmm0
+; X32-NEXT: retl
+;
+; X64-LABEL: test_mm512_zextps128_ps512:
+; X64: # BB#0:
+; X64-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
+; X64-NEXT: vxorpd %xmm1, %xmm1, %xmm1
+; X64-NEXT: vinsertf128 $1, %xmm1, %ymm1, %ymm2
+; X64-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
+; X64-NEXT: vinsertf64x4 $1, %ymm2, %zmm0, %zmm0
+; X64-NEXT: retq
+ %res = shufflevector <4 x float> %a0, <4 x float> zeroinitializer, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 4, i32 5, i32 6, i32 7, i32 4, i32 5, i32 6, i32 7>
+ ret <16 x float> %res
+}
+
+define <16 x float> @test_mm512_zextps256_ps512(<8 x float> %a0) nounwind {
+; X32-LABEL: test_mm512_zextps256_ps512:
+; X32: # BB#0:
+; X32-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
+; X32-NEXT: vxorpd %ymm1, %ymm1, %ymm1
+; X32-NEXT: vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
+; X32-NEXT: retl
+;
+; X64-LABEL: test_mm512_zextps256_ps512:
+; X64: # BB#0:
+; X64-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
+; X64-NEXT: vxorpd %ymm1, %ymm1, %ymm1
+; X64-NEXT: vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
+; X64-NEXT: retq
+ %res = shufflevector <8 x float> %a0, <8 x float> zeroinitializer, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
+ ret <16 x float> %res
+}
+
+define <8 x i64> @test_mm512_zextsi128_si512(<2 x i64> %a0) nounwind {
+; X32-LABEL: test_mm512_zextsi128_si512:
+; X32: # BB#0:
+; X32-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
+; X32-NEXT: vpxor %xmm1, %xmm1, %xmm1
+; X32-NEXT: vinserti128 $1, %xmm1, %ymm1, %ymm2
+; X32-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
+; X32-NEXT: vinserti64x4 $1, %ymm2, %zmm0, %zmm0
+; X32-NEXT: retl
+;
+; X64-LABEL: test_mm512_zextsi128_si512:
+; X64: # BB#0:
+; X64-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<def>
+; X64-NEXT: vpxor %xmm1, %xmm1, %xmm1
+; X64-NEXT: vinserti128 $1, %xmm1, %ymm1, %ymm2
+; X64-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
+; X64-NEXT: vinserti64x4 $1, %ymm2, %zmm0, %zmm0
+; X64-NEXT: retq
+ %res = shufflevector <2 x i64> %a0, <2 x i64> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 2, i32 3, i32 2, i32 3>
+ ret <8 x i64> %res
+}
+
+define <8 x i64> @test_mm512_zextsi256_si512(<4 x i64> %a0) nounwind {
+; X32-LABEL: test_mm512_zextsi256_si512:
+; X32: # BB#0:
+; X32-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
+; X32-NEXT: vpxor %ymm1, %ymm1, %ymm1
+; X32-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0
+; X32-NEXT: retl
+;
+; X64-LABEL: test_mm512_zextsi256_si512:
+; X64: # BB#0:
+; X64-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<def>
+; X64-NEXT: vpxor %ymm1, %ymm1, %ymm1
+; X64-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0
+; X64-NEXT: retq
+ %res = shufflevector <4 x i64> %a0, <4 x i64> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
+ ret <8 x i64> %res
+}
+
!0 = !{i32 1}
diff --git a/test/CodeGen/X86/bool-ext-inc.ll b/test/CodeGen/X86/bool-ext-inc.ll
index 1b69b5542556..e292ccd0be11 100644
--- a/test/CodeGen/X86/bool-ext-inc.ll
+++ b/test/CodeGen/X86/bool-ext-inc.ll
@@ -1,29 +1,26 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx2 | FileCheck %s
-; FIXME: add (sext i1 X), 1 -> zext (not i1 X)
+; add (sext i1 X), 1 -> zext (not i1 X)
define i32 @sext_inc(i1 zeroext %x) nounwind {
; CHECK-LABEL: sext_inc:
; CHECK: # BB#0:
-; CHECK-NEXT: movzbl %dil, %ecx
-; CHECK-NEXT: movl $1, %eax
-; CHECK-NEXT: subl %ecx, %eax
+; CHECK-NEXT: xorb $1, %dil
+; CHECK-NEXT: movzbl %dil, %eax
; CHECK-NEXT: retq
%ext = sext i1 %x to i32
%add = add i32 %ext, 1
ret i32 %add
}
-; FIXME: add (sext i1 X), 1 -> zext (not i1 X)
+; add (sext i1 X), 1 -> zext (not i1 X)
define <4 x i32> @sext_inc_vec(<4 x i1> %x) nounwind {
; CHECK-LABEL: sext_inc_vec:
; CHECK: # BB#0:
-; CHECK-NEXT: vpslld $31, %xmm0, %xmm0
-; CHECK-NEXT: vpsrad $31, %xmm0, %xmm0
-; CHECK-NEXT: vpbroadcastd {{.*}}(%rip), %xmm1
-; CHECK-NEXT: vpaddd %xmm1, %xmm0, %xmm0
+; CHECK-NEXT: vbroadcastss {{.*}}(%rip), %xmm1
+; CHECK-NEXT: vandnps %xmm1, %xmm0, %xmm0
; CHECK-NEXT: retq
%ext = sext <4 x i1> %x to <4 x i32>
%add = add <4 x i32> %ext, <i32 1, i32 1, i32 1, i32 1>
@@ -35,7 +32,7 @@ define <4 x i32> @cmpgt_sext_inc_vec(<4 x i32> %x, <4 x i32> %y) nounwind {
; CHECK: # BB#0:
; CHECK-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
; CHECK-NEXT: vpbroadcastd {{.*}}(%rip), %xmm1
-; CHECK-NEXT: vpaddd %xmm1, %xmm0, %xmm0
+; CHECK-NEXT: vpandn %xmm1, %xmm0, %xmm0
; CHECK-NEXT: retq
%cmp = icmp sgt <4 x i32> %x, %y
%ext = sext <4 x i1> %cmp to <4 x i32>
@@ -47,10 +44,7 @@ define <4 x i32> @cmpne_sext_inc_vec(<4 x i32> %x, <4 x i32> %y) nounwind {
; CHECK-LABEL: cmpne_sext_inc_vec:
; CHECK: # BB#0:
; CHECK-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
-; CHECK-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
-; CHECK-NEXT: vpxor %xmm1, %xmm0, %xmm0
-; CHECK-NEXT: vpbroadcastd {{.*}}(%rip), %xmm1
-; CHECK-NEXT: vpaddd %xmm1, %xmm0, %xmm0
+; CHECK-NEXT: vpsrld $31, %xmm0, %xmm0
; CHECK-NEXT: retq
%cmp = icmp ne <4 x i32> %x, %y
%ext = sext <4 x i1> %cmp to <4 x i32>
@@ -63,7 +57,7 @@ define <4 x i64> @cmpgt_sext_inc_vec256(<4 x i64> %x, <4 x i64> %y) nounwind {
; CHECK: # BB#0:
; CHECK-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm0
; CHECK-NEXT: vpbroadcastq {{.*}}(%rip), %ymm1
-; CHECK-NEXT: vpaddq %ymm1, %ymm0, %ymm0
+; CHECK-NEXT: vpandn %ymm1, %ymm0, %ymm0
; CHECK-NEXT: retq
%cmp = icmp sgt <4 x i64> %x, %y
%ext = sext <4 x i1> %cmp to <4 x i64>
@@ -75,13 +69,11 @@ define i32 @bool_logic_and_math(i32 %a, i32 %b, i32 %c, i32 %d) nounwind {
; CHECK-LABEL: bool_logic_and_math:
; CHECK: # BB#0:
; CHECK-NEXT: cmpl %esi, %edi
-; CHECK-NEXT: setne %al
+; CHECK-NEXT: sete %al
; CHECK-NEXT: cmpl %ecx, %edx
-; CHECK-NEXT: setne %cl
-; CHECK-NEXT: andb %al, %cl
-; CHECK-NEXT: movzbl %cl, %ecx
-; CHECK-NEXT: movl $1, %eax
-; CHECK-NEXT: subl %ecx, %eax
+; CHECK-NEXT: sete %cl
+; CHECK-NEXT: orb %al, %cl
+; CHECK-NEXT: movzbl %cl, %eax
; CHECK-NEXT: retq
%cmp1 = icmp ne i32 %a, %b
%cmp2 = icmp ne i32 %c, %d
@@ -95,12 +87,12 @@ define <4 x i32> @bool_logic_and_math_vec(<4 x i32> %a, <4 x i32> %b, <4 x i32>
; CHECK-LABEL: bool_logic_and_math_vec:
; CHECK: # BB#0:
; CHECK-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
-; CHECK-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
-; CHECK-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2
-; CHECK-NEXT: vpxor %xmm1, %xmm2, %xmm1
+; CHECK-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm1
+; CHECK-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
+; CHECK-NEXT: vpxor %xmm2, %xmm1, %xmm1
; CHECK-NEXT: vpandn %xmm1, %xmm0, %xmm0
; CHECK-NEXT: vpbroadcastd {{.*}}(%rip), %xmm1
-; CHECK-NEXT: vpaddd %xmm1, %xmm0, %xmm0
+; CHECK-NEXT: vpandn %xmm1, %xmm0, %xmm0
; CHECK-NEXT: retq
%cmp1 = icmp ne <4 x i32> %a, %b
%cmp2 = icmp ne <4 x i32> %c, %d
diff --git a/test/CodeGen/X86/bswap_tree.ll b/test/CodeGen/X86/bswap_tree.ll
index 35a28af85579..c217879d4386 100644
--- a/test/CodeGen/X86/bswap_tree.ll
+++ b/test/CodeGen/X86/bswap_tree.ll
@@ -13,32 +13,16 @@
define i32 @test1(i32 %x) nounwind {
; CHECK-LABEL: test1:
; CHECK: # BB#0:
-; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx
-; CHECK-NEXT: movl %ecx, %edx
-; CHECK-NEXT: andl $16711680, %edx # imm = 0xFF0000
-; CHECK-NEXT: movl %ecx, %eax
-; CHECK-NEXT: andl $-16777216, %eax # imm = 0xFF000000
-; CHECK-NEXT: shll $8, %edx
-; CHECK-NEXT: shrl $8, %eax
-; CHECK-NEXT: bswapl %ecx
-; CHECK-NEXT: shrl $16, %ecx
-; CHECK-NEXT: orl %edx, %eax
-; CHECK-NEXT: orl %ecx, %eax
+; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax
+; CHECK-NEXT: bswapl %eax
+; CHECK-NEXT: roll $16, %eax
; CHECK-NEXT: retl
;
; CHECK64-LABEL: test1:
; CHECK64: # BB#0:
-; CHECK64-NEXT: # kill: %EDI<def> %EDI<kill> %RDI<def>
-; CHECK64-NEXT: movl %edi, %eax
-; CHECK64-NEXT: andl $16711680, %eax # imm = 0xFF0000
-; CHECK64-NEXT: movl %edi, %ecx
-; CHECK64-NEXT: andl $-16777216, %ecx # imm = 0xFF000000
-; CHECK64-NEXT: shll $8, %eax
-; CHECK64-NEXT: shrl $8, %ecx
; CHECK64-NEXT: bswapl %edi
-; CHECK64-NEXT: shrl $16, %edi
-; CHECK64-NEXT: orl %eax, %ecx
-; CHECK64-NEXT: leal (%rcx,%rdi), %eax
+; CHECK64-NEXT: roll $16, %edi
+; CHECK64-NEXT: movl %edi, %eax
; CHECK64-NEXT: retq
%byte0 = and i32 %x, 255 ; 0x000000ff
%byte1 = and i32 %x, 65280 ; 0x0000ff00
@@ -62,33 +46,16 @@ define i32 @test1(i32 %x) nounwind {
define i32 @test2(i32 %x) nounwind {
; CHECK-LABEL: test2:
; CHECK: # BB#0:
-; CHECK-NEXT: pushl %esi
; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax
-; CHECK-NEXT: movl %eax, %ecx
-; CHECK-NEXT: shll $8, %ecx
-; CHECK-NEXT: shrl $8, %eax
-; CHECK-NEXT: movzwl %cx, %edx
-; CHECK-NEXT: movzbl %al, %esi
-; CHECK-NEXT: andl $-16777216, %ecx # imm = 0xFF000000
-; CHECK-NEXT: andl $16711680, %eax # imm = 0xFF0000
-; CHECK-NEXT: orl %edx, %esi
-; CHECK-NEXT: orl %ecx, %eax
-; CHECK-NEXT: orl %esi, %eax
-; CHECK-NEXT: popl %esi
+; CHECK-NEXT: bswapl %eax
+; CHECK-NEXT: roll $16, %eax
; CHECK-NEXT: retl
;
; CHECK64-LABEL: test2:
; CHECK64: # BB#0:
-; CHECK64-NEXT: movl %edi, %ecx
-; CHECK64-NEXT: shll $8, %ecx
-; CHECK64-NEXT: shrl $8, %edi
-; CHECK64-NEXT: movzwl %cx, %edx
-; CHECK64-NEXT: movzbl %dil, %eax
-; CHECK64-NEXT: andl $-16777216, %ecx # imm = 0xFF000000
-; CHECK64-NEXT: andl $16711680, %edi # imm = 0xFF0000
-; CHECK64-NEXT: orl %edx, %eax
-; CHECK64-NEXT: orl %ecx, %edi
-; CHECK64-NEXT: orl %edi, %eax
+; CHECK64-NEXT: bswapl %edi
+; CHECK64-NEXT: roll $16, %edi
+; CHECK64-NEXT: movl %edi, %eax
; CHECK64-NEXT: retq
%byte1 = shl i32 %x, 8
%byte0 = lshr i32 %x, 8
diff --git a/test/CodeGen/X86/cast-vsel.ll b/test/CodeGen/X86/cast-vsel.ll
new file mode 100644
index 000000000000..1e44aec99fc5
--- /dev/null
+++ b/test/CodeGen/X86/cast-vsel.ll
@@ -0,0 +1,611 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
+
+; If we have a cmp and a sel with different-sized operands followed by a size-changing cast,
+; we may want to pull the cast ahead of the select operands to create a select with matching op sizes:
+; ext (sel (cmp a, b), c, d) --> sel (cmp a, b), (ext c), (ext d)
+
+define <8 x i32> @sext(<8 x float> %a, <8 x float> %b, <8 x i16> %c, <8 x i16> %d) {
+; SSE2-LABEL: sext:
+; SSE2: # BB#0:
+; SSE2-NEXT: cmpltps %xmm3, %xmm1
+; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
+; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,6,6,7]
+; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
+; SSE2-NEXT: cmpltps %xmm2, %xmm0
+; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
+; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
+; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]
+; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
+; SSE2-NEXT: pand %xmm2, %xmm4
+; SSE2-NEXT: pandn %xmm5, %xmm2
+; SSE2-NEXT: por %xmm4, %xmm2
+; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
+; SSE2-NEXT: psrad $16, %xmm0
+; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
+; SSE2-NEXT: psrad $16, %xmm1
+; SSE2-NEXT: retq
+;
+; SSE41-LABEL: sext:
+; SSE41: # BB#0:
+; SSE41-NEXT: cmpltps %xmm3, %xmm1
+; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
+; SSE41-NEXT: pshufb %xmm3, %xmm1
+; SSE41-NEXT: cmpltps %xmm2, %xmm0
+; SSE41-NEXT: pshufb %xmm3, %xmm0
+; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
+; SSE41-NEXT: pand %xmm0, %xmm4
+; SSE41-NEXT: pandn %xmm5, %xmm0
+; SSE41-NEXT: por %xmm4, %xmm0
+; SSE41-NEXT: pmovsxwd %xmm0, %xmm2
+; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
+; SSE41-NEXT: pmovsxwd %xmm0, %xmm1
+; SSE41-NEXT: movdqa %xmm2, %xmm0
+; SSE41-NEXT: retq
+;
+; AVX1-LABEL: sext:
+; AVX1: # BB#0:
+; AVX1-NEXT: vcmpltps %ymm1, %ymm0, %ymm0
+; AVX1-NEXT: vpmovsxwd %xmm2, %xmm1
+; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
+; AVX1-NEXT: vpmovsxwd %xmm2, %xmm2
+; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
+; AVX1-NEXT: vpmovsxwd %xmm3, %xmm2
+; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[2,3,0,1]
+; AVX1-NEXT: vpmovsxwd %xmm3, %xmm3
+; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2
+; AVX1-NEXT: vblendvps %ymm0, %ymm1, %ymm2, %ymm0
+; AVX1-NEXT: retq
+;
+; AVX2-LABEL: sext:
+; AVX2: # BB#0:
+; AVX2-NEXT: vcmpltps %ymm1, %ymm0, %ymm0
+; AVX2-NEXT: vpmovsxwd %xmm2, %ymm1
+; AVX2-NEXT: vpmovsxwd %xmm3, %ymm2
+; AVX2-NEXT: vblendvps %ymm0, %ymm1, %ymm2, %ymm0
+; AVX2-NEXT: retq
+ %cmp = fcmp olt <8 x float> %a, %b
+ %sel = select <8 x i1> %cmp, <8 x i16> %c, <8 x i16> %d
+ %ext = sext <8 x i16> %sel to <8 x i32>
+ ret <8 x i32> %ext
+}
+
+define <8 x i32> @zext(<8 x float> %a, <8 x float> %b, <8 x i16> %c, <8 x i16> %d) {
+; SSE2-LABEL: zext:
+; SSE2: # BB#0:
+; SSE2-NEXT: cmpltps %xmm3, %xmm1
+; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
+; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,6,6,7]
+; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[0,2,2,3]
+; SSE2-NEXT: cmpltps %xmm2, %xmm0
+; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
+; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
+; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,2,2,3]
+; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
+; SSE2-NEXT: pand %xmm1, %xmm4
+; SSE2-NEXT: pandn %xmm5, %xmm1
+; SSE2-NEXT: por %xmm4, %xmm1
+; SSE2-NEXT: xorps %xmm2, %xmm2
+; SSE2-NEXT: movdqa %xmm1, %xmm0
+; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
+; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
+; SSE2-NEXT: retq
+;
+; SSE41-LABEL: zext:
+; SSE41: # BB#0:
+; SSE41-NEXT: cmpltps %xmm3, %xmm1
+; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
+; SSE41-NEXT: pshufb %xmm3, %xmm1
+; SSE41-NEXT: cmpltps %xmm2, %xmm0
+; SSE41-NEXT: pshufb %xmm3, %xmm0
+; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
+; SSE41-NEXT: pand %xmm0, %xmm4
+; SSE41-NEXT: pandn %xmm5, %xmm0
+; SSE41-NEXT: por %xmm4, %xmm0
+; SSE41-NEXT: pmovzxwd {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
+; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
+; SSE41-NEXT: pmovzxwd {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
+; SSE41-NEXT: movdqa %xmm2, %xmm0
+; SSE41-NEXT: retq
+;
+; AVX1-LABEL: zext:
+; AVX1: # BB#0:
+; AVX1-NEXT: vcmpltps %ymm1, %ymm0, %ymm0
+; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero
+; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
+; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero
+; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
+; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero
+; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[2,3,0,1]
+; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero
+; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2
+; AVX1-NEXT: vblendvps %ymm0, %ymm1, %ymm2, %ymm0
+; AVX1-NEXT: retq
+;
+; AVX2-LABEL: zext:
+; AVX2: # BB#0:
+; AVX2-NEXT: vcmpltps %ymm1, %ymm0, %ymm0
+; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
+; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
+; AVX2-NEXT: vblendvps %ymm0, %ymm1, %ymm2, %ymm0
+; AVX2-NEXT: retq
+ %cmp = fcmp olt <8 x float> %a, %b
+ %sel = select <8 x i1> %cmp, <8 x i16> %c, <8 x i16> %d
+ %ext = zext <8 x i16> %sel to <8 x i32>
+ ret <8 x i32> %ext
+}
+
+define <4 x double> @fpext(<4 x double> %a, <4 x double> %b, <4 x float> %c, <4 x float> %d) {
+; SSE2-LABEL: fpext:
+; SSE2: # BB#0:
+; SSE2-NEXT: cmpltpd %xmm3, %xmm1
+; SSE2-NEXT: cmpltpd %xmm2, %xmm0
+; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
+; SSE2-NEXT: andps %xmm0, %xmm4
+; SSE2-NEXT: andnps %xmm5, %xmm0
+; SSE2-NEXT: orps %xmm4, %xmm0
+; SSE2-NEXT: cvtps2pd %xmm0, %xmm2
+; SSE2-NEXT: psrldq {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero
+; SSE2-NEXT: cvtps2pd %xmm0, %xmm1
+; SSE2-NEXT: movaps %xmm2, %xmm0
+; SSE2-NEXT: retq
+;
+; SSE41-LABEL: fpext:
+; SSE41: # BB#0:
+; SSE41-NEXT: cmpltpd %xmm3, %xmm1
+; SSE41-NEXT: cmpltpd %xmm2, %xmm0
+; SSE41-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
+; SSE41-NEXT: blendvps %xmm0, %xmm4, %xmm5
+; SSE41-NEXT: cvtps2pd %xmm5, %xmm0
+; SSE41-NEXT: movhlps {{.*#+}} xmm5 = xmm5[1,1]
+; SSE41-NEXT: cvtps2pd %xmm5, %xmm1
+; SSE41-NEXT: retq
+;
+; AVX-LABEL: fpext:
+; AVX: # BB#0:
+; AVX-NEXT: vcmpltpd %ymm1, %ymm0, %ymm0
+; AVX-NEXT: vcvtps2pd %xmm2, %ymm1
+; AVX-NEXT: vcvtps2pd %xmm3, %ymm2
+; AVX-NEXT: vblendvpd %ymm0, %ymm1, %ymm2, %ymm0
+; AVX-NEXT: retq
+ %cmp = fcmp olt <4 x double> %a, %b
+ %sel = select <4 x i1> %cmp, <4 x float> %c, <4 x float> %d
+ %ext = fpext <4 x float> %sel to <4 x double>
+ ret <4 x double> %ext
+}
+
+define <8 x i16> @trunc(<8 x i16> %a, <8 x i16> %b, <8 x i32> %c, <8 x i32> %d) {
+; SSE2-LABEL: trunc:
+; SSE2: # BB#0:
+; SSE2-NEXT: pcmpeqw %xmm1, %xmm0
+; SSE2-NEXT: pslld $16, %xmm5
+; SSE2-NEXT: psrad $16, %xmm5
+; SSE2-NEXT: pslld $16, %xmm4
+; SSE2-NEXT: psrad $16, %xmm4
+; SSE2-NEXT: packssdw %xmm5, %xmm4
+; SSE2-NEXT: pslld $16, %xmm3
+; SSE2-NEXT: psrad $16, %xmm3
+; SSE2-NEXT: pslld $16, %xmm2
+; SSE2-NEXT: psrad $16, %xmm2
+; SSE2-NEXT: packssdw %xmm3, %xmm2
+; SSE2-NEXT: pand %xmm0, %xmm2
+; SSE2-NEXT: pandn %xmm4, %xmm0
+; SSE2-NEXT: por %xmm2, %xmm0
+; SSE2-NEXT: retq
+;
+; SSE41-LABEL: trunc:
+; SSE41: # BB#0:
+; SSE41-NEXT: pcmpeqw %xmm1, %xmm0
+; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
+; SSE41-NEXT: pshufb %xmm1, %xmm5
+; SSE41-NEXT: pshufb %xmm1, %xmm4
+; SSE41-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm5[0]
+; SSE41-NEXT: pshufb %xmm1, %xmm3
+; SSE41-NEXT: pshufb %xmm1, %xmm2
+; SSE41-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
+; SSE41-NEXT: pand %xmm0, %xmm2
+; SSE41-NEXT: pandn %xmm4, %xmm0
+; SSE41-NEXT: por %xmm2, %xmm0
+; SSE41-NEXT: retq
+;
+; AVX1-LABEL: trunc:
+; AVX1: # BB#0:
+; AVX1-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
+; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm1
+; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
+; AVX1-NEXT: vpshufb %xmm4, %xmm1, %xmm1
+; AVX1-NEXT: vpshufb %xmm4, %xmm3, %xmm3
+; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm3[0],xmm1[0]
+; AVX1-NEXT: vpandn %xmm1, %xmm0, %xmm1
+; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
+; AVX1-NEXT: vpshufb %xmm4, %xmm3, %xmm3
+; AVX1-NEXT: vpshufb %xmm4, %xmm2, %xmm2
+; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
+; AVX1-NEXT: vpand %xmm0, %xmm2, %xmm0
+; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
+; AVX1-NEXT: vzeroupper
+; AVX1-NEXT: retq
+;
+; AVX2-LABEL: trunc:
+; AVX2: # BB#0:
+; AVX2-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
+; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
+; AVX2-NEXT: vpshufb %ymm1, %ymm3, %ymm3
+; AVX2-NEXT: vpermq {{.*#+}} ymm3 = ymm3[0,2,2,3]
+; AVX2-NEXT: vpandn %xmm3, %xmm0, %xmm3
+; AVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1
+; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
+; AVX2-NEXT: vpand %xmm0, %xmm1, %xmm0
+; AVX2-NEXT: vpor %xmm3, %xmm0, %xmm0
+; AVX2-NEXT: vzeroupper
+; AVX2-NEXT: retq
+ %cmp = icmp eq <8 x i16> %a, %b
+ %sel = select <8 x i1> %cmp, <8 x i32> %c, <8 x i32> %d
+ %tr = trunc <8 x i32> %sel to <8 x i16>
+ ret <8 x i16> %tr
+}
+
+define <4 x float> @fptrunc(<4 x float> %a, <4 x float> %b, <4 x double> %c, <4 x double> %d) {
+; SSE2-LABEL: fptrunc:
+; SSE2: # BB#0:
+; SSE2-NEXT: cmpltps %xmm1, %xmm0
+; SSE2-NEXT: cvtpd2ps %xmm5, %xmm1
+; SSE2-NEXT: cvtpd2ps %xmm4, %xmm4
+; SSE2-NEXT: unpcklpd {{.*#+}} xmm4 = xmm4[0],xmm1[0]
+; SSE2-NEXT: cvtpd2ps %xmm3, %xmm1
+; SSE2-NEXT: cvtpd2ps %xmm2, %xmm2
+; SSE2-NEXT: unpcklpd {{.*#+}} xmm2 = xmm2[0],xmm1[0]
+; SSE2-NEXT: andpd %xmm0, %xmm2
+; SSE2-NEXT: andnpd %xmm4, %xmm0
+; SSE2-NEXT: orpd %xmm2, %xmm0
+; SSE2-NEXT: retq
+;
+; SSE41-LABEL: fptrunc:
+; SSE41: # BB#0:
+; SSE41-NEXT: cmpltps %xmm1, %xmm0
+; SSE41-NEXT: cvtpd2ps %xmm3, %xmm1
+; SSE41-NEXT: cvtpd2ps %xmm2, %xmm2
+; SSE41-NEXT: unpcklpd {{.*#+}} xmm2 = xmm2[0],xmm1[0]
+; SSE41-NEXT: cvtpd2ps %xmm5, %xmm3
+; SSE41-NEXT: cvtpd2ps %xmm4, %xmm1
+; SSE41-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm3[0]
+; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm1
+; SSE41-NEXT: movaps %xmm1, %xmm0
+; SSE41-NEXT: retq
+;
+; AVX-LABEL: fptrunc:
+; AVX: # BB#0:
+; AVX-NEXT: vcmpltps %xmm1, %xmm0, %xmm0
+; AVX-NEXT: vcvtpd2ps %ymm2, %xmm1
+; AVX-NEXT: vcvtpd2ps %ymm3, %xmm2
+; AVX-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0
+; AVX-NEXT: vzeroupper
+; AVX-NEXT: retq
+ %cmp = fcmp olt <4 x float> %a, %b
+ %sel = select <4 x i1> %cmp, <4 x double> %c, <4 x double> %d
+ %tr = fptrunc <4 x double> %sel to <4 x float>
+ ret <4 x float> %tr
+}
+
+; PR14657 - avoid truncation/extension of comparison results
+; These tests demonstrate the same issue as the simpler cases above,
+; but also include multi-BB to show potentially larger transforms/codegen issues.
+
+@da = common global [1024 x float] zeroinitializer, align 32
+@db = common global [1024 x float] zeroinitializer, align 32
+@dc = common global [1024 x float] zeroinitializer, align 32
+@dd = common global [1024 x float] zeroinitializer, align 32
+@dj = common global [1024 x i32] zeroinitializer, align 32
+
+define void @example25() nounwind {
+; SSE2-LABEL: example25:
+; SSE2: # BB#0: # %vector.ph
+; SSE2-NEXT: movq $-4096, %rax # imm = 0xF000
+; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [1,1,1,1]
+; SSE2-NEXT: .p2align 4, 0x90
+; SSE2-NEXT: .LBB5_1: # %vector.body
+; SSE2-NEXT: # =>This Inner Loop Header: Depth=1
+; SSE2-NEXT: movaps da+4096(%rax), %xmm1
+; SSE2-NEXT: movaps da+4112(%rax), %xmm2
+; SSE2-NEXT: cmpltps db+4112(%rax), %xmm2
+; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,2,2,3,4,5,6,7]
+; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,4,6,6,7]
+; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NEXT: cmpltps db+4096(%rax), %xmm1
+; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
+; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,6,6,7]
+; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
+; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
+; SSE2-NEXT: psllw $15, %xmm1
+; SSE2-NEXT: psraw $15, %xmm1
+; SSE2-NEXT: movaps dc+4096(%rax), %xmm2
+; SSE2-NEXT: movaps dc+4112(%rax), %xmm3
+; SSE2-NEXT: cmpltps dd+4112(%rax), %xmm3
+; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[0,2,2,3,4,5,6,7]
+; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,6,6,7]
+; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NEXT: cmpltps dd+4096(%rax), %xmm2
+; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,2,2,3,4,5,6,7]
+; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,4,6,6,7]
+; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
+; SSE2-NEXT: psllw $15, %xmm2
+; SSE2-NEXT: psraw $15, %xmm2
+; SSE2-NEXT: pand %xmm1, %xmm2
+; SSE2-NEXT: movdqa %xmm2, %xmm1
+; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
+; SSE2-NEXT: pand %xmm0, %xmm1
+; SSE2-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
+; SSE2-NEXT: pand %xmm0, %xmm2
+; SSE2-NEXT: movdqa %xmm2, dj+4112(%rax)
+; SSE2-NEXT: movdqa %xmm1, dj+4096(%rax)
+; SSE2-NEXT: addq $32, %rax
+; SSE2-NEXT: jne .LBB5_1
+; SSE2-NEXT: # BB#2: # %for.end
+; SSE2-NEXT: retq
+;
+; SSE41-LABEL: example25:
+; SSE41: # BB#0: # %vector.ph
+; SSE41-NEXT: movq $-4096, %rax # imm = 0xF000
+; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
+; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [1,1,1,1]
+; SSE41-NEXT: .p2align 4, 0x90
+; SSE41-NEXT: .LBB5_1: # %vector.body
+; SSE41-NEXT: # =>This Inner Loop Header: Depth=1
+; SSE41-NEXT: movaps da+4096(%rax), %xmm2
+; SSE41-NEXT: movaps da+4112(%rax), %xmm3
+; SSE41-NEXT: cmpltps db+4112(%rax), %xmm3
+; SSE41-NEXT: pshufb %xmm0, %xmm3
+; SSE41-NEXT: cmpltps db+4096(%rax), %xmm2
+; SSE41-NEXT: pshufb %xmm0, %xmm2
+; SSE41-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
+; SSE41-NEXT: psllw $15, %xmm2
+; SSE41-NEXT: psraw $15, %xmm2
+; SSE41-NEXT: movaps dc+4096(%rax), %xmm3
+; SSE41-NEXT: movaps dc+4112(%rax), %xmm4
+; SSE41-NEXT: cmpltps dd+4112(%rax), %xmm4
+; SSE41-NEXT: pshufb %xmm0, %xmm4
+; SSE41-NEXT: cmpltps dd+4096(%rax), %xmm3
+; SSE41-NEXT: pshufb %xmm0, %xmm3
+; SSE41-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm4[0]
+; SSE41-NEXT: psllw $15, %xmm3
+; SSE41-NEXT: psraw $15, %xmm3
+; SSE41-NEXT: pand %xmm2, %xmm3
+; SSE41-NEXT: pmovzxwd {{.*#+}} xmm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero
+; SSE41-NEXT: pand %xmm1, %xmm2
+; SSE41-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
+; SSE41-NEXT: pand %xmm1, %xmm3
+; SSE41-NEXT: movdqa %xmm3, dj+4112(%rax)
+; SSE41-NEXT: movdqa %xmm2, dj+4096(%rax)
+; SSE41-NEXT: addq $32, %rax
+; SSE41-NEXT: jne .LBB5_1
+; SSE41-NEXT: # BB#2: # %for.end
+; SSE41-NEXT: retq
+;
+; AVX1-LABEL: example25:
+; AVX1: # BB#0: # %vector.ph
+; AVX1-NEXT: movq $-4096, %rax # imm = 0xF000
+; AVX1-NEXT: vmovaps {{.*#+}} ymm0 = [1,1,1,1,1,1,1,1]
+; AVX1-NEXT: .p2align 4, 0x90
+; AVX1-NEXT: .LBB5_1: # %vector.body
+; AVX1-NEXT: # =>This Inner Loop Header: Depth=1
+; AVX1-NEXT: vmovups da+4096(%rax), %ymm1
+; AVX1-NEXT: vcmpltps db+4096(%rax), %ymm1, %ymm1
+; AVX1-NEXT: vmovups dc+4096(%rax), %ymm2
+; AVX1-NEXT: vcmpltps dd+4096(%rax), %ymm2, %ymm2
+; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1
+; AVX1-NEXT: vandps %ymm0, %ymm1, %ymm1
+; AVX1-NEXT: vmovups %ymm1, dj+4096(%rax)
+; AVX1-NEXT: addq $32, %rax
+; AVX1-NEXT: jne .LBB5_1
+; AVX1-NEXT: # BB#2: # %for.end
+; AVX1-NEXT: vzeroupper
+; AVX1-NEXT: retq
+;
+; AVX2-LABEL: example25:
+; AVX2: # BB#0: # %vector.ph
+; AVX2-NEXT: movq $-4096, %rax # imm = 0xF000
+; AVX2-NEXT: vbroadcastss {{.*}}(%rip), %ymm0
+; AVX2-NEXT: .p2align 4, 0x90
+; AVX2-NEXT: .LBB5_1: # %vector.body
+; AVX2-NEXT: # =>This Inner Loop Header: Depth=1
+; AVX2-NEXT: vmovups da+4096(%rax), %ymm1
+; AVX2-NEXT: vcmpltps db+4096(%rax), %ymm1, %ymm1
+; AVX2-NEXT: vmovups dc+4096(%rax), %ymm2
+; AVX2-NEXT: vcmpltps dd+4096(%rax), %ymm2, %ymm2
+; AVX2-NEXT: vandps %ymm2, %ymm1, %ymm1
+; AVX2-NEXT: vandps %ymm0, %ymm1, %ymm1
+; AVX2-NEXT: vmovups %ymm1, dj+4096(%rax)
+; AVX2-NEXT: addq $32, %rax
+; AVX2-NEXT: jne .LBB5_1
+; AVX2-NEXT: # BB#2: # %for.end
+; AVX2-NEXT: vzeroupper
+; AVX2-NEXT: retq
+vector.ph:
+ br label %vector.body
+
+vector.body:
+ %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
+ %0 = getelementptr inbounds [1024 x float], [1024 x float]* @da, i64 0, i64 %index
+ %1 = bitcast float* %0 to <8 x float>*
+ %2 = load <8 x float>, <8 x float>* %1, align 16
+ %3 = getelementptr inbounds [1024 x float], [1024 x float]* @db, i64 0, i64 %index
+ %4 = bitcast float* %3 to <8 x float>*
+ %5 = load <8 x float>, <8 x float>* %4, align 16
+ %6 = fcmp olt <8 x float> %2, %5
+ %7 = getelementptr inbounds [1024 x float], [1024 x float]* @dc, i64 0, i64 %index
+ %8 = bitcast float* %7 to <8 x float>*
+ %9 = load <8 x float>, <8 x float>* %8, align 16
+ %10 = getelementptr inbounds [1024 x float], [1024 x float]* @dd, i64 0, i64 %index
+ %11 = bitcast float* %10 to <8 x float>*
+ %12 = load <8 x float>, <8 x float>* %11, align 16
+ %13 = fcmp olt <8 x float> %9, %12
+ %14 = and <8 x i1> %6, %13
+ %15 = zext <8 x i1> %14 to <8 x i32>
+ %16 = getelementptr inbounds [1024 x i32], [1024 x i32]* @dj, i64 0, i64 %index
+ %17 = bitcast i32* %16 to <8 x i32>*
+ store <8 x i32> %15, <8 x i32>* %17, align 16
+ %index.next = add i64 %index, 8
+ %18 = icmp eq i64 %index.next, 1024
+ br i1 %18, label %for.end, label %vector.body
+
+for.end:
+ ret void
+}
+
+define void @example24(i16 signext %x, i16 signext %y) nounwind {
+; SSE2-LABEL: example24:
+; SSE2: # BB#0: # %vector.ph
+; SSE2-NEXT: movd %edi, %xmm0
+; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
+; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
+; SSE2-NEXT: movd %esi, %xmm1
+; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
+; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
+; SSE2-NEXT: movq $-4096, %rax # imm = 0xF000
+; SSE2-NEXT: .p2align 4, 0x90
+; SSE2-NEXT: .LBB6_1: # %vector.body
+; SSE2-NEXT: # =>This Inner Loop Header: Depth=1
+; SSE2-NEXT: movaps da+4096(%rax), %xmm2
+; SSE2-NEXT: movaps da+4112(%rax), %xmm3
+; SSE2-NEXT: cmpltps db+4112(%rax), %xmm3
+; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[0,2,2,3,4,5,6,7]
+; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,6,6,7]
+; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NEXT: cmpltps db+4096(%rax), %xmm2
+; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,2,2,3,4,5,6,7]
+; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,4,6,6,7]
+; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
+; SSE2-NEXT: movdqa %xmm0, %xmm3
+; SSE2-NEXT: pand %xmm2, %xmm3
+; SSE2-NEXT: pandn %xmm1, %xmm2
+; SSE2-NEXT: por %xmm3, %xmm2
+; SSE2-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
+; SSE2-NEXT: psrad $16, %xmm3
+; SSE2-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]
+; SSE2-NEXT: psrad $16, %xmm2
+; SSE2-NEXT: movdqa %xmm2, dj+4112(%rax)
+; SSE2-NEXT: movdqa %xmm3, dj+4096(%rax)
+; SSE2-NEXT: addq $32, %rax
+; SSE2-NEXT: jne .LBB6_1
+; SSE2-NEXT: # BB#2: # %for.end
+; SSE2-NEXT: retq
+;
+; SSE41-LABEL: example24:
+; SSE41: # BB#0: # %vector.ph
+; SSE41-NEXT: movd %edi, %xmm0
+; SSE41-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
+; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
+; SSE41-NEXT: movd %esi, %xmm1
+; SSE41-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
+; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
+; SSE41-NEXT: movq $-4096, %rax # imm = 0xF000
+; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
+; SSE41-NEXT: .p2align 4, 0x90
+; SSE41-NEXT: .LBB6_1: # %vector.body
+; SSE41-NEXT: # =>This Inner Loop Header: Depth=1
+; SSE41-NEXT: movaps da+4096(%rax), %xmm3
+; SSE41-NEXT: movaps da+4112(%rax), %xmm4
+; SSE41-NEXT: cmpltps db+4112(%rax), %xmm4
+; SSE41-NEXT: pshufb %xmm2, %xmm4
+; SSE41-NEXT: cmpltps db+4096(%rax), %xmm3
+; SSE41-NEXT: pshufb %xmm2, %xmm3
+; SSE41-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm4[0]
+; SSE41-NEXT: movdqa %xmm0, %xmm4
+; SSE41-NEXT: pand %xmm3, %xmm4
+; SSE41-NEXT: pandn %xmm1, %xmm3
+; SSE41-NEXT: por %xmm4, %xmm3
+; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[2,3,0,1]
+; SSE41-NEXT: pmovsxwd %xmm4, %xmm4
+; SSE41-NEXT: pmovsxwd %xmm3, %xmm3
+; SSE41-NEXT: movdqa %xmm3, dj+4096(%rax)
+; SSE41-NEXT: movdqa %xmm4, dj+4112(%rax)
+; SSE41-NEXT: addq $32, %rax
+; SSE41-NEXT: jne .LBB6_1
+; SSE41-NEXT: # BB#2: # %for.end
+; SSE41-NEXT: retq
+;
+; AVX1-LABEL: example24:
+; AVX1: # BB#0: # %vector.ph
+; AVX1-NEXT: vmovd %edi, %xmm0
+; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
+; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
+; AVX1-NEXT: vmovd %esi, %xmm1
+; AVX1-NEXT: vpshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
+; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
+; AVX1-NEXT: movq $-4096, %rax # imm = 0xF000
+; AVX1-NEXT: vpmovsxwd %xmm0, %xmm2
+; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
+; AVX1-NEXT: vpmovsxwd %xmm0, %xmm0
+; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
+; AVX1-NEXT: vpmovsxwd %xmm1, %xmm2
+; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
+; AVX1-NEXT: vpmovsxwd %xmm1, %xmm1
+; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
+; AVX1-NEXT: .p2align 4, 0x90
+; AVX1-NEXT: .LBB6_1: # %vector.body
+; AVX1-NEXT: # =>This Inner Loop Header: Depth=1
+; AVX1-NEXT: vmovups da+4096(%rax), %ymm2
+; AVX1-NEXT: vcmpltps db+4096(%rax), %ymm2, %ymm2
+; AVX1-NEXT: vblendvps %ymm2, %ymm0, %ymm1, %ymm2
+; AVX1-NEXT: vmovups %ymm2, dj+4096(%rax)
+; AVX1-NEXT: addq $32, %rax
+; AVX1-NEXT: jne .LBB6_1
+; AVX1-NEXT: # BB#2: # %for.end
+; AVX1-NEXT: vzeroupper
+; AVX1-NEXT: retq
+;
+; AVX2-LABEL: example24:
+; AVX2: # BB#0: # %vector.ph
+; AVX2-NEXT: vmovd %edi, %xmm0
+; AVX2-NEXT: vpbroadcastw %xmm0, %xmm0
+; AVX2-NEXT: vmovd %esi, %xmm1
+; AVX2-NEXT: vpbroadcastw %xmm1, %xmm1
+; AVX2-NEXT: movq $-4096, %rax # imm = 0xF000
+; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0
+; AVX2-NEXT: vpmovsxwd %xmm1, %ymm1
+; AVX2-NEXT: .p2align 4, 0x90
+; AVX2-NEXT: .LBB6_1: # %vector.body
+; AVX2-NEXT: # =>This Inner Loop Header: Depth=1
+; AVX2-NEXT: vmovups da+4096(%rax), %ymm2
+; AVX2-NEXT: vcmpltps db+4096(%rax), %ymm2, %ymm2
+; AVX2-NEXT: vblendvps %ymm2, %ymm0, %ymm1, %ymm2
+; AVX2-NEXT: vmovups %ymm2, dj+4096(%rax)
+; AVX2-NEXT: addq $32, %rax
+; AVX2-NEXT: jne .LBB6_1
+; AVX2-NEXT: # BB#2: # %for.end
+; AVX2-NEXT: vzeroupper
+; AVX2-NEXT: retq
+vector.ph:
+ %0 = insertelement <8 x i16> undef, i16 %x, i32 0
+ %broadcast11 = shufflevector <8 x i16> %0, <8 x i16> undef, <8 x i32> zeroinitializer
+ %1 = insertelement <8 x i16> undef, i16 %y, i32 0
+ %broadcast12 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> zeroinitializer
+ br label %vector.body
+
+vector.body:
+ %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
+ %2 = getelementptr inbounds [1024 x float], [1024 x float]* @da, i64 0, i64 %index
+ %3 = bitcast float* %2 to <8 x float>*
+ %4 = load <8 x float>, <8 x float>* %3, align 16
+ %5 = getelementptr inbounds [1024 x float], [1024 x float]* @db, i64 0, i64 %index
+ %6 = bitcast float* %5 to <8 x float>*
+ %7 = load <8 x float>, <8 x float>* %6, align 16
+ %8 = fcmp olt <8 x float> %4, %7
+ %9 = select <8 x i1> %8, <8 x i16> %broadcast11, <8 x i16> %broadcast12
+ %10 = sext <8 x i16> %9 to <8 x i32>
+ %11 = getelementptr inbounds [1024 x i32], [1024 x i32]* @dj, i64 0, i64 %index
+ %12 = bitcast i32* %11 to <8 x i32>*
+ store <8 x i32> %10, <8 x i32>* %12, align 16
+ %index.next = add i64 %index, 8
+ %13 = icmp eq i64 %index.next, 1024
+ br i1 %13, label %for.end, label %vector.body
+
+for.end:
+ ret void
+}
+
diff --git a/test/CodeGen/X86/clz.ll b/test/CodeGen/X86/clz.ll
index cffc67327288..9d827fc88b34 100644
--- a/test/CodeGen/X86/clz.ll
+++ b/test/CodeGen/X86/clz.ll
@@ -778,3 +778,88 @@ define i32 @ctlz_bsr_zero_test(i32 %n) {
%bsr = xor i32 %ctlz, 31
ret i32 %bsr
}
+
+define i8 @cttz_i8_knownbits(i8 %x) {
+; X32-LABEL: cttz_i8_knownbits:
+; X32: # BB#0:
+; X32-NEXT: movb {{[0-9]+}}(%esp), %al
+; X32-NEXT: orb $2, %al
+; X32-NEXT: movzbl %al, %eax
+; X32-NEXT: bsfl %eax, %eax
+; X32-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill>
+; X32-NEXT: retl
+;
+; X64-LABEL: cttz_i8_knownbits:
+; X64: # BB#0:
+; X64-NEXT: orb $2, %dil
+; X64-NEXT: movzbl %dil, %eax
+; X64-NEXT: bsfl %eax, %eax
+; X64-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill>
+; X64-NEXT: retq
+;
+; X32-CLZ-LABEL: cttz_i8_knownbits:
+; X32-CLZ: # BB#0:
+; X32-CLZ-NEXT: movb {{[0-9]+}}(%esp), %al
+; X32-CLZ-NEXT: orb $2, %al
+; X32-CLZ-NEXT: movzbl %al, %eax
+; X32-CLZ-NEXT: tzcntl %eax, %eax
+; X32-CLZ-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill>
+; X32-CLZ-NEXT: retl
+;
+; X64-CLZ-LABEL: cttz_i8_knownbits:
+; X64-CLZ: # BB#0:
+; X64-CLZ-NEXT: orb $2, %dil
+; X64-CLZ-NEXT: movzbl %dil, %eax
+; X64-CLZ-NEXT: tzcntl %eax, %eax
+; X64-CLZ-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill>
+; X64-CLZ-NEXT: retq
+ %x2 = or i8 %x, 2
+ %tmp = call i8 @llvm.cttz.i8(i8 %x2, i1 true )
+ %tmp2 = and i8 %tmp, 1
+ ret i8 %tmp2
+}
+
+define i8 @ctlz_i8_knownbits(i8 %x) {
+; X32-LABEL: ctlz_i8_knownbits:
+; X32: # BB#0:
+; X32-NEXT: movb {{[0-9]+}}(%esp), %al
+; X32-NEXT: orb $64, %al
+; X32-NEXT: movzbl %al, %eax
+; X32-NEXT: bsrl %eax, %eax
+; X32-NEXT: xorl $7, %eax
+; X32-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill>
+; X32-NEXT: retl
+;
+; X64-LABEL: ctlz_i8_knownbits:
+; X64: # BB#0:
+; X64-NEXT: orb $64, %dil
+; X64-NEXT: movzbl %dil, %eax
+; X64-NEXT: bsrl %eax, %eax
+; X64-NEXT: xorl $7, %eax
+; X64-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill>
+; X64-NEXT: retq
+;
+; X32-CLZ-LABEL: ctlz_i8_knownbits:
+; X32-CLZ: # BB#0:
+; X32-CLZ-NEXT: movb {{[0-9]+}}(%esp), %al
+; X32-CLZ-NEXT: orb $64, %al
+; X32-CLZ-NEXT: movzbl %al, %eax
+; X32-CLZ-NEXT: lzcntl %eax, %eax
+; X32-CLZ-NEXT: addl $-24, %eax
+; X32-CLZ-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill>
+; X32-CLZ-NEXT: retl
+;
+; X64-CLZ-LABEL: ctlz_i8_knownbits:
+; X64-CLZ: # BB#0:
+; X64-CLZ-NEXT: orb $64, %dil
+; X64-CLZ-NEXT: movzbl %dil, %eax
+; X64-CLZ-NEXT: lzcntl %eax, %eax
+; X64-CLZ-NEXT: addl $-24, %eax
+; X64-CLZ-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill>
+; X64-CLZ-NEXT: retq
+
+ %x2 = or i8 %x, 64
+ %tmp = call i8 @llvm.ctlz.i8(i8 %x2, i1 true )
+ %tmp2 = and i8 %tmp, 1
+ ret i8 %tmp2
+}
diff --git a/test/CodeGen/X86/deopt-bundles.ll b/test/CodeGen/X86/deopt-bundles.ll
index 1fb73ea252ee..9745330c9acd 100644
--- a/test/CodeGen/X86/deopt-bundles.ll
+++ b/test/CodeGen/X86/deopt-bundles.ll
@@ -9,48 +9,47 @@ target triple = "x86_64-apple-macosx10.11.0"
; STACKMAPS: Stack Maps: callsite 2882400015
; STACKMAPS-NEXT: Stack Maps: has 4 locations
-; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
-; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
-; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 8, .short 0, .int 1]
-; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 1]
+; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
; STACKMAPS-NEXT: Stack Maps: has 0 live-out registers
; STACKMAPS-NEXT: Stack Maps: callsite 4242
; STACKMAPS-NEXT: Stack Maps: has 4 locations
-; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
-; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
-; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 8, .short 0, .int 1]
-; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 1 [encoding: .byte 4, .byte 8, .short 0, .int 1]
+; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 1]
+; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 1 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 1]
; STACKMAPS-NEXT: Stack Maps: has 0 live-out registers
; STACKMAPS-NEXT: Stack Maps: callsite 4243
; STACKMAPS-NEXT: Stack Maps: has 4 locations
-; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
-; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
-; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 8, .short 0, .int 1]
-; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 16 [encoding: .byte 4, .byte 8, .short 0, .int 16]
+; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 1]
+; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 16 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 16]
; STACKMAPS-NEXT: Stack Maps: has 0 live-out registers
; STACKMAPS-NEXT: Stack Maps: callsite 2882400015
; STACKMAPS-NEXT: Stack Maps: has 4 locations
-; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
-; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
-; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 8, .short 0, .int 1]
-; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 2 [encoding: .byte 4, .byte 8, .short 0, .int 2]
+; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 1]
+; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 2 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 2]
; STACKMAPS-NEXT: Stack Maps: has 0 live-out registers
; STACKMAPS-NEXT: Stack Maps: callsite 2882400015
; STACKMAPS-NEXT: Stack Maps: has 4 locations
-; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
-; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
-; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 8, .short 0, .int 1]
-; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 3 [encoding: .byte 4, .byte 8, .short 0, .int 3]
+; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 1]
+; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 3 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 3]
; STACKMAPS-NEXT: Stack Maps: has 0 live-out registers
; STACKMAPS-NEXT: Stack Maps: callsite 4243
; STACKMAPS-NEXT: Stack Maps: has 4 locations
-; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
-; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
-; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 8, .short 0, .int 1]
-; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 55 [encoding: .byte 4, .byte 8, .short 0, .int 55]
+; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 1]
+; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 55 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 55]
; STACKMAPS-NEXT: Stack Maps: has 0 live-out registers
-
declare i32 @callee_0()
declare i32 @callee_1(i32)
declare i32 @callee_vararg(...)
@@ -159,3 +158,42 @@ define void @f_0(i64 %n) {
}
declare void @g_0(i64* %vl)
+
+define void @vector_deopt_bundle(<32 x i64 addrspace(1)*> %val) {
+; CHECK-LABEL: _vector_deopt_bundle:
+; CHECK: movaps 16(%rbp), %xmm8
+; CHECK-NEXT: movaps 32(%rbp), %xmm9
+; CHECK-NEXT: movaps 48(%rbp), %xmm10
+; CHECK-NEXT: movaps 64(%rbp), %xmm11
+; CHECK-NEXT: movaps 80(%rbp), %xmm12
+; CHECK-NEXT: movaps 96(%rbp), %xmm13
+; CHECK-NEXT: movaps 112(%rbp), %xmm14
+; CHECK-NEXT: movaps 128(%rbp), %xmm15
+; CHECK-NEXT: movaps %xmm15, 240(%rsp)
+; CHECK-NEXT: movaps %xmm14, 224(%rsp)
+; CHECK-NEXT: movaps %xmm13, 208(%rsp)
+; CHECK-NEXT: movaps %xmm12, 192(%rsp)
+; CHECK-NEXT: movaps %xmm11, 176(%rsp)
+; CHECK-NEXT: movaps %xmm10, 160(%rsp)
+; CHECK-NEXT: movaps %xmm9, 144(%rsp)
+; CHECK-NEXT: movaps %xmm8, 128(%rsp)
+; CHECK-NEXT: movaps %xmm7, 112(%rsp)
+; CHECK-NEXT: movaps %xmm6, 96(%rsp)
+; CHECK-NEXT: movaps %xmm5, 80(%rsp)
+; CHECK-NEXT: movaps %xmm4, 64(%rsp)
+; CHECK-NEXT: movaps %xmm3, 48(%rsp)
+; CHECK-NEXT: movaps %xmm2, 32(%rsp)
+; CHECK-NEXT: movaps %xmm1, 16(%rsp)
+; CHECK-NEXT: movaps %xmm0, (%rsp)
+ call void @unknown() [ "deopt"(<32 x i64 addrspace(1)*> %val) ]
+ ret void
+; STACKMAPS: Stack Maps: callsite 2882400015
+; STACKMAPS-NEXT: Stack Maps: has 4 locations
+; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 1]
+; STACKMAPS-NEXT: Stack Maps: Loc 3: Indirect 7+0 [encoding: .byte 3, .byte 0, .short 256, .short 7, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: has 0 live-out registers
+}
+
+declare void @unknown()
diff --git a/test/CodeGen/X86/deopt-intrinsic-cconv.ll b/test/CodeGen/X86/deopt-intrinsic-cconv.ll
index c382d66cee64..97bca1f69dbf 100644
--- a/test/CodeGen/X86/deopt-intrinsic-cconv.ll
+++ b/test/CodeGen/X86/deopt-intrinsic-cconv.ll
@@ -27,8 +27,8 @@ entry:
; STACKMAPS: Stack Maps: callsites:
; STACKMAPS-NEXT: Stack Maps: callsite 2882400015
; STACKMAPS-NEXT: Stack Maps: has 4 locations
-; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 12 [encoding: .byte 4, .byte 8, .short 0, .int 12]
-; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
-; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 8, .short 0, .int 1]
-; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 3 [encoding: .byte 4, .byte 8, .short 0, .int 3]
+; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 12 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 12]
+; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 1]
+; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 3 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 3]
; STACKMAPS-NEXT: Stack Maps: has 0 live-out registers
diff --git a/test/CodeGen/X86/deopt-intrinsic.ll b/test/CodeGen/X86/deopt-intrinsic.ll
index 1254e1160290..0e894516ffa3 100644
--- a/test/CodeGen/X86/deopt-intrinsic.ll
+++ b/test/CodeGen/X86/deopt-intrinsic.ll
@@ -42,15 +42,15 @@ entry:
; STACKMAPS: Stack Maps: callsites:
; STACKMAPS-NEXT: Stack Maps: callsite 2882400015
; STACKMAPS-NEXT: Stack Maps: has 4 locations
-; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
-; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
-; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 8, .short 0, .int 1]
-; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 1]
+; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
; STACKMAPS-NEXT: Stack Maps: has 0 live-out registers
; STACKMAPS-NEXT: Stack Maps: callsite 2882400015
; STACKMAPS-NEXT: Stack Maps: has 4 locations
-; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
-; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 8, .short 0, .int 0]
-; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 8, .short 0, .int 1]
-; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 1 [encoding: .byte 4, .byte 8, .short 0, .int 1]
+; STACKMAPS-NEXT: Stack Maps: Loc 0: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 1: Constant 0 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 0]
+; STACKMAPS-NEXT: Stack Maps: Loc 2: Constant 1 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 1]
+; STACKMAPS-NEXT: Stack Maps: Loc 3: Constant 1 [encoding: .byte 4, .byte 0, .short 8, .short 0, .short 0, .int 1]
; STACKMAPS-NEXT: Stack Maps: has 0 live-out registers
diff --git a/test/CodeGen/X86/inline-0bh.ll b/test/CodeGen/X86/inline-0bh.ll
new file mode 100644
index 000000000000..ceef395aa147
--- /dev/null
+++ b/test/CodeGen/X86/inline-0bh.ll
@@ -0,0 +1,17 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s
+
+; Function Attrs: noinline nounwind
+define i32 @PR31007() {
+; CHECK-LABEL: PR31007:
+; CHECK: # BB#0: # %entry
+; CHECK-NEXT: #APP
+; CHECK : addb $11, %al
+; CHECK: #NO_APP
+; CHECK-NEXT: xorl %eax, %eax
+; CHECK-NEXT: retq
+entry:
+ call void asm sideeffect inteldialect "add al,$$0bH", "~{al},~{flags},~{dirflag},~{fpsr},~{flags}"()
+ ret i32 0
+}
+
diff --git a/test/CodeGen/X86/known-bits.ll b/test/CodeGen/X86/known-bits.ll
index 81a60cdee3ac..90f6e9301389 100644
--- a/test/CodeGen/X86/known-bits.ll
+++ b/test/CodeGen/X86/known-bits.ll
@@ -173,8 +173,8 @@ define {i32, i1} @knownbits_uaddo_saddo(i64 %a0, i64 %a1) nounwind {
; X32-NEXT: pushl %ebx
; X32-NEXT: movl {{[0-9]+}}(%esp), %eax
; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx
-; X32-NEXT: leal (%ecx,%eax), %edx
-; X32-NEXT: cmpl %ecx, %edx
+; X32-NEXT: movl %ecx, %edx
+; X32-NEXT: addl %eax, %edx
; X32-NEXT: setb %bl
; X32-NEXT: testl %eax, %eax
; X32-NEXT: setns %al
@@ -226,19 +226,19 @@ define {i32, i1} @knownbits_usubo_ssubo(i64 %a0, i64 %a1) nounwind {
; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx
; X32-NEXT: movl %ecx, %edx
; X32-NEXT: subl %eax, %edx
-; X32-NEXT: setns %bl
-; X32-NEXT: cmpl %edx, %ecx
-; X32-NEXT: setb %dh
-; X32-NEXT: testl %ecx, %ecx
-; X32-NEXT: setns %cl
-; X32-NEXT: cmpb %bl, %cl
-; X32-NEXT: setne %ch
+; X32-NEXT: setb %bl
; X32-NEXT: testl %eax, %eax
; X32-NEXT: setns %al
+; X32-NEXT: testl %ecx, %ecx
+; X32-NEXT: setns %cl
; X32-NEXT: cmpb %al, %cl
+; X32-NEXT: setne %al
+; X32-NEXT: testl %edx, %edx
+; X32-NEXT: setns %dl
+; X32-NEXT: cmpb %dl, %cl
; X32-NEXT: setne %dl
-; X32-NEXT: andb %ch, %dl
-; X32-NEXT: orb %dh, %dl
+; X32-NEXT: andb %al, %dl
+; X32-NEXT: orb %bl, %dl
; X32-NEXT: xorl %eax, %eax
; X32-NEXT: popl %ebx
; X32-NEXT: retl
diff --git a/test/CodeGen/X86/known-signbits-vector.ll b/test/CodeGen/X86/known-signbits-vector.ll
index 4c3c8bbd793e..cea9ac26edbc 100644
--- a/test/CodeGen/X86/known-signbits-vector.ll
+++ b/test/CodeGen/X86/known-signbits-vector.ll
@@ -100,27 +100,21 @@ define float @signbits_ashr_extract_sitofp(<2 x i64> %a0) nounwind {
define float @signbits_ashr_insert_ashr_extract_sitofp(i64 %a0, i64 %a1) nounwind {
; X32-LABEL: signbits_ashr_insert_ashr_extract_sitofp:
; X32: # BB#0:
-; X32-NEXT: pushl %ebp
-; X32-NEXT: movl %esp, %ebp
-; X32-NEXT: andl $-8, %esp
-; X32-NEXT: subl $16, %esp
-; X32-NEXT: movl 8(%ebp), %eax
-; X32-NEXT: movl 12(%ebp), %ecx
+; X32-NEXT: pushl %eax
+; X32-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx
; X32-NEXT: shrdl $30, %ecx, %eax
; X32-NEXT: sarl $30, %ecx
; X32-NEXT: vmovd %eax, %xmm0
; X32-NEXT: vpinsrd $1, %ecx, %xmm0, %xmm0
-; X32-NEXT: vpinsrd $2, 16(%ebp), %xmm0, %xmm0
-; X32-NEXT: vpinsrd $3, 20(%ebp), %xmm0, %xmm0
-; X32-NEXT: vpsrad $3, %xmm0, %xmm1
+; X32-NEXT: vpinsrd $2, {{[0-9]+}}(%esp), %xmm0, %xmm0
+; X32-NEXT: vpinsrd $3, {{[0-9]+}}(%esp), %xmm0, %xmm0
; X32-NEXT: vpsrlq $3, %xmm0, %xmm0
-; X32-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
-; X32-NEXT: vmovq %xmm0, {{[0-9]+}}(%esp)
-; X32-NEXT: fildll {{[0-9]+}}(%esp)
-; X32-NEXT: fstps {{[0-9]+}}(%esp)
-; X32-NEXT: flds {{[0-9]+}}(%esp)
-; X32-NEXT: movl %ebp, %esp
-; X32-NEXT: popl %ebp
+; X32-NEXT: vmovd %xmm0, %eax
+; X32-NEXT: vcvtsi2ssl %eax, %xmm1, %xmm0
+; X32-NEXT: vmovss %xmm0, (%esp)
+; X32-NEXT: flds (%esp)
+; X32-NEXT: popl %eax
; X32-NEXT: retl
;
; X64-LABEL: signbits_ashr_insert_ashr_extract_sitofp:
@@ -133,7 +127,7 @@ define float @signbits_ashr_insert_ashr_extract_sitofp(i64 %a0, i64 %a1) nounwin
; X64-NEXT: vpsrlq $3, %xmm0, %xmm0
; X64-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
; X64-NEXT: vmovq %xmm0, %rax
-; X64-NEXT: vcvtsi2ssq %rax, %xmm2, %xmm0
+; X64-NEXT: vcvtsi2ssl %eax, %xmm2, %xmm0
; X64-NEXT: retq
%1 = ashr i64 %a0, 30
%2 = insertelement <2 x i64> undef, i64 %1, i32 0
diff --git a/test/CodeGen/X86/lea-opt-with-debug.mir b/test/CodeGen/X86/lea-opt-with-debug.mir
index ebf86ff718db..0a477706df15 100644
--- a/test/CodeGen/X86/lea-opt-with-debug.mir
+++ b/test/CodeGen/X86/lea-opt-with-debug.mir
@@ -1,7 +1,8 @@
-# RUN: llc -mtriple=x86_64-unknown-unknown -start-after peephole-opt -stop-before detect-dead-lanes -o - %s | FileCheck %s
+# RUN: llc -mtriple=x86_64-unknown-unknown -start-after=peephole-opt -stop-before=detect-dead-lanes -o - %s | FileCheck %s
-# Test that pass optimize LEA can remove a redundant LEA even when it is also
-# used by a DBG_VALUE.
+# Test that the optimize LEA pass can remove a redundant LEA even when it is
+# also used by a DBG_VALUE. Check that the uses of the replaced LEA are updated
+# correctly.
--- |
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
@@ -13,22 +14,22 @@
@d = common local_unnamed_addr global i32 0, align 4
@b = common local_unnamed_addr global i32 0, align 4
- define i32 @fn1() local_unnamed_addr !dbg !8 {
- %1 = load %struct.A*, %struct.A** @c, align 8, !dbg !13
- %2 = load i32, i32* @a, align 4, !dbg !13
- %3 = sext i32 %2 to i64, !dbg !13
- %4 = getelementptr inbounds %struct.A, %struct.A* %1, i64 %3, !dbg !13
- %5 = ptrtoint %struct.A* %4 to i64, !dbg !13
- %6 = trunc i64 %5 to i32, !dbg !13
- store i32 %6, i32* @d, align 4, !dbg !13
- %7 = getelementptr inbounds %struct.A, %struct.A* %1, i64 %3, i32 2, !dbg !14
- tail call void @llvm.dbg.value(metadata i32* %7, i64 0, metadata !11, metadata !15), !dbg !16
- br label %8, !dbg !17
+ define i32 @fn1() local_unnamed_addr !dbg !9 {
+ %1 = load %struct.A*, %struct.A** @c, align 8, !dbg !14
+ %2 = load i32, i32* @a, align 4, !dbg !14
+ %3 = sext i32 %2 to i64, !dbg !14
+ %4 = getelementptr inbounds %struct.A, %struct.A* %1, i64 %3, !dbg !14
+ %5 = ptrtoint %struct.A* %4 to i64, !dbg !14
+ %6 = trunc i64 %5 to i32, !dbg !14
+ store i32 %6, i32* @d, align 4, !dbg !14
+ %7 = getelementptr inbounds %struct.A, %struct.A* %1, i64 %3, i32 2, !dbg !15
+ tail call void @llvm.dbg.value(metadata i32* %7, i64 0, metadata !12, metadata !16), !dbg !17
+ br label %8, !dbg !18
; <label>:8: ; preds = %8, %0
- %9 = load i32, i32* %7, align 4, !dbg !18
- store i32 %9, i32* @d, align 4, !dbg !18
- br label %8, !dbg !19
+ %9 = load i32, i32* %7, align 4, !dbg !19
+ store i32 %9, i32* @d, align 4, !dbg !19
+ br label %8, !dbg !20
}
; Function Attrs: nounwind readnone
@@ -38,6 +39,7 @@
!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!5, !6, !7}
+ !misc = !{!8}
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !3, globals: !2)
!1 = !DIFile(filename: "test.c", directory: "")
@@ -47,18 +49,19 @@
!5 = !{i32 2, !"Dwarf Version", i32 4}
!6 = !{i32 2, !"Debug Info Version", i32 3}
!7 = !{i32 1, !"PIC Level", i32 2}
- !8 = distinct !DISubprogram(name: "fn1", scope: !1, file: !1, line: 7, type: !9, isLocal: false, isDefinition: true, scopeLine: 7, isOptimized: true, unit: !0, variables: !10)
- !9 = !DISubroutineType(types: !3)
- !10 = !{!11}
- !11 = !DILocalVariable(name: "e", scope: !8, file: !1, line: 8, type: !12)
- !12 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !4, size: 64)
- !13 = !DILocation(line: 9, scope: !8)
- !14 = !DILocation(line: 10, scope: !8)
- !15 = !DIExpression()
- !16 = !DILocation(line: 8, scope: !8)
- !17 = !DILocation(line: 11, scope: !8)
- !18 = !DILocation(line: 13, scope: !8)
- !19 = !DILocation(line: 14, scope: !8)
+ !8 = !DIExpression(DW_OP_plus, 8, DW_OP_stack_value)
+ !9 = distinct !DISubprogram(name: "fn1", scope: !1, file: !1, line: 7, type: !10, isLocal: false, isDefinition: true, scopeLine: 7, isOptimized: true, unit: !0, variables: !11)
+ !10 = !DISubroutineType(types: !3)
+ !11 = !{!12}
+ !12 = !DILocalVariable(name: "e", scope: !9, file: !1, line: 8, type: !13)
+ !13 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !4, size: 64)
+ !14 = !DILocation(line: 9, scope: !9)
+ !15 = !DILocation(line: 10, scope: !9)
+ !16 = !DIExpression()
+ !17 = !DILocation(line: 8, scope: !9)
+ !18 = !DILocation(line: 11, scope: !9)
+ !19 = !DILocation(line: 13, scope: !9)
+ !20 = !DILocation(line: 14, scope: !9)
...
---
@@ -95,28 +98,28 @@ body: |
bb.0 (%ir-block.0):
successors: %bb.1(0x80000000)
- ; CHECK: %3 = LEA64r %2, 2, %2, 0, _, debug-location !13
- ; CHECK-NEXT: %4 = LEA64r %1, 4, %3, 0, _, debug-location !13
- ; CHECK-NOT: %0 = LEA64r %1, 4, %3, 8, _, debug-location !14
- ; CHECK: DBG_VALUE debug-use _, debug-use _, !11, !15, debug-location !16
+ ; CHECK: %3 = LEA64r %2, 2, %2, 0, _, debug-location !14
+ ; CHECK-NEXT: %4 = LEA64r %1, 4, %3, 0, _, debug-location !14
+ ; CHECK-NOT: %0 = LEA64r %1, 4, %3, 8, _, debug-location !15
+ ; CHECK: DBG_VALUE debug-use %4, debug-use _, !12, !8, debug-location !17
- %1 = MOV64rm %rip, 1, _, @c, _, debug-location !13 :: (dereferenceable load 8 from @c)
- %2 = MOVSX64rm32 %rip, 1, _, @a, _, debug-location !13 :: (dereferenceable load 4 from @a)
- %3 = LEA64r %2, 2, %2, 0, _, debug-location !13
- %4 = LEA64r %1, 4, %3, 0, _, debug-location !13
- %5 = COPY %4.sub_32bit, debug-location !13
- MOV32mr %rip, 1, _, @d, _, killed %5, debug-location !13 :: (store 4 into @d)
- %0 = LEA64r %1, 4, %3, 8, _, debug-location !14
- DBG_VALUE debug-use %0, debug-use _, !11, !15, debug-location !16
+ %1 = MOV64rm %rip, 1, _, @c, _, debug-location !14 :: (dereferenceable load 8 from @c)
+ %2 = MOVSX64rm32 %rip, 1, _, @a, _, debug-location !14 :: (dereferenceable load 4 from @a)
+ %3 = LEA64r %2, 2, %2, 0, _, debug-location !14
+ %4 = LEA64r %1, 4, %3, 0, _, debug-location !14
+ %5 = COPY %4.sub_32bit, debug-location !14
+ MOV32mr %rip, 1, _, @d, _, killed %5, debug-location !14 :: (store 4 into @d)
+ %0 = LEA64r %1, 4, %3, 8, _, debug-location !15
+ DBG_VALUE debug-use %0, debug-use _, !12, !16, debug-location !17
; CHECK-LABEL: bb.1 (%ir-block.8):
- ; CHECK: %6 = MOV32rm %4, 1, _, 8, _, debug-location !18 :: (load 4 from %ir.7)
+ ; CHECK: %6 = MOV32rm %4, 1, _, 8, _, debug-location !19 :: (load 4 from %ir.7)
bb.1 (%ir-block.8):
successors: %bb.1(0x80000000)
- %6 = MOV32rm %0, 1, _, 0, _, debug-location !18 :: (load 4 from %ir.7)
- MOV32mr %rip, 1, _, @d, _, killed %6, debug-location !18 :: (store 4 into @d)
- JMP_1 %bb.1, debug-location !19
+ %6 = MOV32rm %0, 1, _, 0, _, debug-location !19 :: (load 4 from %ir.7)
+ MOV32mr %rip, 1, _, @d, _, killed %6, debug-location !19 :: (store 4 into @d)
+ JMP_1 %bb.1, debug-location !20
...
diff --git a/test/CodeGen/X86/mul-i1024.ll b/test/CodeGen/X86/mul-i1024.ll
index 93d55a001287..340aa047c022 100644
--- a/test/CodeGen/X86/mul-i1024.ll
+++ b/test/CodeGen/X86/mul-i1024.ll
@@ -4388,732 +4388,720 @@ define void @test_1024(i1024* %a, i1024* %b, i1024* %out) nounwind {
; X64-NEXT: pushq %r13
; X64-NEXT: pushq %r12
; X64-NEXT: pushq %rbx
-; X64-NEXT: subq $360, %rsp # imm = 0x168
+; X64-NEXT: subq $352, %rsp # imm = 0x160
; X64-NEXT: movq %rdx, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq 48(%rdi), %r9
-; X64-NEXT: movq %r9, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: movq 48(%rdi), %r8
+; X64-NEXT: movq %r8, {{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: movq 40(%rdi), %rcx
; X64-NEXT: movq %rcx, {{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: movq 32(%rdi), %rax
; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %rdi, %r10
-; X64-NEXT: xorl %r8d, %r8d
-; X64-NEXT: mulq %r8
-; X64-NEXT: movq %rdx, %rdi
+; X64-NEXT: movq %rdi, %r13
+; X64-NEXT: xorl %r9d, %r9d
+; X64-NEXT: mulq %r9
+; X64-NEXT: movq %rdx, %rbx
; X64-NEXT: movq %rax, %r11
; X64-NEXT: movq %rcx, %rax
-; X64-NEXT: mulq %r8
+; X64-NEXT: mulq %r9
; X64-NEXT: movq %rax, %rcx
-; X64-NEXT: addq %rdi, %rcx
-; X64-NEXT: movq %rdx, %rbx
-; X64-NEXT: adcq $0, %rbx
+; X64-NEXT: addq %rbx, %rcx
+; X64-NEXT: movq %rdx, %rbp
+; X64-NEXT: adcq $0, %rbp
; X64-NEXT: addq %r11, %rcx
; X64-NEXT: movq %rcx, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %rdi, %rbp
-; X64-NEXT: adcq $0, %rbp
-; X64-NEXT: addq %rbx, %rbp
+; X64-NEXT: adcq %rbx, %rbp
+; X64-NEXT: movq %rbx, %rcx
; X64-NEXT: sbbq %rbx, %rbx
; X64-NEXT: andl $1, %ebx
; X64-NEXT: addq %rax, %rbp
; X64-NEXT: adcq %rdx, %rbx
-; X64-NEXT: movq %r9, %rax
-; X64-NEXT: mulq %r8
+; X64-NEXT: movq %r8, %rax
+; X64-NEXT: mulq %r9
; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: movq %rdx, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %r11, %r13
-; X64-NEXT: addq %rax, %r13
-; X64-NEXT: movq %rdi, %rax
-; X64-NEXT: movq %rdi, %r15
-; X64-NEXT: movq %r15, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: movq %r11, %r12
+; X64-NEXT: addq %rax, %r12
+; X64-NEXT: movq %rcx, %rax
+; X64-NEXT: movq %rcx, %r8
+; X64-NEXT: movq %r8, -{{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: adcq %rdx, %rax
-; X64-NEXT: addq %rbp, %r13
-; X64-NEXT: movq %r13, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: addq %rbp, %r12
+; X64-NEXT: movq %r12, {{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: adcq %rbx, %rax
; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %rsi, %r8
-; X64-NEXT: movq (%r8), %rax
+; X64-NEXT: movq (%rsi), %rax
; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: xorl %ebp, %ebp
; X64-NEXT: mulq %rbp
-; X64-NEXT: movq %rax, %r14
+; X64-NEXT: movq %rax, %r10
; X64-NEXT: movq %rdx, %rcx
-; X64-NEXT: movq 8(%r8), %rax
+; X64-NEXT: movq 8(%rsi), %rax
; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: mulq %rbp
; X64-NEXT: xorl %r9d, %r9d
-; X64-NEXT: movq %rax, %r12
-; X64-NEXT: addq %rcx, %r12
+; X64-NEXT: movq %rax, %r15
+; X64-NEXT: addq %rcx, %r15
; X64-NEXT: movq %rdx, %rbp
; X64-NEXT: adcq $0, %rbp
-; X64-NEXT: addq %r14, %r12
-; X64-NEXT: movq %rcx, %rbx
-; X64-NEXT: movq %rcx, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq $0, %rbx
-; X64-NEXT: addq %rbp, %rbx
-; X64-NEXT: sbbq %rbp, %rbp
-; X64-NEXT: andl $1, %ebp
-; X64-NEXT: addq %rax, %rbx
-; X64-NEXT: adcq %rdx, %rbp
-; X64-NEXT: movq 16(%r8), %rax
-; X64-NEXT: movq %r8, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: addq %r10, %r15
+; X64-NEXT: adcq %rcx, %rbp
+; X64-NEXT: movq %rcx, %rdi
+; X64-NEXT: movq %rdi, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: sbbq %rbx, %rbx
+; X64-NEXT: andl $1, %ebx
+; X64-NEXT: addq %rax, %rbp
+; X64-NEXT: adcq %rdx, %rbx
+; X64-NEXT: movq 16(%rsi), %rax
+; X64-NEXT: movq %rsi, %r14
+; X64-NEXT: movq %r14, -{{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: mulq %r9
; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: movq %rdx, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %r14, %r9
-; X64-NEXT: addq %rax, %r9
-; X64-NEXT: movq %rcx, %rax
-; X64-NEXT: adcq %rdx, %rax
-; X64-NEXT: addq %rbx, %r9
-; X64-NEXT: adcq %rbp, %rax
-; X64-NEXT: movq %rax, %rbp
-; X64-NEXT: movq %r11, %rax
+; X64-NEXT: movq %r10, %rcx
+; X64-NEXT: movq %rcx, %rsi
+; X64-NEXT: addq %rax, %rsi
+; X64-NEXT: movq %rdi, %r9
+; X64-NEXT: adcq %rdx, %r9
+; X64-NEXT: addq %rbp, %rsi
+; X64-NEXT: movq %rsi, %r10
+; X64-NEXT: adcq %rbx, %r9
; X64-NEXT: movq %r11, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: addq %r14, %rax
-; X64-NEXT: adcq %rcx, %r15
-; X64-NEXT: movq %r15, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq (%r10), %rax
+; X64-NEXT: movq %r11, %rax
+; X64-NEXT: addq %rcx, %rax
+; X64-NEXT: adcq %rdi, %r8
+; X64-NEXT: movq %r8, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: movq %r13, %rbp
+; X64-NEXT: movq (%rbp), %rax
; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: xorl %r15d, %r15d
-; X64-NEXT: mulq %r15
+; X64-NEXT: xorl %r8d, %r8d
+; X64-NEXT: mulq %r8
; X64-NEXT: movq %rdx, %rsi
; X64-NEXT: movq %rax, %rbx
-; X64-NEXT: addq %r14, %rax
-; X64-NEXT: movq %r14, %rdi
+; X64-NEXT: addq %rcx, %rax
; X64-NEXT: movq %rsi, %rax
-; X64-NEXT: adcq %rcx, %rax
+; X64-NEXT: adcq %rdi, %rax
; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq 32(%r8), %rax
+; X64-NEXT: movq 32(%r14), %rax
; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: mulq %r15
-; X64-NEXT: xorl %r8d, %r8d
-; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %rdx, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %rbx, %rcx
+; X64-NEXT: mulq %r8
+; X64-NEXT: movq %rax, %r13
+; X64-NEXT: movq %rdx, (%rsp) # 8-byte Spill
+; X64-NEXT: movq %rbx, %rax
; X64-NEXT: movq %rbx, %r14
-; X64-NEXT: addq %rax, %rcx
+; X64-NEXT: addq %r13, %rax
; X64-NEXT: movq %rsi, %rax
; X64-NEXT: adcq %rdx, %rax
; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: addq %rdi, %r11
+; X64-NEXT: addq %rcx, %r11
; X64-NEXT: movq %r11, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %rdi, %r11
-; X64-NEXT: movq %r11, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: movq %rcx, %r8
+; X64-NEXT: movq %r8, {{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rax # 8-byte Reload
-; X64-NEXT: adcq %r12, %rax
+; X64-NEXT: adcq %r15, %rax
; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq %r9, %r13
-; X64-NEXT: movq %r13, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %r9, %rdi
+; X64-NEXT: adcq %r10, %r12
+; X64-NEXT: movq %r12, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: movq %r10, %rcx
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rax # 8-byte Reload
-; X64-NEXT: adcq %rbp, %rax
+; X64-NEXT: adcq %r9, %rax
; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %rbp, %r9
-; X64-NEXT: movq 8(%r10), %rax
+; X64-NEXT: movq %r9, %r10
+; X64-NEXT: movq 8(%rbp), %rax
; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %r10, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: mulq %r8
-; X64-NEXT: xorl %ecx, %ecx
-; X64-NEXT: movq %rax, %r15
-; X64-NEXT: addq %rsi, %r15
-; X64-NEXT: movq %rdx, %rbx
-; X64-NEXT: adcq $0, %rbx
-; X64-NEXT: addq %r14, %r15
-; X64-NEXT: movq %rsi, %rbp
-; X64-NEXT: movq %rsi, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq $0, %rbp
-; X64-NEXT: addq %rbx, %rbp
-; X64-NEXT: sbbq %r8, %r8
-; X64-NEXT: andl $1, %r8d
-; X64-NEXT: addq %rax, %rbp
-; X64-NEXT: adcq %rdx, %r8
-; X64-NEXT: movq 16(%r10), %rax
-; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: mulq %rcx
-; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %rdx, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %r14, %rbx
-; X64-NEXT: addq %rax, %rbx
-; X64-NEXT: movq %rsi, %r10
-; X64-NEXT: adcq %rdx, %r10
-; X64-NEXT: addq %rbp, %rbx
-; X64-NEXT: adcq %r8, %r10
-; X64-NEXT: movq %r14, %rax
-; X64-NEXT: movq %r14, (%rsp) # 8-byte Spill
-; X64-NEXT: addq %r11, %rax
-; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %r15, %rcx
-; X64-NEXT: adcq %rcx, %r12
-; X64-NEXT: movq %r12, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq %rbx, %rdi
+; X64-NEXT: movq %rbp, %rdi
; X64-NEXT: movq %rdi, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %rbx, %r8
-; X64-NEXT: adcq %r10, %r9
-; X64-NEXT: movq %r9, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %r13 # 8-byte Reload
-; X64-NEXT: movq 40(%r13), %rax
-; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: xorl %edx, %edx
; X64-NEXT: mulq %rdx
-; X64-NEXT: xorl %r11d, %r11d
-; X64-NEXT: movq %rax, %rsi
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r9 # 8-byte Reload
-; X64-NEXT: addq %r9, %rsi
-; X64-NEXT: movq %rdx, %rbx
-; X64-NEXT: adcq $0, %rbx
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
-; X64-NEXT: addq %rdi, %rsi
-; X64-NEXT: movq %r9, %rbp
+; X64-NEXT: xorl %r9d, %r9d
+; X64-NEXT: movq %rax, %r12
+; X64-NEXT: addq %rsi, %r12
+; X64-NEXT: movq %rdx, %rbp
+; X64-NEXT: adcq $0, %rbp
+; X64-NEXT: addq %r14, %r12
+; X64-NEXT: adcq %rsi, %rbp
+; X64-NEXT: movq %rsi, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: sbbq %rbx, %rbx
+; X64-NEXT: andl $1, %ebx
+; X64-NEXT: addq %rax, %rbp
+; X64-NEXT: adcq %rdx, %rbx
+; X64-NEXT: movq 16(%rdi), %rax
+; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: mulq %r9
+; X64-NEXT: xorl %edi, %edi
+; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: movq %rdx, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: movq %r14, %r9
+; X64-NEXT: addq %rax, %r9
+; X64-NEXT: adcq %rdx, %rsi
+; X64-NEXT: addq %rbp, %r9
+; X64-NEXT: movq %r9, %rdx
+; X64-NEXT: adcq %rbx, %rsi
+; X64-NEXT: movq %rsi, %rax
+; X64-NEXT: movq %r14, %rsi
+; X64-NEXT: movq %r14, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: addq %r8, %rsi
+; X64-NEXT: movq %rsi, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq %r12, %r15
+; X64-NEXT: movq %r15, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq %rdx, %rcx
+; X64-NEXT: movq %rcx, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: movq %rdx, %r15
+; X64-NEXT: adcq %rax, %r10
+; X64-NEXT: movq %r10, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: movq %rax, %r10
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rsi # 8-byte Reload
+; X64-NEXT: movq 40(%rsi), %rax
+; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: mulq %rdi
+; X64-NEXT: xorl %r8d, %r8d
+; X64-NEXT: movq %rax, %rcx
+; X64-NEXT: movq (%rsp), %rdi # 8-byte Reload
+; X64-NEXT: addq %rdi, %rcx
+; X64-NEXT: movq %rdx, %rbp
; X64-NEXT: adcq $0, %rbp
-; X64-NEXT: addq %rbx, %rbp
+; X64-NEXT: addq %r13, %rcx
+; X64-NEXT: adcq %rdi, %rbp
; X64-NEXT: sbbq %rbx, %rbx
; X64-NEXT: andl $1, %ebx
; X64-NEXT: addq %rax, %rbp
; X64-NEXT: adcq %rdx, %rbx
-; X64-NEXT: movq 48(%r13), %rax
+; X64-NEXT: movq 48(%rsi), %rax
; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: mulq %r11
+; X64-NEXT: mulq %r8
; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: movq %rdx, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %rdi, %r15
-; X64-NEXT: movq %rdi, %r11
-; X64-NEXT: addq %rax, %r15
-; X64-NEXT: movq %r9, %rdi
-; X64-NEXT: adcq %rdx, %rdi
-; X64-NEXT: addq %rbp, %r15
-; X64-NEXT: adcq %rbx, %rdi
-; X64-NEXT: addq %r11, %r14
+; X64-NEXT: movq %r13, %r8
+; X64-NEXT: addq %rax, %r8
+; X64-NEXT: movq %rdi, %rax
+; X64-NEXT: adcq %rdx, %rax
+; X64-NEXT: addq %rbp, %r8
+; X64-NEXT: adcq %rbx, %rax
+; X64-NEXT: movq %r13, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: addq %r13, %r14
; X64-NEXT: movq %r14, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq %rsi, %rcx
-; X64-NEXT: movq %rcx, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq %r15, %r8
-; X64-NEXT: movq %r8, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq %rdi, %r10
+; X64-NEXT: adcq %rcx, %r12
+; X64-NEXT: movq %r12, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq %r8, %r15
+; X64-NEXT: movq %r15, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq %rax, %r10
; X64-NEXT: movq %r10, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r14 # 8-byte Reload
-; X64-NEXT: movq %r14, %rax
-; X64-NEXT: addq %r11, %rax
+; X64-NEXT: movq %rax, %rdx
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rsi # 8-byte Reload
+; X64-NEXT: movq %rsi, %rax
+; X64-NEXT: addq %r13, %rax
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rax # 8-byte Reload
-; X64-NEXT: adcq %r9, %rax
+; X64-NEXT: adcq %rdi, %rax
; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %r14, %rax
-; X64-NEXT: addq %r11, %rax
+; X64-NEXT: movq %rsi, %rax
+; X64-NEXT: addq %r13, %rax
; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rsi # 8-byte Folded Reload
-; X64-NEXT: movq %rsi, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %r15 # 8-byte Folded Reload
-; X64-NEXT: movq %r15, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rdi # 8-byte Folded Reload
-; X64-NEXT: movq %rdi, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rcx # 8-byte Folded Reload
+; X64-NEXT: movq %rcx, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r8 # 8-byte Folded Reload
+; X64-NEXT: movq %r8, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rdx # 8-byte Folded Reload
+; X64-NEXT: movq %rdx, {{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx # 8-byte Reload
; X64-NEXT: movq %rcx, %rax
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
; X64-NEXT: mulq %rdi
-; X64-NEXT: movq %rax, %r9
-; X64-NEXT: movq %rdx, %rbx
+; X64-NEXT: movq %rax, %r8
+; X64-NEXT: movq %rdx, %rsi
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rax # 8-byte Reload
-; X64-NEXT: movq 56(%rax), %rsi
-; X64-NEXT: movq %rsi, %rax
-; X64-NEXT: movq %rsi, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: movq 56(%rax), %r11
+; X64-NEXT: movq %r11, %rax
; X64-NEXT: mulq %rdi
-; X64-NEXT: movq %rdi, %r10
-; X64-NEXT: movq %rdx, %rdi
-; X64-NEXT: movq %rax, %rbp
-; X64-NEXT: addq %rbx, %rbp
-; X64-NEXT: adcq $0, %rdi
+; X64-NEXT: movq %rdi, %r9
+; X64-NEXT: movq %rdx, %rbp
+; X64-NEXT: movq %rax, %rbx
+; X64-NEXT: addq %rsi, %rbx
+; X64-NEXT: adcq $0, %rbp
; X64-NEXT: movq %rcx, %rax
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx # 8-byte Reload
-; X64-NEXT: mulq %rcx
-; X64-NEXT: movq %rdx, %rbx
-; X64-NEXT: movq %rax, %r8
-; X64-NEXT: addq %rbp, %r8
-; X64-NEXT: adcq $0, %rbx
-; X64-NEXT: addq %rdi, %rbx
-; X64-NEXT: sbbq %rdi, %rdi
-; X64-NEXT: andl $1, %edi
-; X64-NEXT: movq %rsi, %rax
-; X64-NEXT: mulq %rcx
-; X64-NEXT: movq %rcx, %r11
-; X64-NEXT: addq %rbx, %rax
-; X64-NEXT: adcq %rdi, %rdx
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
+; X64-NEXT: mulq %rdi
+; X64-NEXT: movq %rdx, %rsi
+; X64-NEXT: movq %rax, %r10
+; X64-NEXT: addq %rbx, %r10
+; X64-NEXT: adcq %rbp, %rsi
+; X64-NEXT: sbbq %rcx, %rcx
+; X64-NEXT: andl $1, %ecx
+; X64-NEXT: movq %r11, %rax
+; X64-NEXT: mulq %rdi
+; X64-NEXT: movq %rdi, %r14
+; X64-NEXT: addq %rsi, %rax
+; X64-NEXT: adcq %rcx, %rdx
; X64-NEXT: movq {{[0-9]+}}(%rsp), %r15 # 8-byte Reload
-; X64-NEXT: addq -{{[0-9]+}}(%rsp), %r15 # 8-byte Folded Reload
+; X64-NEXT: addq {{[0-9]+}}(%rsp), %r15 # 8-byte Folded Reload
; X64-NEXT: movq {{[0-9]+}}(%rsp), %r12 # 8-byte Reload
; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r12 # 8-byte Folded Reload
; X64-NEXT: addq %rax, %r15
; X64-NEXT: adcq %rdx, %r12
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
; X64-NEXT: movq %rdi, %rax
-; X64-NEXT: movq %r10, %rsi
-; X64-NEXT: mulq %rsi
-; X64-NEXT: movq %rdx, %r10
-; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx # 8-byte Reload
-; X64-NEXT: movq %rcx, %rax
-; X64-NEXT: mulq %rsi
+; X64-NEXT: movq %r9, %rcx
+; X64-NEXT: mulq %rcx
+; X64-NEXT: movq %rdx, %r9
+; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi # 8-byte Reload
+; X64-NEXT: movq %rsi, %rax
+; X64-NEXT: mulq %rcx
; X64-NEXT: movq %rdx, %rbp
; X64-NEXT: movq %rax, %rbx
-; X64-NEXT: addq %r10, %rbx
+; X64-NEXT: addq %r9, %rbx
; X64-NEXT: adcq $0, %rbp
; X64-NEXT: movq %rdi, %rax
-; X64-NEXT: movq %rdi, %r10
-; X64-NEXT: mulq %r11
-; X64-NEXT: movq %rdx, %rdi
+; X64-NEXT: mulq %r14
+; X64-NEXT: movq %rdx, %rcx
; X64-NEXT: addq %rbx, %rax
; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq $0, %rdi
-; X64-NEXT: addq %rbp, %rdi
+; X64-NEXT: adcq %rbp, %rcx
; X64-NEXT: sbbq %rbp, %rbp
; X64-NEXT: andl $1, %ebp
-; X64-NEXT: movq %rcx, %rax
-; X64-NEXT: movq %rcx, %rsi
-; X64-NEXT: mulq %r11
+; X64-NEXT: movq %rsi, %rbx
+; X64-NEXT: movq %rbx, %rax
+; X64-NEXT: mulq %r14
; X64-NEXT: movq %rdx, %r13
-; X64-NEXT: movq %rax, %rbx
-; X64-NEXT: addq %rdi, %rbx
+; X64-NEXT: movq %rax, %rsi
+; X64-NEXT: addq %rcx, %rsi
; X64-NEXT: adcq %rbp, %r13
-; X64-NEXT: addq {{[0-9]+}}(%rsp), %rbx # 8-byte Folded Reload
-; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r13 # 8-byte Folded Reload
-; X64-NEXT: addq %r9, %rbx
-; X64-NEXT: adcq %r8, %r13
+; X64-NEXT: addq {{[0-9]+}}(%rsp), %rsi # 8-byte Folded Reload
+; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %r13 # 8-byte Folded Reload
+; X64-NEXT: addq %r8, %rsi
+; X64-NEXT: adcq %r10, %r13
; X64-NEXT: adcq $0, %r15
; X64-NEXT: adcq $0, %r12
-; X64-NEXT: movq %r10, %rbp
+; X64-NEXT: movq %rdi, %rbp
; X64-NEXT: movq %rbp, %rax
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rdi # 8-byte Reload
-; X64-NEXT: mulq %rdi
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r9 # 8-byte Reload
+; X64-NEXT: mulq %r9
; X64-NEXT: movq %rdx, %rcx
-; X64-NEXT: movq %rax, %r9
-; X64-NEXT: movq %rsi, %rax
-; X64-NEXT: movq %rsi, %r8
-; X64-NEXT: mulq %rdi
-; X64-NEXT: movq %rdx, %rsi
-; X64-NEXT: movq %rax, %rdi
-; X64-NEXT: addq %rcx, %rdi
-; X64-NEXT: adcq $0, %rsi
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rax # 8-byte Reload
-; X64-NEXT: movq 24(%rax), %r14
+; X64-NEXT: movq %rax, %r10
+; X64-NEXT: movq %rbx, %rax
+; X64-NEXT: movq %rbx, %r14
+; X64-NEXT: mulq %r9
+; X64-NEXT: movq %rdx, %rdi
+; X64-NEXT: movq %rax, %rbx
+; X64-NEXT: addq %rcx, %rbx
+; X64-NEXT: adcq $0, %rdi
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rax # 8-byte Reload
+; X64-NEXT: movq 24(%rax), %rcx
; X64-NEXT: movq %rbp, %rax
-; X64-NEXT: mulq %r14
+; X64-NEXT: mulq %rcx
+; X64-NEXT: movq %rcx, %rbp
+; X64-NEXT: movq %rbp, -{{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: movq %rdx, %rcx
-; X64-NEXT: addq %rdi, %rax
-; X64-NEXT: movq %rax, %rdi
-; X64-NEXT: adcq $0, %rcx
-; X64-NEXT: addq %rsi, %rcx
-; X64-NEXT: sbbq %rsi, %rsi
-; X64-NEXT: andl $1, %esi
-; X64-NEXT: movq %r8, %rax
-; X64-NEXT: mulq %r14
+; X64-NEXT: movq %rax, %r8
+; X64-NEXT: addq %rbx, %r8
+; X64-NEXT: adcq %rdi, %rcx
+; X64-NEXT: sbbq %rdi, %rdi
+; X64-NEXT: andl $1, %edi
+; X64-NEXT: movq %r14, %rax
+; X64-NEXT: mulq %rbp
; X64-NEXT: addq %rcx, %rax
-; X64-NEXT: adcq %rsi, %rdx
+; X64-NEXT: adcq %rdi, %rdx
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rbx # 8-byte Reload
+; X64-NEXT: addq -{{[0-9]+}}(%rsp), %rbx # 8-byte Folded Reload
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rbp # 8-byte Reload
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r11 # 8-byte Reload
-; X64-NEXT: addq %r11, %rbp
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rsi # 8-byte Reload
-; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rsi # 8-byte Folded Reload
-; X64-NEXT: addq %rax, %rbp
-; X64-NEXT: adcq %rdx, %rsi
-; X64-NEXT: addq %rbx, %r9
-; X64-NEXT: movq %r9, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq %r13, %rdi
-; X64-NEXT: movq %rdi, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r14 # 8-byte Reload
+; X64-NEXT: adcq %r14, %rbp
+; X64-NEXT: addq %rax, %rbx
+; X64-NEXT: adcq %rdx, %rbp
+; X64-NEXT: addq %rsi, %r10
+; X64-NEXT: movq %r10, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq %r13, %r8
+; X64-NEXT: movq %r8, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq $0, %rbx
; X64-NEXT: adcq $0, %rbp
-; X64-NEXT: adcq $0, %rsi
-; X64-NEXT: addq %r15, %rbp
-; X64-NEXT: adcq %r12, %rsi
-; X64-NEXT: movl $0, %r10d
-; X64-NEXT: adcq $0, %r10
-; X64-NEXT: sbbq %r15, %r15
-; X64-NEXT: andl $1, %r15d
+; X64-NEXT: addq %r15, %rbx
+; X64-NEXT: adcq %r12, %rbp
+; X64-NEXT: movl $0, %r8d
+; X64-NEXT: adcq $0, %r8
+; X64-NEXT: sbbq %r10, %r10
+; X64-NEXT: andl $1, %r10d
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx # 8-byte Reload
; X64-NEXT: movq %rcx, %rax
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rdi # 8-byte Reload
-; X64-NEXT: mulq %rdi
-; X64-NEXT: movq %rdx, %r12
-; X64-NEXT: movq %rax, %r13
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r8 # 8-byte Reload
-; X64-NEXT: movq %r8, %rax
-; X64-NEXT: mulq %rdi
-; X64-NEXT: movq %rdx, %rbx
+; X64-NEXT: movq %r9, %rsi
+; X64-NEXT: mulq %rsi
+; X64-NEXT: movq %rdx, %r9
+; X64-NEXT: movq %rax, %r15
+; X64-NEXT: movq %r11, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: movq %r11, %rax
+; X64-NEXT: mulq %rsi
+; X64-NEXT: movq %rdx, %rsi
; X64-NEXT: movq %rax, %rdi
-; X64-NEXT: addq %r12, %rdi
-; X64-NEXT: adcq $0, %rbx
+; X64-NEXT: addq %r9, %rdi
+; X64-NEXT: adcq $0, %rsi
; X64-NEXT: movq %rcx, %rax
-; X64-NEXT: mulq %r14
-; X64-NEXT: movq %rdx, %rcx
-; X64-NEXT: movq %rax, %r9
-; X64-NEXT: addq %rdi, %r9
-; X64-NEXT: adcq $0, %rcx
-; X64-NEXT: addq %rbx, %rcx
-; X64-NEXT: sbbq %rdi, %rdi
-; X64-NEXT: andl $1, %edi
-; X64-NEXT: movq %r8, %rax
-; X64-NEXT: mulq %r14
-; X64-NEXT: movq %r14, %r12
-; X64-NEXT: addq %rcx, %rax
-; X64-NEXT: adcq %rdi, %rdx
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rcx # 8-byte Reload
+; X64-NEXT: mulq %rcx
+; X64-NEXT: movq %rdx, %r9
+; X64-NEXT: movq %rax, %r13
+; X64-NEXT: addq %rdi, %r13
+; X64-NEXT: adcq %rsi, %r9
+; X64-NEXT: sbbq %rsi, %rsi
+; X64-NEXT: andl $1, %esi
+; X64-NEXT: movq %r11, %rax
+; X64-NEXT: mulq %rcx
+; X64-NEXT: movq %rcx, %r12
+; X64-NEXT: addq %r9, %rax
+; X64-NEXT: adcq %rsi, %rdx
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx # 8-byte Reload
-; X64-NEXT: addq %r11, %rcx
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
-; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rdi # 8-byte Folded Reload
+; X64-NEXT: addq -{{[0-9]+}}(%rsp), %rcx # 8-byte Folded Reload
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi # 8-byte Reload
+; X64-NEXT: adcq %r14, %rsi
; X64-NEXT: addq %rax, %rcx
-; X64-NEXT: adcq %rdx, %rdi
-; X64-NEXT: addq %rbp, %r13
-; X64-NEXT: adcq %rsi, %r9
-; X64-NEXT: adcq %r10, %rcx
-; X64-NEXT: adcq %r15, %rdi
-; X64-NEXT: addq {{[0-9]+}}(%rsp), %r13 # 8-byte Folded Reload
+; X64-NEXT: adcq %rdx, %rsi
+; X64-NEXT: addq %rbx, %r15
+; X64-NEXT: adcq %rbp, %r13
+; X64-NEXT: adcq %r8, %rcx
+; X64-NEXT: adcq %r10, %rsi
+; X64-NEXT: addq {{[0-9]+}}(%rsp), %r15 # 8-byte Folded Reload
+; X64-NEXT: movq %r15, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %r13 # 8-byte Folded Reload
; X64-NEXT: movq %r13, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %r9 # 8-byte Folded Reload
-; X64-NEXT: movq %r9, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rcx # 8-byte Folded Reload
-; X64-NEXT: movq %rcx, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rdi # 8-byte Folded Reload
-; X64-NEXT: movq %rdi, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rsi # 8-byte Reload
-; X64-NEXT: movq %rsi, %rax
+; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rcx # 8-byte Folded Reload
+; X64-NEXT: movq %rcx, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rsi # 8-byte Folded Reload
+; X64-NEXT: movq %rsi, -{{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
-; X64-NEXT: mulq %rdi
-; X64-NEXT: movq %rax, %r11
+; X64-NEXT: movq %rdi, %rax
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi # 8-byte Reload
+; X64-NEXT: mulq %rsi
+; X64-NEXT: movq %rax, %r9
; X64-NEXT: movq %rdx, %rcx
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rax # 8-byte Reload
-; X64-NEXT: movq 24(%rax), %r8
-; X64-NEXT: movq %r8, %rax
-; X64-NEXT: movq %r8, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: mulq %rdi
-; X64-NEXT: movq %rdi, %r13
-; X64-NEXT: movq %rdx, %rdi
+; X64-NEXT: movq 24(%rax), %rbp
+; X64-NEXT: movq %rbp, %rax
+; X64-NEXT: movq %rbp, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: mulq %rsi
+; X64-NEXT: movq %rsi, %r14
+; X64-NEXT: movq %rdx, %rsi
; X64-NEXT: movq %rax, %rbx
; X64-NEXT: addq %rcx, %rbx
-; X64-NEXT: adcq $0, %rdi
-; X64-NEXT: movq %rsi, %rax
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rbp # 8-byte Reload
-; X64-NEXT: mulq %rbp
+; X64-NEXT: adcq $0, %rsi
+; X64-NEXT: movq %rdi, %rax
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
+; X64-NEXT: mulq %rdi
; X64-NEXT: movq %rdx, %rcx
; X64-NEXT: movq %rax, %r15
; X64-NEXT: addq %rbx, %r15
-; X64-NEXT: adcq $0, %rcx
-; X64-NEXT: addq %rdi, %rcx
+; X64-NEXT: adcq %rsi, %rcx
; X64-NEXT: sbbq %rsi, %rsi
; X64-NEXT: andl $1, %esi
-; X64-NEXT: movq %r8, %rax
-; X64-NEXT: mulq %rbp
-; X64-NEXT: movq %rbp, %r14
+; X64-NEXT: movq %rbp, %rax
+; X64-NEXT: mulq %rdi
+; X64-NEXT: movq %rdi, %r11
; X64-NEXT: addq %rcx, %rax
; X64-NEXT: adcq %rsi, %rdx
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r8 # 8-byte Reload
-; X64-NEXT: addq -{{[0-9]+}}(%rsp), %r8 # 8-byte Folded Reload
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %r10 # 8-byte Reload
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %r8 # 8-byte Reload
+; X64-NEXT: addq {{[0-9]+}}(%rsp), %r8 # 8-byte Folded Reload
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r10 # 8-byte Reload
; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r10 # 8-byte Folded Reload
; X64-NEXT: addq %rax, %r8
; X64-NEXT: adcq %rdx, %r10
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi # 8-byte Reload
-; X64-NEXT: movq %rsi, %rax
-; X64-NEXT: mulq %r13
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
+; X64-NEXT: movq %rdi, %rax
+; X64-NEXT: movq %r14, %rsi
+; X64-NEXT: mulq %rsi
; X64-NEXT: movq %rdx, %rcx
; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rbp # 8-byte Reload
-; X64-NEXT: movq %rbp, %rax
-; X64-NEXT: mulq %r13
-; X64-NEXT: movq %rdx, %rdi
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %r14 # 8-byte Reload
+; X64-NEXT: movq %r14, %rax
+; X64-NEXT: mulq %rsi
+; X64-NEXT: movq %rdx, %rsi
; X64-NEXT: movq %rax, %rbx
; X64-NEXT: addq %rcx, %rbx
-; X64-NEXT: adcq $0, %rdi
-; X64-NEXT: movq %rsi, %rax
-; X64-NEXT: movq %rsi, %r9
-; X64-NEXT: mulq %r14
-; X64-NEXT: movq %rdx, %rsi
-; X64-NEXT: addq %rbx, %rax
-; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: adcq $0, %rsi
-; X64-NEXT: addq %rdi, %rsi
-; X64-NEXT: sbbq %rdi, %rdi
-; X64-NEXT: andl $1, %edi
-; X64-NEXT: movq %rbp, %rax
-; X64-NEXT: mulq %r14
+; X64-NEXT: movq %rdi, %rax
+; X64-NEXT: mulq %r11
; X64-NEXT: movq %rdx, %rcx
-; X64-NEXT: movq %rax, %rbx
-; X64-NEXT: addq %rsi, %rbx
-; X64-NEXT: adcq %rdi, %rcx
-; X64-NEXT: addq -{{[0-9]+}}(%rsp), %rbx # 8-byte Folded Reload
-; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rcx # 8-byte Folded Reload
-; X64-NEXT: addq %r11, %rbx
-; X64-NEXT: adcq %r15, %rcx
+; X64-NEXT: addq %rbx, %rax
+; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq %rsi, %rcx
+; X64-NEXT: sbbq %rbx, %rbx
+; X64-NEXT: andl $1, %ebx
+; X64-NEXT: movq %r14, %rax
+; X64-NEXT: mulq %r11
+; X64-NEXT: movq %rdx, %r11
+; X64-NEXT: movq %rax, %rsi
+; X64-NEXT: addq %rcx, %rsi
+; X64-NEXT: adcq %rbx, %r11
+; X64-NEXT: addq -{{[0-9]+}}(%rsp), %rsi # 8-byte Folded Reload
+; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r11 # 8-byte Folded Reload
+; X64-NEXT: addq %r9, %rsi
+; X64-NEXT: adcq %r15, %r11
; X64-NEXT: adcq $0, %r8
; X64-NEXT: adcq $0, %r10
-; X64-NEXT: movq %r9, %rsi
-; X64-NEXT: movq %rsi, %rax
+; X64-NEXT: movq %rdi, %rbx
+; X64-NEXT: movq %rbx, %rax
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rdi # 8-byte Reload
; X64-NEXT: mulq %rdi
-; X64-NEXT: movq %rdx, %r9
-; X64-NEXT: movq %rax, %r11
-; X64-NEXT: movq %rbp, %r14
+; X64-NEXT: movq %rdx, %rcx
+; X64-NEXT: movq %rax, %r9
; X64-NEXT: movq %r14, %rax
; X64-NEXT: mulq %rdi
-; X64-NEXT: movq %rdi, %r13
+; X64-NEXT: movq %rdi, %r15
; X64-NEXT: movq %rdx, %rdi
; X64-NEXT: movq %rax, %rbp
-; X64-NEXT: addq %r9, %rbp
+; X64-NEXT: addq %rcx, %rbp
; X64-NEXT: adcq $0, %rdi
-; X64-NEXT: movq %rsi, %rax
-; X64-NEXT: mulq %r12
-; X64-NEXT: movq %rdx, %rsi
+; X64-NEXT: movq %rbx, %rax
+; X64-NEXT: movq %r12, %r13
+; X64-NEXT: mulq %r13
+; X64-NEXT: movq %rdx, %rcx
; X64-NEXT: addq %rbp, %rax
-; X64-NEXT: movq %rax, %r15
-; X64-NEXT: adcq $0, %rsi
-; X64-NEXT: addq %rdi, %rsi
+; X64-NEXT: movq %rax, %rbp
+; X64-NEXT: adcq %rdi, %rcx
; X64-NEXT: sbbq %rdi, %rdi
; X64-NEXT: andl $1, %edi
; X64-NEXT: movq %r14, %rax
-; X64-NEXT: mulq %r12
-; X64-NEXT: addq %rsi, %rax
+; X64-NEXT: mulq %r13
+; X64-NEXT: addq %rcx, %rax
; X64-NEXT: adcq %rdi, %rdx
-; X64-NEXT: movq (%rsp), %rsi # 8-byte Reload
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rbx # 8-byte Reload
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r14 # 8-byte Reload
-; X64-NEXT: addq %r14, %rsi
+; X64-NEXT: addq %r14, %rbx
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx # 8-byte Reload
+; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rcx # 8-byte Folded Reload
+; X64-NEXT: addq %rax, %rbx
+; X64-NEXT: adcq %rdx, %rcx
+; X64-NEXT: addq %rsi, %r9
+; X64-NEXT: movq %r9, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq %r11, %rbp
+; X64-NEXT: movq %rbp, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq $0, %rbx
+; X64-NEXT: adcq $0, %rcx
+; X64-NEXT: addq %r8, %rbx
+; X64-NEXT: adcq %r10, %rcx
+; X64-NEXT: movl $0, %r12d
+; X64-NEXT: adcq $0, %r12
+; X64-NEXT: sbbq %r9, %r9
+; X64-NEXT: andl $1, %r9d
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rbp # 8-byte Reload
-; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rbp # 8-byte Folded Reload
-; X64-NEXT: addq %rax, %rsi
-; X64-NEXT: adcq %rdx, %rbp
-; X64-NEXT: addq %rbx, %r11
-; X64-NEXT: movq %r11, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq %rcx, %r15
-; X64-NEXT: movq %r15, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: movq %rbp, %rax
+; X64-NEXT: mulq %r15
+; X64-NEXT: movq %rdx, %r8
+; X64-NEXT: movq %rax, %r11
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %r10 # 8-byte Reload
+; X64-NEXT: movq %r10, %rax
+; X64-NEXT: mulq %r15
+; X64-NEXT: movq %rdx, %rsi
+; X64-NEXT: movq %rax, %rdi
+; X64-NEXT: addq %r8, %rdi
; X64-NEXT: adcq $0, %rsi
-; X64-NEXT: adcq $0, %rbp
-; X64-NEXT: addq %r8, %rsi
-; X64-NEXT: adcq %r10, %rbp
-; X64-NEXT: movl $0, %r10d
-; X64-NEXT: adcq $0, %r10
-; X64-NEXT: sbbq %r15, %r15
-; X64-NEXT: andl $1, %r15d
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rcx # 8-byte Reload
-; X64-NEXT: movq %rcx, %rax
+; X64-NEXT: movq %rbp, %rax
; X64-NEXT: mulq %r13
-; X64-NEXT: movq %rdx, %r9
-; X64-NEXT: movq %rax, %r11
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %r8 # 8-byte Reload
-; X64-NEXT: movq %r8, %rax
+; X64-NEXT: movq %rdx, %r8
+; X64-NEXT: movq %rax, %r15
+; X64-NEXT: addq %rdi, %r15
+; X64-NEXT: adcq %rsi, %r8
+; X64-NEXT: sbbq %rsi, %rsi
+; X64-NEXT: andl $1, %esi
+; X64-NEXT: movq %r10, %rax
+; X64-NEXT: movq %r10, %rbp
; X64-NEXT: mulq %r13
-; X64-NEXT: movq %rdx, %rdi
-; X64-NEXT: movq %rax, %rbx
-; X64-NEXT: addq %r9, %rbx
-; X64-NEXT: adcq $0, %rdi
-; X64-NEXT: movq %rcx, %rax
-; X64-NEXT: movq %r12, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: mulq %r12
-; X64-NEXT: movq %rdx, %rcx
-; X64-NEXT: movq %rax, %r9
-; X64-NEXT: addq %rbx, %r9
-; X64-NEXT: adcq $0, %rcx
-; X64-NEXT: addq %rdi, %rcx
-; X64-NEXT: sbbq %rdi, %rdi
-; X64-NEXT: andl $1, %edi
-; X64-NEXT: movq %r8, %rax
-; X64-NEXT: mulq %r12
-; X64-NEXT: addq %rcx, %rax
-; X64-NEXT: adcq %rdi, %rdx
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rcx # 8-byte Reload
-; X64-NEXT: addq %r14, %rcx
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %r12 # 8-byte Reload
-; X64-NEXT: movq %r12, %r13
-; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %r13 # 8-byte Folded Reload
-; X64-NEXT: addq %rax, %rcx
-; X64-NEXT: adcq %rdx, %r13
-; X64-NEXT: addq %rsi, %r11
-; X64-NEXT: adcq %rbp, %r9
-; X64-NEXT: adcq %r10, %rcx
-; X64-NEXT: adcq %r15, %r13
-; X64-NEXT: addq -{{[0-9]+}}(%rsp), %r11 # 8-byte Folded Reload
-; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r9 # 8-byte Folded Reload
-; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rcx # 8-byte Folded Reload
-; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r13 # 8-byte Folded Reload
+; X64-NEXT: addq %r8, %rax
+; X64-NEXT: adcq %rsi, %rdx
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %r10 # 8-byte Reload
+; X64-NEXT: movq %r10, %rsi
+; X64-NEXT: addq %r14, %rsi
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r8 # 8-byte Reload
+; X64-NEXT: movq %r8, %rdi
+; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rdi # 8-byte Folded Reload
+; X64-NEXT: addq %rax, %rsi
+; X64-NEXT: adcq %rdx, %rdi
+; X64-NEXT: addq %rbx, %r11
+; X64-NEXT: adcq %rcx, %r15
+; X64-NEXT: adcq %r12, %rsi
+; X64-NEXT: adcq %r9, %rdi
; X64-NEXT: addq -{{[0-9]+}}(%rsp), %r11 # 8-byte Folded Reload
+; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r15 # 8-byte Folded Reload
+; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rsi # 8-byte Folded Reload
+; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rdi # 8-byte Folded Reload
+; X64-NEXT: addq {{[0-9]+}}(%rsp), %r11 # 8-byte Folded Reload
; X64-NEXT: movq %r11, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r9 # 8-byte Folded Reload
-; X64-NEXT: movq %r9, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rcx # 8-byte Folded Reload
-; X64-NEXT: movq %rcx, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r13 # 8-byte Folded Reload
+; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r15 # 8-byte Folded Reload
+; X64-NEXT: movq %r15, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rsi # 8-byte Folded Reload
+; X64-NEXT: movq %rsi, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rdi # 8-byte Folded Reload
+; X64-NEXT: movq %rdi, {{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: adcq $0, -{{[0-9]+}}(%rsp) # 8-byte Folded Spill
; X64-NEXT: adcq $0, -{{[0-9]+}}(%rsp) # 8-byte Folded Spill
-; X64-NEXT: adcq $0, {{[0-9]+}}(%rsp) # 8-byte Folded Spill
; X64-NEXT: adcq $0, -{{[0-9]+}}(%rsp) # 8-byte Folded Spill
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rsi # 8-byte Reload
-; X64-NEXT: movq %rsi, %rax
+; X64-NEXT: adcq $0, -{{[0-9]+}}(%rsp) # 8-byte Folded Spill
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
+; X64-NEXT: movq %rdi, %rax
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx # 8-byte Reload
; X64-NEXT: mulq %rcx
-; X64-NEXT: movq %rdx, %rdi
-; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %r8, %rax
+; X64-NEXT: movq %rdx, %rsi
+; X64-NEXT: movq %rax, %r14
+; X64-NEXT: movq %rbp, %rax
; X64-NEXT: mulq %rcx
-; X64-NEXT: movq %rcx, %r11
+; X64-NEXT: movq %rcx, %r13
; X64-NEXT: movq %rdx, %rbx
-; X64-NEXT: movq %rax, %rbp
-; X64-NEXT: addq %rdi, %rbp
+; X64-NEXT: movq %rax, %rcx
+; X64-NEXT: addq %rsi, %rcx
; X64-NEXT: adcq $0, %rbx
-; X64-NEXT: movq %rsi, %rax
+; X64-NEXT: movq %rdi, %rax
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
; X64-NEXT: mulq %rdi
-; X64-NEXT: movq %rdx, %rcx
-; X64-NEXT: movq %rax, %r10
-; X64-NEXT: addq %rbp, %r10
-; X64-NEXT: adcq $0, %rcx
-; X64-NEXT: addq %rbx, %rcx
-; X64-NEXT: sbbq %rsi, %rsi
-; X64-NEXT: andl $1, %esi
-; X64-NEXT: movq %r8, %rax
+; X64-NEXT: movq %rdx, %rsi
+; X64-NEXT: movq %rax, %r11
+; X64-NEXT: addq %rcx, %r11
+; X64-NEXT: adcq %rbx, %rsi
+; X64-NEXT: sbbq %rcx, %rcx
+; X64-NEXT: andl $1, %ecx
+; X64-NEXT: movq %rbp, %rax
; X64-NEXT: mulq %rdi
-; X64-NEXT: movq %rdi, %r14
-; X64-NEXT: addq %rcx, %rax
-; X64-NEXT: adcq %rsi, %rdx
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r9 # 8-byte Reload
+; X64-NEXT: movq %rdi, %r15
+; X64-NEXT: addq %rsi, %rax
+; X64-NEXT: adcq %rcx, %rdx
+; X64-NEXT: movq %r10, %r9
; X64-NEXT: addq {{[0-9]+}}(%rsp), %r9 # 8-byte Folded Reload
-; X64-NEXT: movq %r12, %r15
-; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %r15 # 8-byte Folded Reload
+; X64-NEXT: movq %r8, %r12
+; X64-NEXT: adcq (%rsp), %r12 # 8-byte Folded Reload
; X64-NEXT: addq %rax, %r9
-; X64-NEXT: adcq %rdx, %r15
+; X64-NEXT: adcq %rdx, %r12
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx # 8-byte Reload
; X64-NEXT: movq %rcx, %rax
-; X64-NEXT: movq %r11, %rdi
-; X64-NEXT: mulq %rdi
+; X64-NEXT: movq %r13, %rbp
+; X64-NEXT: mulq %rbp
; X64-NEXT: movq %rdx, %r8
; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %r11 # 8-byte Reload
-; X64-NEXT: movq %r11, %rax
-; X64-NEXT: mulq %rdi
-; X64-NEXT: movq %rdx, %rbx
-; X64-NEXT: movq %rax, %rbp
-; X64-NEXT: addq %r8, %rbp
-; X64-NEXT: adcq $0, %rbx
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %r13 # 8-byte Reload
+; X64-NEXT: movq %r13, %rax
+; X64-NEXT: mulq %rbp
+; X64-NEXT: movq %rdx, %rsi
+; X64-NEXT: movq %rax, %rbx
+; X64-NEXT: addq %r8, %rbx
+; X64-NEXT: adcq $0, %rsi
; X64-NEXT: movq %rcx, %rax
-; X64-NEXT: movq %rcx, %r8
-; X64-NEXT: mulq %r14
+; X64-NEXT: movq %rcx, %rbp
+; X64-NEXT: mulq %r15
; X64-NEXT: movq %rdx, %rcx
-; X64-NEXT: addq %rbp, %rax
+; X64-NEXT: addq %rbx, %rax
; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq $0, %rcx
-; X64-NEXT: addq %rbx, %rcx
-; X64-NEXT: sbbq %rbp, %rbp
-; X64-NEXT: andl $1, %ebp
-; X64-NEXT: movq %r11, %rax
-; X64-NEXT: mulq %r14
-; X64-NEXT: movq %rdx, %rsi
+; X64-NEXT: adcq %rsi, %rcx
+; X64-NEXT: sbbq %rsi, %rsi
+; X64-NEXT: andl $1, %esi
+; X64-NEXT: movq %r13, %rax
+; X64-NEXT: mulq %r15
+; X64-NEXT: movq %rdx, %r8
; X64-NEXT: movq %rax, %rbx
; X64-NEXT: addq %rcx, %rbx
-; X64-NEXT: adcq %rbp, %rsi
+; X64-NEXT: adcq %rsi, %r8
; X64-NEXT: addq {{[0-9]+}}(%rsp), %rbx # 8-byte Folded Reload
-; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rsi # 8-byte Folded Reload
-; X64-NEXT: addq -{{[0-9]+}}(%rsp), %rbx # 8-byte Folded Reload
-; X64-NEXT: adcq %r10, %rsi
+; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r8 # 8-byte Folded Reload
+; X64-NEXT: addq %r14, %rbx
+; X64-NEXT: adcq %r11, %r8
; X64-NEXT: adcq $0, %r9
-; X64-NEXT: adcq $0, %r15
-; X64-NEXT: movq %r8, %rbp
-; X64-NEXT: movq %rbp, %rax
+; X64-NEXT: adcq $0, %r12
+; X64-NEXT: movq %rbp, %rsi
+; X64-NEXT: movq %rsi, %rax
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rcx # 8-byte Reload
; X64-NEXT: mulq %rcx
; X64-NEXT: movq %rdx, %r14
-; X64-NEXT: movq %rax, %r8
-; X64-NEXT: movq %r11, %rax
+; X64-NEXT: movq %rax, %r10
+; X64-NEXT: movq %r13, %rax
; X64-NEXT: mulq %rcx
-; X64-NEXT: movq %rdx, %r12
+; X64-NEXT: movq %rdx, %rdi
; X64-NEXT: movq %rax, %rcx
; X64-NEXT: addq %r14, %rcx
-; X64-NEXT: adcq $0, %r12
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rax # 8-byte Reload
-; X64-NEXT: movq 56(%rax), %rdi
-; X64-NEXT: movq %rbp, %rax
-; X64-NEXT: mulq %rdi
-; X64-NEXT: movq %rdi, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %rdx, %rbp
+; X64-NEXT: adcq $0, %rdi
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rax # 8-byte Reload
+; X64-NEXT: movq 56(%rax), %r15
+; X64-NEXT: movq %rsi, %rax
+; X64-NEXT: mulq %r15
+; X64-NEXT: movq %rdx, %rsi
; X64-NEXT: addq %rcx, %rax
-; X64-NEXT: movq %rax, %r10
-; X64-NEXT: adcq $0, %rbp
-; X64-NEXT: addq %r12, %rbp
+; X64-NEXT: movq %rax, %r11
+; X64-NEXT: adcq %rdi, %rsi
; X64-NEXT: sbbq %rcx, %rcx
; X64-NEXT: andl $1, %ecx
-; X64-NEXT: movq %r11, %rax
-; X64-NEXT: mulq %rdi
-; X64-NEXT: addq %rbp, %rax
+; X64-NEXT: movq %r13, %rax
+; X64-NEXT: mulq %r15
+; X64-NEXT: addq %rsi, %rax
; X64-NEXT: adcq %rcx, %rdx
-; X64-NEXT: movq (%rsp), %rcx # 8-byte Reload
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %r11 # 8-byte Reload
-; X64-NEXT: addq %r11, %rcx
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %r12 # 8-byte Reload
-; X64-NEXT: adcq %r12, %rdi
-; X64-NEXT: addq %rax, %rcx
-; X64-NEXT: adcq %rdx, %rdi
-; X64-NEXT: addq %rbx, %r8
-; X64-NEXT: movq %r8, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq %rsi, %r10
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rdi # 8-byte Reload
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %r13 # 8-byte Reload
+; X64-NEXT: addq %r13, %rdi
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi # 8-byte Reload
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rbp # 8-byte Reload
+; X64-NEXT: adcq %rbp, %rsi
+; X64-NEXT: addq %rax, %rdi
+; X64-NEXT: adcq %rdx, %rsi
+; X64-NEXT: addq %rbx, %r10
; X64-NEXT: movq %r10, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq $0, %rcx
+; X64-NEXT: adcq %r8, %r11
+; X64-NEXT: movq %r11, {{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: adcq $0, %rdi
-; X64-NEXT: addq %r9, %rcx
-; X64-NEXT: adcq %r15, %rdi
-; X64-NEXT: movl $0, %r8d
-; X64-NEXT: adcq $0, %r8
-; X64-NEXT: sbbq %r9, %r9
-; X64-NEXT: andl $1, %r9d
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rsi # 8-byte Reload
-; X64-NEXT: movq %rsi, %rax
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rbx # 8-byte Reload
-; X64-NEXT: mulq %rbx
-; X64-NEXT: movq %rdx, %r10
-; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %r14 # 8-byte Reload
-; X64-NEXT: movq %r14, %rax
-; X64-NEXT: mulq %rbx
-; X64-NEXT: movq %rdx, %rbx
-; X64-NEXT: movq %rax, %rbp
-; X64-NEXT: addq %r10, %rbp
-; X64-NEXT: adcq $0, %rbx
-; X64-NEXT: movq %rsi, %rax
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r10 # 8-byte Reload
-; X64-NEXT: mulq %r10
-; X64-NEXT: movq %rdx, %rsi
-; X64-NEXT: movq %rax, %r15
-; X64-NEXT: addq %rbp, %r15
; X64-NEXT: adcq $0, %rsi
-; X64-NEXT: addq %rbx, %rsi
-; X64-NEXT: sbbq %rbp, %rbp
-; X64-NEXT: andl $1, %ebp
-; X64-NEXT: movq %r14, %rax
-; X64-NEXT: mulq %r10
-; X64-NEXT: addq %rsi, %rax
-; X64-NEXT: adcq %rbp, %rdx
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r10 # 8-byte Reload
-; X64-NEXT: addq %r11, %r10
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %r14 # 8-byte Reload
-; X64-NEXT: adcq %r12, %r14
-; X64-NEXT: addq %rax, %r10
-; X64-NEXT: adcq %rdx, %r14
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rax # 8-byte Reload
-; X64-NEXT: addq %rcx, %rax
-; X64-NEXT: adcq %rdi, %r15
-; X64-NEXT: adcq %r8, %r10
-; X64-NEXT: adcq %r9, %r14
-; X64-NEXT: addq {{[0-9]+}}(%rsp), %rax # 8-byte Folded Reload
+; X64-NEXT: addq %r9, %rdi
+; X64-NEXT: adcq %r12, %rsi
+; X64-NEXT: movl $0, %r14d
+; X64-NEXT: adcq $0, %r14
+; X64-NEXT: sbbq %r10, %r10
+; X64-NEXT: andl $1, %r10d
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rbx # 8-byte Reload
+; X64-NEXT: movq %rbx, %rax
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rcx # 8-byte Reload
+; X64-NEXT: mulq %rcx
+; X64-NEXT: movq %rdx, %r8
+; X64-NEXT: movq %rax, %r12
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %r9 # 8-byte Reload
+; X64-NEXT: movq %r9, %rax
+; X64-NEXT: mulq %rcx
+; X64-NEXT: movq %rdx, %r11
+; X64-NEXT: movq %rax, %rcx
+; X64-NEXT: addq %r8, %rcx
+; X64-NEXT: adcq $0, %r11
+; X64-NEXT: movq %rbx, %rax
+; X64-NEXT: movq %r15, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: mulq %r15
+; X64-NEXT: movq %rdx, %r8
+; X64-NEXT: movq %rax, %rbx
+; X64-NEXT: addq %rcx, %rbx
+; X64-NEXT: adcq %r11, %r8
+; X64-NEXT: sbbq %rcx, %rcx
+; X64-NEXT: andl $1, %ecx
+; X64-NEXT: movq %r9, %rax
+; X64-NEXT: mulq %r15
+; X64-NEXT: addq %r8, %rax
+; X64-NEXT: adcq %rcx, %rdx
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %r15 # 8-byte Reload
+; X64-NEXT: addq %r13, %r15
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r11 # 8-byte Reload
+; X64-NEXT: adcq %rbp, %r11
+; X64-NEXT: addq %rax, %r15
+; X64-NEXT: adcq %rdx, %r11
+; X64-NEXT: addq %rdi, %r12
+; X64-NEXT: adcq %rsi, %rbx
+; X64-NEXT: adcq %r14, %r15
+; X64-NEXT: adcq %r10, %r11
+; X64-NEXT: addq {{[0-9]+}}(%rsp), %r12 # 8-byte Folded Reload
+; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rbx # 8-byte Folded Reload
; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r15 # 8-byte Folded Reload
-; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r10 # 8-byte Folded Reload
-; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r14 # 8-byte Folded Reload
+; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r11 # 8-byte Folded Reload
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx # 8-byte Reload
; X64-NEXT: addq %rcx, {{[0-9]+}}(%rsp) # 8-byte Folded Spill
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx # 8-byte Reload
; X64-NEXT: adcq %rcx, {{[0-9]+}}(%rsp) # 8-byte Folded Spill
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx # 8-byte Reload
; X64-NEXT: adcq %rcx, {{[0-9]+}}(%rsp) # 8-byte Folded Spill
-; X64-NEXT: adcq %r13, {{[0-9]+}}(%rsp) # 8-byte Folded Spill
-; X64-NEXT: adcq $0, %rax
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx # 8-byte Reload
+; X64-NEXT: adcq %rcx, {{[0-9]+}}(%rsp) # 8-byte Folded Spill
+; X64-NEXT: adcq $0, %r12
+; X64-NEXT: adcq $0, %rbx
; X64-NEXT: adcq $0, %r15
-; X64-NEXT: adcq $0, %r10
-; X64-NEXT: adcq $0, %r14
-; X64-NEXT: addq -{{[0-9]+}}(%rsp), %rax # 8-byte Folded Reload
-; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq $0, %r11
+; X64-NEXT: addq -{{[0-9]+}}(%rsp), %r12 # 8-byte Folded Reload
+; X64-NEXT: movq %r12, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rbx # 8-byte Folded Reload
+; X64-NEXT: movq %rbx, {{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %r15 # 8-byte Folded Reload
-; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r10 # 8-byte Folded Reload
-; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %r14 # 8-byte Folded Reload
+; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %r11 # 8-byte Folded Reload
; X64-NEXT: movl $0, %eax
; X64-NEXT: adcq $0, %rax
; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
@@ -5122,124 +5110,124 @@ define void @test_1024(i1024* %a, i1024* %b, i1024* %out) nounwind {
; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: movl $0, %eax
; X64-NEXT: adcq $0, %rax
-; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: sbbq %rax, %rax
; X64-NEXT: andl $1, %eax
; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
-; X64-NEXT: movq %rdi, %rax
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx # 8-byte Reload
-; X64-NEXT: mulq %rcx
-; X64-NEXT: movq %rdx, %rsi
-; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rbp # 8-byte Reload
-; X64-NEXT: movq %rbp, %rax
-; X64-NEXT: mulq %rcx
-; X64-NEXT: movq %rcx, %r9
-; X64-NEXT: movq %rdx, %rbx
-; X64-NEXT: movq %rax, %rcx
-; X64-NEXT: addq %rsi, %rcx
-; X64-NEXT: adcq $0, %rbx
-; X64-NEXT: movq %rdi, %rax
+; X64-NEXT: movq %rcx, %rax
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
; X64-NEXT: mulq %rdi
-; X64-NEXT: movq %rdx, %rsi
+; X64-NEXT: movq %rdx, %r8
; X64-NEXT: movq %rax, %r13
-; X64-NEXT: addq %rcx, %r13
-; X64-NEXT: adcq $0, %rsi
-; X64-NEXT: addq %rbx, %rsi
-; X64-NEXT: sbbq %rcx, %rcx
-; X64-NEXT: andl $1, %ecx
-; X64-NEXT: movq %rbp, %rax
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rsi # 8-byte Reload
+; X64-NEXT: movq %rsi, %rax
; X64-NEXT: mulq %rdi
-; X64-NEXT: movq %rdi, %r11
-; X64-NEXT: addq %rsi, %rax
-; X64-NEXT: adcq %rcx, %rdx
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %r12 # 8-byte Reload
-; X64-NEXT: addq {{[0-9]+}}(%rsp), %r12 # 8-byte Folded Reload
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r8 # 8-byte Reload
-; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r8 # 8-byte Folded Reload
-; X64-NEXT: addq %rax, %r12
-; X64-NEXT: adcq %rdx, %r8
+; X64-NEXT: movq %rdi, %r14
+; X64-NEXT: movq %rdx, %rbx
+; X64-NEXT: movq %rax, %rbp
+; X64-NEXT: addq %r8, %rbp
+; X64-NEXT: adcq $0, %rbx
+; X64-NEXT: movq %rcx, %rax
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %r8 # 8-byte Reload
+; X64-NEXT: mulq %r8
+; X64-NEXT: movq %rdx, %rcx
+; X64-NEXT: movq %rax, %r12
+; X64-NEXT: addq %rbp, %r12
+; X64-NEXT: adcq %rbx, %rcx
+; X64-NEXT: sbbq %rbp, %rbp
+; X64-NEXT: andl $1, %ebp
+; X64-NEXT: movq %rsi, %rax
+; X64-NEXT: mulq %r8
+; X64-NEXT: addq %rcx, %rax
+; X64-NEXT: adcq %rbp, %rdx
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %r9 # 8-byte Reload
+; X64-NEXT: addq {{[0-9]+}}(%rsp), %r9 # 8-byte Folded Reload
+; X64-NEXT: movq (%rsp), %r10 # 8-byte Reload
+; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r10 # 8-byte Folded Reload
+; X64-NEXT: addq %rax, %r9
+; X64-NEXT: adcq %rdx, %r10
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
; X64-NEXT: movq %rdi, %rax
-; X64-NEXT: mulq %r9
+; X64-NEXT: movq %r14, %rbx
+; X64-NEXT: mulq %rbx
; X64-NEXT: movq %rdx, %rcx
-; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rbp # 8-byte Reload
-; X64-NEXT: movq %rbp, %rax
-; X64-NEXT: mulq %r9
-; X64-NEXT: movq %rdx, %rsi
-; X64-NEXT: movq %rax, %rbx
-; X64-NEXT: addq %rcx, %rbx
-; X64-NEXT: adcq $0, %rsi
+; X64-NEXT: movq %rax, (%rsp) # 8-byte Spill
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi # 8-byte Reload
+; X64-NEXT: movq %rsi, %rax
+; X64-NEXT: mulq %rbx
+; X64-NEXT: movq %rdx, %rbx
+; X64-NEXT: movq %rax, %rbp
+; X64-NEXT: addq %rcx, %rbp
+; X64-NEXT: adcq $0, %rbx
; X64-NEXT: movq %rdi, %rax
-; X64-NEXT: movq %rdi, %r9
-; X64-NEXT: mulq %r11
+; X64-NEXT: movq %rdi, %r14
+; X64-NEXT: mulq %r8
; X64-NEXT: movq %rdx, %rcx
-; X64-NEXT: addq %rbx, %rax
+; X64-NEXT: addq %rbp, %rax
; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq $0, %rcx
-; X64-NEXT: addq %rsi, %rcx
+; X64-NEXT: adcq %rbx, %rcx
; X64-NEXT: sbbq %rdi, %rdi
; X64-NEXT: andl $1, %edi
-; X64-NEXT: movq %rbp, %rax
-; X64-NEXT: mulq %r11
-; X64-NEXT: movq %rdx, %r11
-; X64-NEXT: movq %rax, %rsi
-; X64-NEXT: addq %rcx, %rsi
-; X64-NEXT: adcq %rdi, %r11
-; X64-NEXT: addq {{[0-9]+}}(%rsp), %rsi # 8-byte Folded Reload
-; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r11 # 8-byte Folded Reload
-; X64-NEXT: addq -{{[0-9]+}}(%rsp), %rsi # 8-byte Folded Reload
-; X64-NEXT: adcq %r13, %r11
-; X64-NEXT: adcq $0, %r12
-; X64-NEXT: adcq $0, %r8
-; X64-NEXT: movq %r8, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %r9, %rdi
-; X64-NEXT: movq %rdi, %rax
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rcx # 8-byte Reload
-; X64-NEXT: mulq %rcx
-; X64-NEXT: movq %rdx, %r8
-; X64-NEXT: movq %rax, %r13
-; X64-NEXT: movq %rbp, %rax
-; X64-NEXT: movq %rbp, %r9
-; X64-NEXT: mulq %rcx
-; X64-NEXT: movq %rdx, %rbp
-; X64-NEXT: movq %rax, %rcx
-; X64-NEXT: addq %r8, %rcx
-; X64-NEXT: adcq $0, %rbp
-; X64-NEXT: movq %rdi, %rax
+; X64-NEXT: movq %rsi, %rax
+; X64-NEXT: mulq %r8
+; X64-NEXT: movq %rdx, %rbx
+; X64-NEXT: movq %rax, %rbp
+; X64-NEXT: addq %rcx, %rbp
+; X64-NEXT: adcq %rdi, %rbx
+; X64-NEXT: addq {{[0-9]+}}(%rsp), %rbp # 8-byte Folded Reload
+; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rbx # 8-byte Folded Reload
+; X64-NEXT: addq %r13, %rbp
+; X64-NEXT: adcq %r12, %rbx
+; X64-NEXT: adcq $0, %r9
+; X64-NEXT: movq %r9, %r12
+; X64-NEXT: adcq $0, %r10
+; X64-NEXT: movq %r10, %r8
+; X64-NEXT: movq %r14, %rax
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rdi # 8-byte Reload
; X64-NEXT: mulq %rdi
-; X64-NEXT: movq %rdx, %rbx
-; X64-NEXT: addq %rcx, %rax
-; X64-NEXT: movq %rax, %r8
-; X64-NEXT: adcq $0, %rbx
-; X64-NEXT: addq %rbp, %rbx
-; X64-NEXT: sbbq %rcx, %rcx
-; X64-NEXT: andl $1, %ecx
-; X64-NEXT: movq %r9, %rax
+; X64-NEXT: movq %rdx, %rcx
+; X64-NEXT: movq %rax, %r9
+; X64-NEXT: movq %rsi, %rax
+; X64-NEXT: movq %rsi, %r10
; X64-NEXT: mulq %rdi
-; X64-NEXT: addq %rbx, %rax
-; X64-NEXT: adcq %rcx, %rdx
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rdi # 8-byte Reload
-; X64-NEXT: addq {{[0-9]+}}(%rsp), %rdi # 8-byte Folded Reload
+; X64-NEXT: movq %rdx, %rsi
+; X64-NEXT: movq %rax, %rdi
+; X64-NEXT: addq %rcx, %rdi
+; X64-NEXT: adcq $0, %rsi
+; X64-NEXT: movq %r14, %rax
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rcx # 8-byte Reload
-; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rcx # 8-byte Folded Reload
-; X64-NEXT: addq %rax, %rdi
+; X64-NEXT: mulq %rcx
+; X64-NEXT: movq %rdx, %r14
+; X64-NEXT: addq %rdi, %rax
+; X64-NEXT: movq %rax, %rdi
+; X64-NEXT: adcq %rsi, %r14
+; X64-NEXT: sbbq %rsi, %rsi
+; X64-NEXT: andl $1, %esi
+; X64-NEXT: movq %r10, %rax
+; X64-NEXT: mulq %rcx
+; X64-NEXT: addq %r14, %rax
+; X64-NEXT: adcq %rsi, %rdx
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rsi # 8-byte Reload
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %r14 # 8-byte Reload
+; X64-NEXT: addq %r14, %rsi
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rcx # 8-byte Reload
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %r13 # 8-byte Reload
+; X64-NEXT: adcq %r13, %rcx
+; X64-NEXT: addq %rax, %rsi
; X64-NEXT: adcq %rdx, %rcx
-; X64-NEXT: addq %rsi, %r13
-; X64-NEXT: adcq %r11, %r8
-; X64-NEXT: movq %r8, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq $0, %rdi
-; X64-NEXT: adcq $0, %rcx
-; X64-NEXT: addq %r12, %rdi
+; X64-NEXT: addq %rbp, %r9
+; X64-NEXT: movq %r9, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq %rbx, %rdi
; X64-NEXT: movq %rdi, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rcx # 8-byte Folded Reload
-; X64-NEXT: movq %rcx, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movl $0, %r12d
-; X64-NEXT: adcq $0, %r12
+; X64-NEXT: adcq $0, %rsi
+; X64-NEXT: adcq $0, %rcx
+; X64-NEXT: addq %r12, %rsi
+; X64-NEXT: movq %rsi, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq %r8, %rcx
+; X64-NEXT: movq %rcx, %r12
+; X64-NEXT: movl $0, %r10d
+; X64-NEXT: adcq $0, %r10
; X64-NEXT: sbbq %r9, %r9
; X64-NEXT: andl $1, %r9d
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rbx # 8-byte Reload
@@ -5247,678 +5235,679 @@ define void @test_1024(i1024* %a, i1024* %b, i1024* %out) nounwind {
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rsi # 8-byte Reload
; X64-NEXT: mulq %rsi
; X64-NEXT: movq %rdx, %rcx
-; X64-NEXT: movq %rax, %r11
+; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r8 # 8-byte Reload
; X64-NEXT: movq %r8, %rax
; X64-NEXT: mulq %rsi
; X64-NEXT: movq %rdx, %rsi
-; X64-NEXT: movq %rax, %rbp
-; X64-NEXT: addq %rcx, %rbp
+; X64-NEXT: movq %rax, %rdi
+; X64-NEXT: addq %rcx, %rdi
; X64-NEXT: adcq $0, %rsi
; X64-NEXT: movq %rbx, %rax
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rdi # 8-byte Reload
-; X64-NEXT: mulq %rdi
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rbp # 8-byte Reload
+; X64-NEXT: mulq %rbp
; X64-NEXT: movq %rdx, %rcx
; X64-NEXT: movq %rax, %rbx
-; X64-NEXT: addq %rbp, %rbx
-; X64-NEXT: adcq $0, %rcx
-; X64-NEXT: addq %rsi, %rcx
+; X64-NEXT: addq %rdi, %rbx
+; X64-NEXT: adcq %rsi, %rcx
; X64-NEXT: sbbq %rsi, %rsi
; X64-NEXT: andl $1, %esi
; X64-NEXT: movq %r8, %rax
-; X64-NEXT: mulq %rdi
+; X64-NEXT: mulq %rbp
; X64-NEXT: addq %rcx, %rax
; X64-NEXT: adcq %rsi, %rdx
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi # 8-byte Reload
-; X64-NEXT: addq {{[0-9]+}}(%rsp), %rsi # 8-byte Folded Reload
+; X64-NEXT: addq %r14, %rsi
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx # 8-byte Reload
-; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rcx # 8-byte Folded Reload
+; X64-NEXT: adcq %r13, %rcx
; X64-NEXT: addq %rax, %rsi
; X64-NEXT: adcq %rdx, %rcx
-; X64-NEXT: addq -{{[0-9]+}}(%rsp), %r11 # 8-byte Folded Reload
-; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rbx # 8-byte Folded Reload
-; X64-NEXT: adcq %r12, %rsi
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r13 # 8-byte Reload
+; X64-NEXT: addq -{{[0-9]+}}(%rsp), %r13 # 8-byte Folded Reload
+; X64-NEXT: adcq %r12, %rbx
+; X64-NEXT: adcq %r10, %rsi
; X64-NEXT: adcq %r9, %rcx
-; X64-NEXT: addq {{[0-9]+}}(%rsp), %r11 # 8-byte Folded Reload
+; X64-NEXT: addq {{[0-9]+}}(%rsp), %r13 # 8-byte Folded Reload
; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rbx # 8-byte Folded Reload
; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rsi # 8-byte Folded Reload
; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rcx # 8-byte Folded Reload
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rax # 8-byte Reload
-; X64-NEXT: addq %rax, {{[0-9]+}}(%rsp) # 8-byte Folded Spill
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rax # 8-byte Reload
+; X64-NEXT: addq %rax, (%rsp) # 8-byte Folded Spill
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rax # 8-byte Reload
+; X64-NEXT: adcq %rax, {{[0-9]+}}(%rsp) # 8-byte Folded Spill
; X64-NEXT: adcq %r15, {{[0-9]+}}(%rsp) # 8-byte Folded Spill
-; X64-NEXT: adcq %r10, %r13
+; X64-NEXT: adcq %r11, -{{[0-9]+}}(%rsp) # 8-byte Folded Spill
+; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %r13 # 8-byte Folded Reload
; X64-NEXT: movq %r13, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq %r14, -{{[0-9]+}}(%rsp) # 8-byte Folded Spill
-; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %r11 # 8-byte Folded Reload
-; X64-NEXT: movq %r11, -{{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rbx # 8-byte Folded Reload
-; X64-NEXT: movq %rbx, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rsi # 8-byte Folded Reload
+; X64-NEXT: movq %rbx, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rsi # 8-byte Folded Reload
; X64-NEXT: movq %rsi, {{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rcx # 8-byte Folded Reload
; X64-NEXT: movq %rcx, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi # 8-byte Reload
-; X64-NEXT: movq 64(%rsi), %r14
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rbp # 8-byte Reload
-; X64-NEXT: movq %rbp, %rax
-; X64-NEXT: mulq %r14
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %r9 # 8-byte Reload
+; X64-NEXT: movq 64(%r9), %r11
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rdi # 8-byte Reload
+; X64-NEXT: movq %rdi, %rax
+; X64-NEXT: mulq %r11
; X64-NEXT: movq %rdx, %rcx
; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %r8 # 8-byte Reload
-; X64-NEXT: movq %r8, %rax
-; X64-NEXT: mulq %r14
-; X64-NEXT: movq %rdx, %rdi
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r10 # 8-byte Reload
+; X64-NEXT: movq %r10, %rax
+; X64-NEXT: mulq %r11
+; X64-NEXT: movq %rdx, %rbp
; X64-NEXT: movq %rax, %rbx
; X64-NEXT: addq %rcx, %rbx
-; X64-NEXT: adcq $0, %rdi
-; X64-NEXT: movq 72(%rsi), %rcx
-; X64-NEXT: movq %rsi, %r13
-; X64-NEXT: movq %rbp, %rax
+; X64-NEXT: adcq $0, %rbp
+; X64-NEXT: movq 72(%r9), %rcx
+; X64-NEXT: movq %rdi, %rax
; X64-NEXT: mulq %rcx
; X64-NEXT: movq %rcx, %rsi
; X64-NEXT: movq %rdx, %rcx
-; X64-NEXT: movq %rax, %r10
-; X64-NEXT: addq %rbx, %r10
-; X64-NEXT: adcq $0, %rcx
-; X64-NEXT: addq %rdi, %rcx
-; X64-NEXT: sbbq %rdi, %rdi
-; X64-NEXT: andl $1, %edi
-; X64-NEXT: movq %r8, %rax
+; X64-NEXT: movq %rax, %r8
+; X64-NEXT: addq %rbx, %r8
+; X64-NEXT: adcq %rbp, %rcx
+; X64-NEXT: sbbq %rbp, %rbp
+; X64-NEXT: andl $1, %ebp
+; X64-NEXT: movq %r10, %rax
; X64-NEXT: mulq %rsi
-; X64-NEXT: movq %rsi, %r8
+; X64-NEXT: movq %rsi, %r10
+; X64-NEXT: movq %r10, -{{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: movq %rdx, %rsi
-; X64-NEXT: movq %rax, %rbp
-; X64-NEXT: addq %rcx, %rbp
-; X64-NEXT: adcq %rdi, %rsi
-; X64-NEXT: movq %r14, %rax
+; X64-NEXT: movq %rax, %rdi
+; X64-NEXT: addq %rcx, %rdi
+; X64-NEXT: adcq %rbp, %rsi
+; X64-NEXT: movq %r11, %rax
; X64-NEXT: xorl %ecx, %ecx
; X64-NEXT: mulq %rcx
; X64-NEXT: movq %rax, %rbx
-; X64-NEXT: movq %rdx, %r11
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r15 # 8-byte Reload
-; X64-NEXT: addq %rbx, %r15
+; X64-NEXT: movq %rdx, %r14
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r12 # 8-byte Reload
-; X64-NEXT: adcq %r11, %r12
-; X64-NEXT: addq %rbp, %r15
-; X64-NEXT: adcq %rsi, %r12
+; X64-NEXT: addq %rbx, %r12
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r15 # 8-byte Reload
+; X64-NEXT: adcq %r14, %r15
+; X64-NEXT: addq %rdi, %r12
+; X64-NEXT: adcq %rsi, %r15
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx # 8-byte Reload
; X64-NEXT: movq %rcx, %rax
-; X64-NEXT: movq %r14, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: mulq %r14
-; X64-NEXT: movq %rdx, %r9
+; X64-NEXT: movq %r11, %rsi
+; X64-NEXT: movq %rsi, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: mulq %rsi
+; X64-NEXT: movq %rdx, %r11
; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
-; X64-NEXT: movq %rdi, %rax
-; X64-NEXT: mulq %r14
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rbp # 8-byte Reload
+; X64-NEXT: movq %rbp, %rax
+; X64-NEXT: mulq %rsi
; X64-NEXT: movq %rdx, %rsi
-; X64-NEXT: movq %rax, %rbp
-; X64-NEXT: addq %r9, %rbp
+; X64-NEXT: movq %rax, %rdi
+; X64-NEXT: addq %r11, %rdi
; X64-NEXT: adcq $0, %rsi
; X64-NEXT: movq %rcx, %rax
-; X64-NEXT: movq %rcx, %r14
-; X64-NEXT: movq %r8, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: mulq %r8
+; X64-NEXT: movq %rcx, %r11
+; X64-NEXT: mulq %r10
; X64-NEXT: movq %rdx, %rcx
-; X64-NEXT: addq %rbp, %rax
+; X64-NEXT: addq %rdi, %rax
; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq $0, %rcx
-; X64-NEXT: addq %rsi, %rcx
+; X64-NEXT: adcq %rsi, %rcx
; X64-NEXT: sbbq %rsi, %rsi
; X64-NEXT: andl $1, %esi
-; X64-NEXT: movq %rdi, %rax
-; X64-NEXT: movq %rdi, %r9
-; X64-NEXT: mulq %r8
+; X64-NEXT: movq %rbp, %rax
+; X64-NEXT: movq %rbp, %rdi
+; X64-NEXT: mulq %r10
; X64-NEXT: addq %rcx, %rax
; X64-NEXT: adcq %rsi, %rdx
-; X64-NEXT: addq -{{[0-9]+}}(%rsp), %rbx # 8-byte Folded Reload
-; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r11 # 8-byte Folded Reload
+; X64-NEXT: addq {{[0-9]+}}(%rsp), %rbx # 8-byte Folded Reload
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %r13 # 8-byte Reload
+; X64-NEXT: adcq %r13, %r14
; X64-NEXT: addq %rax, %rbx
-; X64-NEXT: adcq %rdx, %r11
+; X64-NEXT: adcq %rdx, %r14
; X64-NEXT: addq -{{[0-9]+}}(%rsp), %rbx # 8-byte Folded Reload
-; X64-NEXT: adcq %r10, %r11
-; X64-NEXT: adcq $0, %r15
+; X64-NEXT: adcq %r8, %r14
; X64-NEXT: adcq $0, %r12
-; X64-NEXT: movq 80(%r13), %rbp
-; X64-NEXT: movq %r14, %rsi
-; X64-NEXT: movq %rsi, %rax
-; X64-NEXT: mulq %rbp
-; X64-NEXT: movq %rdx, %r8
-; X64-NEXT: movq %rax, %r14
-; X64-NEXT: movq %r9, %rax
-; X64-NEXT: mulq %rbp
+; X64-NEXT: adcq $0, %r15
+; X64-NEXT: movq %r9, %rbp
+; X64-NEXT: movq 80(%rbp), %r8
+; X64-NEXT: movq %r11, %rax
+; X64-NEXT: movq %r11, %r9
+; X64-NEXT: mulq %r8
; X64-NEXT: movq %rdx, %r10
+; X64-NEXT: movq %rax, %r11
+; X64-NEXT: movq %rdi, %rax
+; X64-NEXT: mulq %r8
+; X64-NEXT: movq %rdx, %rsi
; X64-NEXT: movq %rax, %rcx
-; X64-NEXT: addq %r8, %rcx
-; X64-NEXT: adcq $0, %r10
-; X64-NEXT: movq 88(%r13), %r13
-; X64-NEXT: movq %rsi, %rax
-; X64-NEXT: mulq %r13
-; X64-NEXT: movq %rdx, %rdi
-; X64-NEXT: movq %rax, %r8
-; X64-NEXT: addq %rcx, %r8
-; X64-NEXT: adcq $0, %rdi
-; X64-NEXT: addq %r10, %rdi
+; X64-NEXT: addq %r10, %rcx
+; X64-NEXT: adcq $0, %rsi
+; X64-NEXT: movq 88(%rbp), %r10
+; X64-NEXT: movq %r9, %rax
+; X64-NEXT: mulq %r10
+; X64-NEXT: movq %rdx, %rbp
+; X64-NEXT: movq %rax, %r9
+; X64-NEXT: addq %rcx, %r9
+; X64-NEXT: adcq %rsi, %rbp
; X64-NEXT: sbbq %rsi, %rsi
; X64-NEXT: andl $1, %esi
-; X64-NEXT: movq %r9, %rax
-; X64-NEXT: mulq %r13
-; X64-NEXT: movq %rdx, %r10
+; X64-NEXT: movq %rdi, %rax
+; X64-NEXT: mulq %r10
+; X64-NEXT: movq %rdx, %rdi
; X64-NEXT: movq %rax, %rcx
-; X64-NEXT: addq %rdi, %rcx
-; X64-NEXT: adcq %rsi, %r10
-; X64-NEXT: movq %rbp, %rax
+; X64-NEXT: addq %rbp, %rcx
+; X64-NEXT: adcq %rsi, %rdi
+; X64-NEXT: movq %r8, %rax
; X64-NEXT: xorl %edx, %edx
; X64-NEXT: mulq %rdx
-; X64-NEXT: movq %rdx, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %rax, %rdi
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rsi # 8-byte Reload
-; X64-NEXT: addq %rdi, %rsi
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rax # 8-byte Reload
+; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi # 8-byte Reload
+; X64-NEXT: addq %rax, %rsi
+; X64-NEXT: movq %r13, %rax
; X64-NEXT: adcq %rdx, %rax
+; X64-NEXT: movq %rdx, %r13
; X64-NEXT: addq %rcx, %rsi
-; X64-NEXT: adcq %r10, %rax
-; X64-NEXT: addq %rbx, %r14
-; X64-NEXT: movq %r14, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq %r11, %r8
-; X64-NEXT: movq %r8, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq %rdi, %rax
+; X64-NEXT: addq %rbx, %r11
+; X64-NEXT: movq %r11, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq %r14, %r9
+; X64-NEXT: movq %r9, {{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: adcq $0, %rsi
; X64-NEXT: adcq $0, %rax
-; X64-NEXT: addq %r15, %rsi
-; X64-NEXT: movq %rsi, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq %r12, %rax
-; X64-NEXT: movq %rax, %r10
-; X64-NEXT: movl $0, %r15d
-; X64-NEXT: adcq $0, %r15
-; X64-NEXT: sbbq %r12, %r12
-; X64-NEXT: andl $1, %r12d
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rcx # 8-byte Reload
-; X64-NEXT: movq %rcx, %rax
-; X64-NEXT: mulq %rbp
-; X64-NEXT: movq %rdx, %r8
-; X64-NEXT: movq %rax, %r14
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %r11 # 8-byte Reload
-; X64-NEXT: movq %r11, %rax
-; X64-NEXT: mulq %rbp
+; X64-NEXT: addq %r12, %rsi
+; X64-NEXT: movq %rsi, %r14
+; X64-NEXT: adcq %r15, %rax
+; X64-NEXT: movq %rax, %r9
+; X64-NEXT: movl $0, %r12d
+; X64-NEXT: adcq $0, %r12
+; X64-NEXT: sbbq %r11, %r11
+; X64-NEXT: andl $1, %r11d
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rdi # 8-byte Reload
+; X64-NEXT: movq %rdi, %rax
+; X64-NEXT: mulq %r8
+; X64-NEXT: movq %rdx, %rcx
+; X64-NEXT: movq %rax, %r15
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rbp # 8-byte Reload
+; X64-NEXT: movq %rbp, %rax
+; X64-NEXT: mulq %r8
; X64-NEXT: movq %rdx, %rsi
; X64-NEXT: movq %rax, %rbx
-; X64-NEXT: addq %r8, %rbx
+; X64-NEXT: addq %rcx, %rbx
; X64-NEXT: adcq $0, %rsi
-; X64-NEXT: movq %rcx, %rax
-; X64-NEXT: mulq %r13
+; X64-NEXT: movq %rdi, %rax
+; X64-NEXT: mulq %r10
; X64-NEXT: movq %rdx, %rcx
; X64-NEXT: addq %rbx, %rax
-; X64-NEXT: movq %rax, %rbx
-; X64-NEXT: adcq $0, %rcx
-; X64-NEXT: addq %rsi, %rcx
+; X64-NEXT: movq %rax, %rdi
+; X64-NEXT: adcq %rsi, %rcx
; X64-NEXT: sbbq %rsi, %rsi
; X64-NEXT: andl $1, %esi
-; X64-NEXT: movq %r11, %rax
-; X64-NEXT: mulq %r13
+; X64-NEXT: movq %rbp, %rax
+; X64-NEXT: mulq %r10
; X64-NEXT: addq %rcx, %rax
; X64-NEXT: adcq %rsi, %rdx
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rsi # 8-byte Reload
-; X64-NEXT: addq %rdi, %rsi
+; X64-NEXT: addq -{{[0-9]+}}(%rsp), %rsi # 8-byte Folded Reload
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rcx # 8-byte Reload
-; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rcx # 8-byte Folded Reload
+; X64-NEXT: adcq %r13, %rcx
; X64-NEXT: addq %rax, %rsi
; X64-NEXT: adcq %rdx, %rcx
-; X64-NEXT: addq -{{[0-9]+}}(%rsp), %r14 # 8-byte Folded Reload
-; X64-NEXT: movq %r14, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq %r10, %rbx
-; X64-NEXT: movq %rbx, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq %r15, %rsi
+; X64-NEXT: addq %r14, %r15
+; X64-NEXT: movq %r15, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq %r9, %rdi
+; X64-NEXT: movq %rdi, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq %r12, %rsi
; X64-NEXT: movq %rsi, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq %r12, %rcx
+; X64-NEXT: adcq %r11, %rcx
; X64-NEXT: movq %rcx, -{{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rax # 8-byte Reload
-; X64-NEXT: imulq %rax, %r13
-; X64-NEXT: movq %rax, %r8
-; X64-NEXT: mulq %rbp
+; X64-NEXT: imulq %rax, %r10
+; X64-NEXT: movq %rax, %rdi
+; X64-NEXT: mulq %r8
; X64-NEXT: movq %rax, %r9
-; X64-NEXT: addq %r13, %rdx
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
-; X64-NEXT: imulq %rdi, %rbp
-; X64-NEXT: addq %rdx, %rbp
+; X64-NEXT: addq %r10, %rdx
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %r10 # 8-byte Reload
+; X64-NEXT: imulq %r10, %r8
+; X64-NEXT: addq %rdx, %r8
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rax # 8-byte Reload
; X64-NEXT: movq %rax, %rsi
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r12 # 8-byte Reload
-; X64-NEXT: imulq %r12, %rsi
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx # 8-byte Reload
-; X64-NEXT: mulq %rcx
-; X64-NEXT: movq %rax, %r10
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rbx # 8-byte Reload
+; X64-NEXT: imulq %rbx, %rsi
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rbp # 8-byte Reload
+; X64-NEXT: mulq %rbp
+; X64-NEXT: movq %rax, %r11
; X64-NEXT: addq %rsi, %rdx
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rax # 8-byte Reload
-; X64-NEXT: imulq %rcx, %rax
+; X64-NEXT: imulq %rbp, %rax
; X64-NEXT: addq %rdx, %rax
-; X64-NEXT: addq %r9, %r10
-; X64-NEXT: adcq %rbp, %rax
-; X64-NEXT: movq %rax, %r9
-; X64-NEXT: movq %rcx, %rax
-; X64-NEXT: movq %rcx, %rbp
-; X64-NEXT: mulq %r8
+; X64-NEXT: addq %r9, %r11
+; X64-NEXT: adcq %r8, %rax
+; X64-NEXT: movq %rax, %r14
+; X64-NEXT: movq %rbp, %rax
+; X64-NEXT: mulq %rdi
; X64-NEXT: movq %rdx, %rcx
; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %r12, %rax
-; X64-NEXT: mulq %r8
+; X64-NEXT: movq %rbx, %rax
+; X64-NEXT: movq %rbx, %r8
+; X64-NEXT: mulq %rdi
; X64-NEXT: movq %rdx, %rsi
; X64-NEXT: movq %rax, %rbx
; X64-NEXT: addq %rcx, %rbx
; X64-NEXT: adcq $0, %rsi
; X64-NEXT: movq %rbp, %rax
-; X64-NEXT: mulq %rdi
-; X64-NEXT: movq %rdx, %rbp
-; X64-NEXT: movq %rax, %r14
-; X64-NEXT: addq %rbx, %r14
-; X64-NEXT: adcq $0, %rbp
-; X64-NEXT: addq %rsi, %rbp
+; X64-NEXT: movq %r10, %rbp
+; X64-NEXT: mulq %rbp
+; X64-NEXT: movq %rdx, %rdi
+; X64-NEXT: movq %rax, %r15
+; X64-NEXT: addq %rbx, %r15
+; X64-NEXT: adcq %rsi, %rdi
; X64-NEXT: sbbq %rcx, %rcx
; X64-NEXT: andl $1, %ecx
-; X64-NEXT: movq %r12, %rax
-; X64-NEXT: mulq %rdi
+; X64-NEXT: movq %r8, %rax
+; X64-NEXT: mulq %rbp
; X64-NEXT: movq %rdx, %r12
-; X64-NEXT: movq %rax, %r8
-; X64-NEXT: addq %rbp, %r8
+; X64-NEXT: movq %rax, %r9
+; X64-NEXT: addq %rdi, %r9
; X64-NEXT: adcq %rcx, %r12
-; X64-NEXT: addq %r10, %r8
-; X64-NEXT: adcq %r9, %r12
+; X64-NEXT: addq %r11, %r9
+; X64-NEXT: adcq %r14, %r12
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdx # 8-byte Reload
; X64-NEXT: movq 120(%rdx), %rcx
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %r9 # 8-byte Reload
-; X64-NEXT: imulq %r9, %rcx
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %r10 # 8-byte Reload
+; X64-NEXT: imulq %r10, %rcx
; X64-NEXT: movq 112(%rdx), %rsi
-; X64-NEXT: movq %rdx, %rdi
-; X64-NEXT: movq %r9, %rax
+; X64-NEXT: movq %rdx, %rbp
+; X64-NEXT: movq %r10, %rax
; X64-NEXT: mulq %rsi
-; X64-NEXT: movq %rax, %r15
+; X64-NEXT: movq %rax, %r11
; X64-NEXT: addq %rcx, %rdx
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %r10 # 8-byte Reload
-; X64-NEXT: imulq %r10, %rsi
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %r8 # 8-byte Reload
+; X64-NEXT: imulq %r8, %rsi
; X64-NEXT: addq %rdx, %rsi
-; X64-NEXT: movq 96(%rdi), %rbp
-; X64-NEXT: movq 104(%rdi), %rbx
+; X64-NEXT: movq 96(%rbp), %rdi
+; X64-NEXT: movq 104(%rbp), %rbx
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rax # 8-byte Reload
; X64-NEXT: movq %rax, %rcx
; X64-NEXT: imulq %rbx, %rcx
-; X64-NEXT: mulq %rbp
+; X64-NEXT: mulq %rdi
; X64-NEXT: movq %rax, %r13
; X64-NEXT: addq %rcx, %rdx
-; X64-NEXT: imulq %rbp, %r11
-; X64-NEXT: addq %rdx, %r11
-; X64-NEXT: addq %r15, %r13
-; X64-NEXT: adcq %rsi, %r11
-; X64-NEXT: movq %r11, %r15
-; X64-NEXT: movq %rbp, %rax
-; X64-NEXT: mulq %r9
-; X64-NEXT: movq %rdx, %rsi
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rax # 8-byte Reload
+; X64-NEXT: imulq %rdi, %rax
+; X64-NEXT: addq %rdx, %rax
+; X64-NEXT: addq %r11, %r13
+; X64-NEXT: adcq %rsi, %rax
; X64-NEXT: movq %rax, %r11
-; X64-NEXT: movq %rbx, %rax
-; X64-NEXT: mulq %r9
-; X64-NEXT: movq %rdx, %rdi
-; X64-NEXT: movq %rax, %rcx
-; X64-NEXT: addq %rsi, %rcx
-; X64-NEXT: adcq $0, %rdi
-; X64-NEXT: movq %rbp, %rax
+; X64-NEXT: movq %rdi, %rax
; X64-NEXT: mulq %r10
-; X64-NEXT: movq %rdx, %rsi
-; X64-NEXT: movq %rax, %rbp
-; X64-NEXT: addq %rcx, %rbp
-; X64-NEXT: adcq $0, %rsi
-; X64-NEXT: addq %rdi, %rsi
-; X64-NEXT: sbbq %rcx, %rcx
-; X64-NEXT: andl $1, %ecx
+; X64-NEXT: movq %rdx, %rcx
+; X64-NEXT: movq %rax, %r14
; X64-NEXT: movq %rbx, %rax
; X64-NEXT: mulq %r10
-; X64-NEXT: addq %rsi, %rax
-; X64-NEXT: adcq %rcx, %rdx
+; X64-NEXT: movq %rdx, %rbp
+; X64-NEXT: movq %rax, %rsi
+; X64-NEXT: addq %rcx, %rsi
+; X64-NEXT: adcq $0, %rbp
+; X64-NEXT: movq %rdi, %rax
+; X64-NEXT: mulq %r8
+; X64-NEXT: movq %rdx, %rcx
+; X64-NEXT: movq %rax, %rdi
+; X64-NEXT: addq %rsi, %rdi
+; X64-NEXT: adcq %rbp, %rcx
+; X64-NEXT: sbbq %rsi, %rsi
+; X64-NEXT: andl $1, %esi
+; X64-NEXT: movq %rbx, %rax
+; X64-NEXT: mulq %r8
+; X64-NEXT: addq %rcx, %rax
+; X64-NEXT: adcq %rsi, %rdx
; X64-NEXT: addq %r13, %rax
-; X64-NEXT: adcq %r15, %rdx
-; X64-NEXT: addq -{{[0-9]+}}(%rsp), %r11 # 8-byte Folded Reload
-; X64-NEXT: adcq %r14, %rbp
-; X64-NEXT: adcq %r8, %rax
+; X64-NEXT: adcq %r11, %rdx
+; X64-NEXT: addq -{{[0-9]+}}(%rsp), %r14 # 8-byte Folded Reload
+; X64-NEXT: adcq %r15, %rdi
+; X64-NEXT: adcq %r9, %rax
; X64-NEXT: adcq %r12, %rdx
-; X64-NEXT: addq -{{[0-9]+}}(%rsp), %r11 # 8-byte Folded Reload
-; X64-NEXT: movq %r11, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rbp # 8-byte Folded Reload
-; X64-NEXT: movq %rbp, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: addq -{{[0-9]+}}(%rsp), %r14 # 8-byte Folded Reload
+; X64-NEXT: movq %r14, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rdi # 8-byte Folded Reload
+; X64-NEXT: movq %rdi, -{{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rax # 8-byte Folded Reload
; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rdx # 8-byte Folded Reload
; X64-NEXT: movq %rdx, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi # 8-byte Reload
-; X64-NEXT: movq 80(%rsi), %r9
-; X64-NEXT: movq %r9, %rax
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
-; X64-NEXT: mulq %rdi
-; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %rdx, %rcx
-; X64-NEXT: movq 88(%rsi), %r8
-; X64-NEXT: movq %rsi, %r11
-; X64-NEXT: movq %r8, %rax
-; X64-NEXT: movq %r8, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: mulq %rdi
-; X64-NEXT: movq %rdi, %rbx
-; X64-NEXT: movq %rdx, %rsi
-; X64-NEXT: movq %rax, %rdi
-; X64-NEXT: addq %rcx, %rdi
-; X64-NEXT: adcq $0, %rsi
-; X64-NEXT: movq %r9, %rax
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rsi # 8-byte Reload
+; X64-NEXT: movq 80(%rsi), %rcx
+; X64-NEXT: movq %rcx, %rax
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %r8 # 8-byte Reload
+; X64-NEXT: mulq %r8
+; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: movq %rdx, %r9
+; X64-NEXT: movq 88(%rsi), %r10
+; X64-NEXT: movq %rsi, %r12
+; X64-NEXT: movq %r10, %rax
+; X64-NEXT: movq %r10, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: mulq %r8
+; X64-NEXT: movq %rdx, %rbp
+; X64-NEXT: movq %rax, %rbx
+; X64-NEXT: addq %r9, %rbx
+; X64-NEXT: adcq $0, %rbp
+; X64-NEXT: movq %rcx, %rax
+; X64-NEXT: movq %rcx, %r9
; X64-NEXT: movq %r9, -{{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: movq {{[0-9]+}}(%rsp), %r15 # 8-byte Reload
; X64-NEXT: mulq %r15
-; X64-NEXT: movq %rdx, %rbp
-; X64-NEXT: movq %rax, %r14
-; X64-NEXT: addq %rdi, %r14
-; X64-NEXT: adcq $0, %rbp
-; X64-NEXT: addq %rsi, %rbp
+; X64-NEXT: movq %rdx, %rsi
+; X64-NEXT: addq %rbx, %rax
+; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq %rbp, %rsi
; X64-NEXT: sbbq %rdi, %rdi
; X64-NEXT: andl $1, %edi
-; X64-NEXT: movq %r8, %rax
+; X64-NEXT: movq %r10, %rax
; X64-NEXT: mulq %r15
-; X64-NEXT: movq %rdx, %rsi
-; X64-NEXT: movq %rax, %rcx
-; X64-NEXT: addq %rbp, %rcx
-; X64-NEXT: adcq %rdi, %rsi
+; X64-NEXT: movq %rdx, %rbp
+; X64-NEXT: movq %rax, %rbx
+; X64-NEXT: addq %rsi, %rbx
+; X64-NEXT: adcq %rdi, %rbp
; X64-NEXT: movq %r9, %rax
-; X64-NEXT: xorl %r13d, %r13d
-; X64-NEXT: mulq %r13
-; X64-NEXT: movq %rdx, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: xorl %ecx, %ecx
+; X64-NEXT: mulq %rcx
+; X64-NEXT: movq %rdx, %r11
+; X64-NEXT: movq %r11, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: movq %rax, %r10
+; X64-NEXT: movq %r10, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r9 # 8-byte Reload
+; X64-NEXT: addq %r9, %r10
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %r13 # 8-byte Reload
+; X64-NEXT: adcq %r13, %r11
+; X64-NEXT: addq %rbx, %r10
+; X64-NEXT: adcq %rbp, %r11
+; X64-NEXT: movq %r12, %rcx
+; X64-NEXT: movq 64(%rcx), %rdi
+; X64-NEXT: movq %rdi, %rax
+; X64-NEXT: mulq %r8
+; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: movq %rdx, %rsi
+; X64-NEXT: movq 72(%rcx), %r14
+; X64-NEXT: movq %r14, %rax
+; X64-NEXT: mulq %r8
+; X64-NEXT: movq %rdx, %rbp
+; X64-NEXT: movq %rax, %rbx
+; X64-NEXT: addq %rsi, %rbx
+; X64-NEXT: adcq $0, %rbp
+; X64-NEXT: movq %rdi, %rax
+; X64-NEXT: mulq %r15
+; X64-NEXT: movq %rdx, %rsi
+; X64-NEXT: addq %rbx, %rax
; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %rax, %r12
-; X64-NEXT: movq (%rsp), %r10 # 8-byte Reload
-; X64-NEXT: addq %r10, %r12
+; X64-NEXT: adcq %rbp, %rsi
+; X64-NEXT: sbbq %rcx, %rcx
+; X64-NEXT: andl $1, %ecx
+; X64-NEXT: movq %r14, %rax
+; X64-NEXT: mulq %r15
+; X64-NEXT: movq %rdx, %rbx
+; X64-NEXT: movq %rax, %rbp
+; X64-NEXT: addq %rsi, %rbp
+; X64-NEXT: adcq %rcx, %rbx
+; X64-NEXT: movq %rdi, %rax
+; X64-NEXT: xorl %ecx, %ecx
+; X64-NEXT: mulq %rcx
; X64-NEXT: movq %rdx, %r8
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %r9 # 8-byte Reload
-; X64-NEXT: adcq %r9, %r8
-; X64-NEXT: addq %rcx, %r12
-; X64-NEXT: adcq %rsi, %r8
-; X64-NEXT: movq %r11, %rsi
-; X64-NEXT: movq 64(%rsi), %r11
-; X64-NEXT: movq %r11, %rax
-; X64-NEXT: movq %rbx, %rdi
-; X64-NEXT: mulq %rdi
-; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: movq %rax, %r15
+; X64-NEXT: addq %r15, %r9
+; X64-NEXT: movq %r13, %rax
+; X64-NEXT: adcq %r8, %rax
+; X64-NEXT: addq %rbp, %r9
+; X64-NEXT: adcq %rbx, %rax
+; X64-NEXT: addq -{{[0-9]+}}(%rsp), %r9 # 8-byte Folded Reload
+; X64-NEXT: movq %r9, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rax # 8-byte Folded Reload
+; X64-NEXT: movq %rax, %r13
+; X64-NEXT: adcq $0, %r10
+; X64-NEXT: adcq $0, %r11
+; X64-NEXT: movq %rdi, %rax
+; X64-NEXT: movq %rdi, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi # 8-byte Reload
+; X64-NEXT: mulq %rsi
; X64-NEXT: movq %rdx, %rcx
-; X64-NEXT: movq 72(%rsi), %rbx
-; X64-NEXT: movq %rbx, %rax
-; X64-NEXT: mulq %rdi
+; X64-NEXT: movq %rax, %rbx
+; X64-NEXT: movq %r14, %rax
+; X64-NEXT: movq %r14, %r12
+; X64-NEXT: movq %r12, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: mulq %rsi
+; X64-NEXT: movq %rsi, %r14
; X64-NEXT: movq %rdx, %rsi
; X64-NEXT: movq %rax, %rbp
; X64-NEXT: addq %rcx, %rbp
; X64-NEXT: adcq $0, %rsi
-; X64-NEXT: movq %r11, %rax
-; X64-NEXT: mulq %r15
-; X64-NEXT: movq %rdx, %rcx
-; X64-NEXT: addq %rbp, %rax
-; X64-NEXT: movq %rax, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq $0, %rcx
-; X64-NEXT: addq %rsi, %rcx
-; X64-NEXT: sbbq %rdi, %rdi
-; X64-NEXT: andl $1, %edi
-; X64-NEXT: movq %rbx, %rax
-; X64-NEXT: mulq %r15
-; X64-NEXT: movq %rdx, %rsi
-; X64-NEXT: movq %rax, %rbp
-; X64-NEXT: addq %rcx, %rbp
-; X64-NEXT: adcq %rdi, %rsi
-; X64-NEXT: movq %r11, %rdi
-; X64-NEXT: movq %rdi, {{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: movq %rdi, %rax
-; X64-NEXT: mulq %r13
-; X64-NEXT: movq %rdx, %r11
-; X64-NEXT: movq %rax, %r13
-; X64-NEXT: addq %r13, %r10
-; X64-NEXT: adcq %r11, %r9
-; X64-NEXT: addq %rbp, %r10
-; X64-NEXT: adcq %rsi, %r9
-; X64-NEXT: addq {{[0-9]+}}(%rsp), %r10 # 8-byte Folded Reload
-; X64-NEXT: movq %r10, (%rsp) # 8-byte Spill
-; X64-NEXT: adcq %r14, %r9
-; X64-NEXT: movq %r9, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq $0, %r12
-; X64-NEXT: adcq $0, %r8
-; X64-NEXT: movq %rdi, %rax
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rcx # 8-byte Reload
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx # 8-byte Reload
; X64-NEXT: mulq %rcx
; X64-NEXT: movq %rdx, %r9
-; X64-NEXT: movq %rax, %r15
-; X64-NEXT: movq %rbx, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %rbx, %rax
-; X64-NEXT: mulq %rcx
-; X64-NEXT: movq %rdx, %rbp
-; X64-NEXT: movq %rax, %rsi
-; X64-NEXT: addq %r9, %rsi
-; X64-NEXT: adcq $0, %rbp
-; X64-NEXT: movq %rdi, %rax
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %r10 # 8-byte Reload
-; X64-NEXT: mulq %r10
-; X64-NEXT: movq %rdx, %rcx
; X64-NEXT: movq %rax, %rdi
-; X64-NEXT: addq %rsi, %rdi
-; X64-NEXT: adcq $0, %rcx
-; X64-NEXT: addq %rbp, %rcx
+; X64-NEXT: addq %rbp, %rdi
+; X64-NEXT: adcq %rsi, %r9
; X64-NEXT: sbbq %rsi, %rsi
; X64-NEXT: andl $1, %esi
-; X64-NEXT: movq %rbx, %rax
-; X64-NEXT: mulq %r10
-; X64-NEXT: addq %rcx, %rax
+; X64-NEXT: movq %r12, %rax
+; X64-NEXT: mulq %rcx
+; X64-NEXT: movq %rcx, %rbp
+; X64-NEXT: addq %r9, %rax
; X64-NEXT: adcq %rsi, %rdx
-; X64-NEXT: addq -{{[0-9]+}}(%rsp), %r13 # 8-byte Folded Reload
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %r14 # 8-byte Reload
-; X64-NEXT: adcq %r14, %r11
-; X64-NEXT: addq %rax, %r13
-; X64-NEXT: adcq %rdx, %r11
-; X64-NEXT: addq (%rsp), %r15 # 8-byte Folded Reload
-; X64-NEXT: movq %r15, (%rsp) # 8-byte Spill
-; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rdi # 8-byte Folded Reload
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %r12 # 8-byte Reload
+; X64-NEXT: addq %r12, %r15
+; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %r8 # 8-byte Folded Reload
+; X64-NEXT: addq %rax, %r15
+; X64-NEXT: adcq %rdx, %r8
+; X64-NEXT: addq -{{[0-9]+}}(%rsp), %rbx # 8-byte Folded Reload
+; X64-NEXT: movq %rbx, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq %r13, %rdi
; X64-NEXT: movq %rdi, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq $0, %r13
-; X64-NEXT: adcq $0, %r11
-; X64-NEXT: addq %r12, %r13
-; X64-NEXT: adcq %r8, %r11
-; X64-NEXT: movl $0, %r8d
+; X64-NEXT: adcq $0, %r15
; X64-NEXT: adcq $0, %r8
-; X64-NEXT: sbbq %r9, %r9
-; X64-NEXT: andl $1, %r9d
+; X64-NEXT: addq %r10, %r15
+; X64-NEXT: adcq %r11, %r8
+; X64-NEXT: movl $0, %r9d
+; X64-NEXT: adcq $0, %r9
+; X64-NEXT: sbbq %r13, %r13
+; X64-NEXT: andl $1, %r13d
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rcx # 8-byte Reload
; X64-NEXT: movq %rcx, %rax
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r15 # 8-byte Reload
-; X64-NEXT: mulq %r15
-; X64-NEXT: movq %rdx, %r12
-; X64-NEXT: movq %rax, %rdi
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rbx # 8-byte Reload
-; X64-NEXT: movq %rbx, %rax
-; X64-NEXT: mulq %r15
+; X64-NEXT: movq %r14, %rsi
+; X64-NEXT: mulq %rsi
+; X64-NEXT: movq %rdx, %r14
+; X64-NEXT: movq %rax, %r10
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rdi # 8-byte Reload
+; X64-NEXT: movq %rdi, %rax
+; X64-NEXT: mulq %rsi
+; X64-NEXT: movq %rsi, %r11
; X64-NEXT: movq %rdx, %rsi
-; X64-NEXT: movq %rax, %rbp
-; X64-NEXT: addq %r12, %rbp
+; X64-NEXT: movq %rax, %rbx
+; X64-NEXT: addq %r14, %rbx
; X64-NEXT: adcq $0, %rsi
; X64-NEXT: movq %rcx, %rax
-; X64-NEXT: mulq %r10
+; X64-NEXT: mulq %rbp
; X64-NEXT: movq %rdx, %rcx
-; X64-NEXT: addq %rbp, %rax
-; X64-NEXT: movq %rax, %rbp
-; X64-NEXT: adcq $0, %rcx
-; X64-NEXT: addq %rsi, %rcx
+; X64-NEXT: addq %rbx, %rax
+; X64-NEXT: movq %rax, %rbx
+; X64-NEXT: adcq %rsi, %rcx
; X64-NEXT: sbbq %rsi, %rsi
; X64-NEXT: andl $1, %esi
-; X64-NEXT: movq %rbx, %rax
-; X64-NEXT: mulq %r10
+; X64-NEXT: movq %rdi, %rax
+; X64-NEXT: movq %rdi, %r14
+; X64-NEXT: mulq %rbp
; X64-NEXT: addq %rcx, %rax
; X64-NEXT: adcq %rsi, %rdx
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rsi # 8-byte Reload
-; X64-NEXT: addq -{{[0-9]+}}(%rsp), %rsi # 8-byte Folded Reload
+; X64-NEXT: addq %r12, %rsi
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rcx # 8-byte Reload
-; X64-NEXT: adcq %r14, %rcx
+; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rcx # 8-byte Folded Reload
; X64-NEXT: addq %rax, %rsi
; X64-NEXT: adcq %rdx, %rcx
-; X64-NEXT: addq %r13, %rdi
-; X64-NEXT: movq %rdi, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq %r11, %rbp
-; X64-NEXT: movq %rbp, {{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq %r8, %rsi
+; X64-NEXT: addq %r15, %r10
+; X64-NEXT: movq %r10, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq %r8, %rbx
+; X64-NEXT: movq %rbx, {{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq %r9, %rsi
; X64-NEXT: movq %rsi, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq %r9, %rcx
+; X64-NEXT: adcq %r13, %rcx
; X64-NEXT: movq %rcx, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rbp # 8-byte Reload
-; X64-NEXT: movq 96(%rbp), %rcx
-; X64-NEXT: imulq %rcx, %r10
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rsi # 8-byte Reload
+; X64-NEXT: movq 96(%rsi), %rcx
+; X64-NEXT: imulq %rcx, %rbp
; X64-NEXT: movq %rcx, %rax
-; X64-NEXT: mulq %r15
+; X64-NEXT: movq %r11, %rdi
+; X64-NEXT: mulq %rdi
; X64-NEXT: movq %rax, %r9
-; X64-NEXT: addq %r10, %rdx
-; X64-NEXT: movq 104(%rbp), %r8
-; X64-NEXT: imulq %r8, %r15
-; X64-NEXT: addq %rdx, %r15
-; X64-NEXT: movq 112(%rbp), %rax
-; X64-NEXT: movq %rbp, %rdi
-; X64-NEXT: movq %rax, %rsi
+; X64-NEXT: addq %rbp, %rdx
+; X64-NEXT: movq 104(%rsi), %r8
+; X64-NEXT: imulq %r8, %rdi
+; X64-NEXT: addq %rdx, %rdi
+; X64-NEXT: movq %rdi, %r10
+; X64-NEXT: movq 112(%rsi), %rax
+; X64-NEXT: movq %rsi, %rbp
+; X64-NEXT: movq %rax, %rdi
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rbx # 8-byte Reload
-; X64-NEXT: imulq %rbx, %rsi
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rbp # 8-byte Reload
-; X64-NEXT: mulq %rbp
-; X64-NEXT: movq %rax, %r13
-; X64-NEXT: addq %rsi, %rdx
-; X64-NEXT: movq 120(%rdi), %rdi
-; X64-NEXT: imulq %rbp, %rdi
+; X64-NEXT: imulq %rbx, %rdi
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi # 8-byte Reload
+; X64-NEXT: mulq %rsi
+; X64-NEXT: movq %rax, %r11
+; X64-NEXT: addq %rdi, %rdx
+; X64-NEXT: movq 120(%rbp), %rdi
+; X64-NEXT: imulq %rsi, %rdi
; X64-NEXT: addq %rdx, %rdi
-; X64-NEXT: addq %r9, %r13
-; X64-NEXT: adcq %r15, %rdi
-; X64-NEXT: movq %rbp, %rax
-; X64-NEXT: movq %rbp, %r9
+; X64-NEXT: addq %r9, %r11
+; X64-NEXT: adcq %r10, %rdi
+; X64-NEXT: movq %rsi, %rax
+; X64-NEXT: movq %rsi, %r10
; X64-NEXT: mulq %rcx
-; X64-NEXT: movq %rdx, %rbp
+; X64-NEXT: movq %rdx, %rsi
; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: movq %rbx, %rax
+; X64-NEXT: movq %rbx, %r9
; X64-NEXT: mulq %rcx
; X64-NEXT: movq %rdx, %rcx
-; X64-NEXT: movq %rax, %rsi
-; X64-NEXT: addq %rbp, %rsi
+; X64-NEXT: movq %rax, %rbx
+; X64-NEXT: addq %rsi, %rbx
; X64-NEXT: adcq $0, %rcx
-; X64-NEXT: movq %r9, %rax
+; X64-NEXT: movq %r10, %rax
; X64-NEXT: mulq %r8
-; X64-NEXT: movq %rdx, %rbp
-; X64-NEXT: movq %rax, %r12
-; X64-NEXT: addq %rsi, %r12
-; X64-NEXT: adcq $0, %rbp
-; X64-NEXT: addq %rcx, %rbp
+; X64-NEXT: movq %rdx, %rsi
+; X64-NEXT: movq %rax, %r15
+; X64-NEXT: addq %rbx, %r15
+; X64-NEXT: adcq %rcx, %rsi
; X64-NEXT: sbbq %rcx, %rcx
; X64-NEXT: andl $1, %ecx
-; X64-NEXT: movq %rbx, %rax
+; X64-NEXT: movq %r9, %rax
; X64-NEXT: mulq %r8
-; X64-NEXT: movq %rdx, %r8
-; X64-NEXT: movq %rax, %r9
-; X64-NEXT: addq %rbp, %r9
-; X64-NEXT: adcq %rcx, %r8
-; X64-NEXT: addq %r13, %r9
-; X64-NEXT: adcq %rdi, %r8
+; X64-NEXT: movq %rdx, %rbx
+; X64-NEXT: movq %rax, %r8
+; X64-NEXT: addq %rsi, %r8
+; X64-NEXT: adcq %rcx, %rbx
+; X64-NEXT: addq %r11, %r8
+; X64-NEXT: adcq %rdi, %rbx
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rsi # 8-byte Reload
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rbx # 8-byte Reload
-; X64-NEXT: imulq %rbx, %rsi
-; X64-NEXT: movq %rbx, %rax
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rax # 8-byte Reload
+; X64-NEXT: imulq %rax, %rsi
+; X64-NEXT: movq %rax, %r9
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx # 8-byte Reload
; X64-NEXT: mulq %rcx
-; X64-NEXT: movq %rax, %r10
+; X64-NEXT: movq %rax, %r11
; X64-NEXT: addq %rsi, %rdx
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %r11 # 8-byte Reload
-; X64-NEXT: imulq %r11, %rcx
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %r12 # 8-byte Reload
+; X64-NEXT: imulq %r12, %rcx
; X64-NEXT: addq %rdx, %rcx
-; X64-NEXT: movq %rcx, %rsi
+; X64-NEXT: movq %rcx, %rbp
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rax # 8-byte Reload
; X64-NEXT: movq %rax, %rcx
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %r14 # 8-byte Reload
-; X64-NEXT: imulq %r14, %rcx
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rbp # 8-byte Reload
-; X64-NEXT: mulq %rbp
-; X64-NEXT: movq %rax, %r13
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi # 8-byte Reload
+; X64-NEXT: imulq %rsi, %rcx
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
+; X64-NEXT: mulq %rdi
+; X64-NEXT: movq %rax, %r10
; X64-NEXT: addq %rcx, %rdx
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rax # 8-byte Reload
-; X64-NEXT: imulq %rbp, %rax
-; X64-NEXT: addq %rdx, %rax
-; X64-NEXT: addq %r10, %r13
-; X64-NEXT: adcq %rsi, %rax
-; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %rbp, %rax
-; X64-NEXT: movq %rbp, %r10
-; X64-NEXT: mulq %rbx
-; X64-NEXT: movq %rdx, %rsi
-; X64-NEXT: movq %rax, %rbp
-; X64-NEXT: movq %r14, %rax
-; X64-NEXT: mulq %rbx
-; X64-NEXT: movq %rdx, %rdi
+; X64-NEXT: movq %r14, %r13
+; X64-NEXT: imulq %rdi, %r13
+; X64-NEXT: addq %rdx, %r13
+; X64-NEXT: addq %r11, %r10
+; X64-NEXT: adcq %rbp, %r13
+; X64-NEXT: movq %rdi, %rax
+; X64-NEXT: movq %rdi, %r11
+; X64-NEXT: mulq %r9
+; X64-NEXT: movq %rdx, %rbp
+; X64-NEXT: movq %rax, %rdi
+; X64-NEXT: movq %rsi, %rax
+; X64-NEXT: movq %rsi, %r14
+; X64-NEXT: mulq %r9
+; X64-NEXT: movq %rdx, %r9
; X64-NEXT: movq %rax, %rcx
-; X64-NEXT: addq %rsi, %rcx
-; X64-NEXT: adcq $0, %rdi
-; X64-NEXT: movq %r10, %rax
-; X64-NEXT: mulq %r11
-; X64-NEXT: movq %rdx, %r15
-; X64-NEXT: movq %rax, %r10
-; X64-NEXT: addq %rcx, %r10
-; X64-NEXT: adcq $0, %r15
-; X64-NEXT: addq %rdi, %r15
+; X64-NEXT: addq %rbp, %rcx
+; X64-NEXT: adcq $0, %r9
+; X64-NEXT: movq %r11, %rax
+; X64-NEXT: movq %r12, %rbp
+; X64-NEXT: mulq %rbp
+; X64-NEXT: movq %rdx, %rsi
+; X64-NEXT: movq %rax, %r11
+; X64-NEXT: addq %rcx, %r11
+; X64-NEXT: adcq %r9, %rsi
; X64-NEXT: sbbq %rcx, %rcx
; X64-NEXT: andl $1, %ecx
; X64-NEXT: movq %r14, %rax
-; X64-NEXT: mulq %r11
-; X64-NEXT: addq %r15, %rax
+; X64-NEXT: mulq %rbp
+; X64-NEXT: addq %rsi, %rax
; X64-NEXT: adcq %rcx, %rdx
-; X64-NEXT: addq %r13, %rax
-; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rdx # 8-byte Folded Reload
-; X64-NEXT: addq -{{[0-9]+}}(%rsp), %rbp # 8-byte Folded Reload
-; X64-NEXT: adcq %r12, %r10
-; X64-NEXT: adcq %r9, %rax
-; X64-NEXT: adcq %r8, %rdx
-; X64-NEXT: addq -{{[0-9]+}}(%rsp), %rbp # 8-byte Folded Reload
-; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r10 # 8-byte Folded Reload
+; X64-NEXT: addq %r10, %rax
+; X64-NEXT: adcq %r13, %rdx
+; X64-NEXT: addq -{{[0-9]+}}(%rsp), %rdi # 8-byte Folded Reload
+; X64-NEXT: adcq %r15, %r11
+; X64-NEXT: adcq %r8, %rax
+; X64-NEXT: adcq %rbx, %rdx
+; X64-NEXT: addq -{{[0-9]+}}(%rsp), %rdi # 8-byte Folded Reload
+; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r11 # 8-byte Folded Reload
; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rax # 8-byte Folded Reload
; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rdx # 8-byte Folded Reload
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rcx # 8-byte Reload
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx # 8-byte Reload
; X64-NEXT: addq {{[0-9]+}}(%rsp), %rcx # 8-byte Folded Reload
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
-; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rdi # 8-byte Folded Reload
-; X64-NEXT: movq (%rsp), %rbx # 8-byte Reload
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rsi # 8-byte Reload
+; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rsi # 8-byte Folded Reload
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rbx # 8-byte Reload
; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rbx # 8-byte Folded Reload
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi # 8-byte Reload
-; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rsi # 8-byte Folded Reload
-; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rbp # 8-byte Folded Reload
-; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r10 # 8-byte Folded Reload
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rbp # 8-byte Reload
+; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rbp # 8-byte Folded Reload
+; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rdi # 8-byte Folded Reload
+; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %r11 # 8-byte Folded Reload
; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rax # 8-byte Folded Reload
; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rdx # 8-byte Folded Reload
-; X64-NEXT: addq {{[0-9]+}}(%rsp), %rcx # 8-byte Folded Reload
+; X64-NEXT: addq (%rsp), %rcx # 8-byte Folded Reload
; X64-NEXT: movq %rcx, %r8
-; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rdi # 8-byte Folded Reload
-; X64-NEXT: movq %rdi, %r9
-; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rbx # 8-byte Folded Reload
-; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rsi # 8-byte Folded Reload
+; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rsi # 8-byte Folded Reload
+; X64-NEXT: movq %rsi, %r9
+; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rbx # 8-byte Folded Reload
; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rbp # 8-byte Folded Reload
-; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %r10 # 8-byte Folded Reload
+; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rdi # 8-byte Folded Reload
+; X64-NEXT: adcq {{[0-9]+}}(%rsp), %r11 # 8-byte Folded Reload
; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rax # 8-byte Folded Reload
; X64-NEXT: adcq {{[0-9]+}}(%rsp), %rdx # 8-byte Folded Reload
; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx # 8-byte Reload
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
-; X64-NEXT: movq %rdi, (%rcx)
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
-; X64-NEXT: movq %rdi, 8(%rcx)
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
-; X64-NEXT: movq %rdi, 16(%rcx)
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
-; X64-NEXT: movq %rdi, 24(%rcx)
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
-; X64-NEXT: movq %rdi, 32(%rcx)
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
-; X64-NEXT: movq %rdi, 40(%rcx)
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
-; X64-NEXT: movq %rdi, 48(%rcx)
-; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdi # 8-byte Reload
-; X64-NEXT: movq %rdi, 56(%rcx)
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi # 8-byte Reload
+; X64-NEXT: movq %rsi, (%rcx)
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi # 8-byte Reload
+; X64-NEXT: movq %rsi, 8(%rcx)
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi # 8-byte Reload
+; X64-NEXT: movq %rsi, 16(%rcx)
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi # 8-byte Reload
+; X64-NEXT: movq %rsi, 24(%rcx)
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi # 8-byte Reload
+; X64-NEXT: movq %rsi, 32(%rcx)
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi # 8-byte Reload
+; X64-NEXT: movq %rsi, 40(%rcx)
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi # 8-byte Reload
+; X64-NEXT: movq %rsi, 48(%rcx)
+; X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi # 8-byte Reload
+; X64-NEXT: movq %rsi, 56(%rcx)
; X64-NEXT: movq %r8, 64(%rcx)
; X64-NEXT: movq %r9, 72(%rcx)
; X64-NEXT: movq %rbx, 80(%rcx)
-; X64-NEXT: movq %rsi, 88(%rcx)
-; X64-NEXT: movq %rbp, 96(%rcx)
-; X64-NEXT: movq %r10, 104(%rcx)
+; X64-NEXT: movq %rbp, 88(%rcx)
+; X64-NEXT: movq %rdi, 96(%rcx)
+; X64-NEXT: movq %r11, 104(%rcx)
; X64-NEXT: movq %rax, 112(%rcx)
; X64-NEXT: movq %rdx, 120(%rcx)
-; X64-NEXT: addq $360, %rsp # imm = 0x168
+; X64-NEXT: addq $352, %rsp # imm = 0x160
; X64-NEXT: popq %rbx
; X64-NEXT: popq %r12
; X64-NEXT: popq %r13
diff --git a/test/CodeGen/X86/mul-i256.ll b/test/CodeGen/X86/mul-i256.ll
index bb2989b9298e..341484718652 100644
--- a/test/CodeGen/X86/mul-i256.ll
+++ b/test/CodeGen/X86/mul-i256.ll
@@ -219,7 +219,7 @@ define void @test(i256* %a, i256* %b, i256* %out) #0 {
; X64-NEXT: .cfi_offset %r14, -24
; X64-NEXT: .Lcfi7:
; X64-NEXT: .cfi_offset %r15, -16
-; X64-NEXT: movq %rdx, %r10
+; X64-NEXT: movq %rdx, %r9
; X64-NEXT: movq (%rdi), %r14
; X64-NEXT: movq 8(%rdi), %r8
; X64-NEXT: movq 16(%rdi), %rcx
@@ -230,7 +230,7 @@ define void @test(i256* %a, i256* %b, i256* %out) #0 {
; X64-NEXT: imulq %r12, %rdi
; X64-NEXT: movq %r12, %rax
; X64-NEXT: mulq %rcx
-; X64-NEXT: movq %rax, %r9
+; X64-NEXT: movq %rax, %r10
; X64-NEXT: addq %rdi, %rdx
; X64-NEXT: imulq %r15, %rcx
; X64-NEXT: addq %rdx, %rcx
@@ -243,12 +243,12 @@ define void @test(i256* %a, i256* %b, i256* %out) #0 {
; X64-NEXT: movq 24(%rsi), %rbx
; X64-NEXT: imulq %r14, %rbx
; X64-NEXT: addq %rdx, %rbx
-; X64-NEXT: addq %r9, %r11
+; X64-NEXT: addq %r10, %r11
; X64-NEXT: adcq %rcx, %rbx
; X64-NEXT: movq %r14, %rax
; X64-NEXT: mulq %r12
; X64-NEXT: movq %rdx, %rsi
-; X64-NEXT: movq %rax, %r9
+; X64-NEXT: movq %rax, %r10
; X64-NEXT: movq %r8, %rax
; X64-NEXT: mulq %r12
; X64-NEXT: movq %rdx, %rcx
@@ -260,8 +260,7 @@ define void @test(i256* %a, i256* %b, i256* %out) #0 {
; X64-NEXT: movq %rdx, %rsi
; X64-NEXT: movq %rax, %r14
; X64-NEXT: addq %rdi, %r14
-; X64-NEXT: adcq $0, %rsi
-; X64-NEXT: addq %rcx, %rsi
+; X64-NEXT: adcq %rcx, %rsi
; X64-NEXT: sbbq %rcx, %rcx
; X64-NEXT: andl $1, %ecx
; X64-NEXT: movq %r8, %rax
@@ -270,10 +269,10 @@ define void @test(i256* %a, i256* %b, i256* %out) #0 {
; X64-NEXT: adcq %rcx, %rdx
; X64-NEXT: addq %r11, %rax
; X64-NEXT: adcq %rbx, %rdx
-; X64-NEXT: movq %r9, (%r10)
-; X64-NEXT: movq %r14, 8(%r10)
-; X64-NEXT: movq %rax, 16(%r10)
-; X64-NEXT: movq %rdx, 24(%r10)
+; X64-NEXT: movq %r10, (%r9)
+; X64-NEXT: movq %r14, 8(%r9)
+; X64-NEXT: movq %rax, 16(%r9)
+; X64-NEXT: movq %rdx, 24(%r9)
; X64-NEXT: popq %rbx
; X64-NEXT: popq %r12
; X64-NEXT: popq %r14
diff --git a/test/CodeGen/X86/mul-i512.ll b/test/CodeGen/X86/mul-i512.ll
index d26040059e68..14fbeae52796 100644
--- a/test/CodeGen/X86/mul-i512.ll
+++ b/test/CodeGen/X86/mul-i512.ll
@@ -911,57 +911,57 @@ define void @test_512(i512* %a, i512* %b, i512* %out) nounwind {
; X64-NEXT: pushq %rbx
; X64-NEXT: pushq %rax
; X64-NEXT: movq %rdx, (%rsp) # 8-byte Spill
-; X64-NEXT: movq 24(%rdi), %rbp
-; X64-NEXT: movq 16(%rdi), %r11
+; X64-NEXT: movq 24(%rdi), %r11
+; X64-NEXT: movq 16(%rdi), %r14
; X64-NEXT: movq %rsi, -{{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: movq (%rsi), %rdx
-; X64-NEXT: movq 8(%rsi), %r8
-; X64-NEXT: movq %r11, %rax
+; X64-NEXT: movq 8(%rsi), %rbp
+; X64-NEXT: movq %r14, %rax
; X64-NEXT: movq %rdx, %rsi
; X64-NEXT: mulq %rsi
-; X64-NEXT: movq %rdx, %r10
+; X64-NEXT: movq %rdx, %r8
; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %rbp, %rax
-; X64-NEXT: movq %rbp, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: movq %r11, %rax
+; X64-NEXT: movq %r11, -{{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: mulq %rsi
-; X64-NEXT: movq %rsi, %r9
+; X64-NEXT: movq %rsi, %r10
; X64-NEXT: movq %rdx, %rbx
; X64-NEXT: movq %rax, %rsi
-; X64-NEXT: addq %r10, %rsi
+; X64-NEXT: addq %r8, %rsi
; X64-NEXT: adcq $0, %rbx
-; X64-NEXT: movq %r11, %rax
-; X64-NEXT: movq %r11, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: mulq %r8
+; X64-NEXT: movq %r14, %rax
+; X64-NEXT: movq %r14, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: mulq %rbp
; X64-NEXT: movq %rdx, %rcx
-; X64-NEXT: movq %rax, %r12
-; X64-NEXT: addq %rsi, %r12
-; X64-NEXT: adcq $0, %rcx
-; X64-NEXT: addq %rbx, %rcx
+; X64-NEXT: movq %rax, %r9
+; X64-NEXT: addq %rsi, %r9
+; X64-NEXT: adcq %rbx, %rcx
; X64-NEXT: sbbq %rbx, %rbx
; X64-NEXT: andl $1, %ebx
-; X64-NEXT: movq %rbp, %rax
-; X64-NEXT: mulq %r8
+; X64-NEXT: movq %r11, %rax
+; X64-NEXT: mulq %rbp
+; X64-NEXT: movq %rbp, %r8
; X64-NEXT: movq %rdx, %rsi
; X64-NEXT: movq %rax, %rbp
; X64-NEXT: addq %rcx, %rbp
; X64-NEXT: adcq %rbx, %rsi
; X64-NEXT: xorl %ecx, %ecx
-; X64-NEXT: movq %r9, %rbx
+; X64-NEXT: movq %r10, %rbx
; X64-NEXT: movq %rbx, -{{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: movq %rbx, %rax
; X64-NEXT: mulq %rcx
; X64-NEXT: movq %rdx, %r13
; X64-NEXT: movq %rax, %r10
-; X64-NEXT: movq %r11, %rax
+; X64-NEXT: movq %r14, %rax
; X64-NEXT: mulq %rcx
-; X64-NEXT: movq %rdx, %r9
-; X64-NEXT: movq %r9, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: movq %rdx, %r12
+; X64-NEXT: movq %r12, -{{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: movq %rax, %r15
; X64-NEXT: movq %r15, -{{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: addq %r10, %r15
-; X64-NEXT: adcq %r13, %r9
+; X64-NEXT: adcq %r13, %r12
; X64-NEXT: addq %rbp, %r15
-; X64-NEXT: adcq %rsi, %r9
+; X64-NEXT: adcq %rsi, %r12
; X64-NEXT: movq %rdi, -{{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: movq (%rdi), %r14
; X64-NEXT: movq %r14, %rax
@@ -982,8 +982,7 @@ define void @test_512(i512* %a, i512* %b, i512* %out) nounwind {
; X64-NEXT: movq %rdx, %rbx
; X64-NEXT: addq %rsi, %rax
; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq $0, %rbx
-; X64-NEXT: addq %rbp, %rbx
+; X64-NEXT: adcq %rbp, %rbx
; X64-NEXT: sbbq %rdi, %rdi
; X64-NEXT: andl $1, %edi
; X64-NEXT: movq %rcx, %rax
@@ -1003,10 +1002,9 @@ define void @test_512(i512* %a, i512* %b, i512* %out) nounwind {
; X64-NEXT: addq %rbp, %r10
; X64-NEXT: adcq %rsi, %r13
; X64-NEXT: addq -{{[0-9]+}}(%rsp), %r10 # 8-byte Folded Reload
-; X64-NEXT: adcq %r12, %r13
+; X64-NEXT: adcq %r9, %r13
; X64-NEXT: adcq $0, %r15
-; X64-NEXT: adcq $0, %r9
-; X64-NEXT: movq %r9, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: adcq $0, %r12
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rsi # 8-byte Reload
; X64-NEXT: movq 16(%rsi), %r8
; X64-NEXT: movq %rcx, %rax
@@ -1014,22 +1012,21 @@ define void @test_512(i512* %a, i512* %b, i512* %out) nounwind {
; X64-NEXT: movq %r9, -{{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: mulq %r8
; X64-NEXT: movq %rdx, %rdi
-; X64-NEXT: movq %rax, %r12
+; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rcx # 8-byte Reload
; X64-NEXT: movq %rcx, %rax
; X64-NEXT: mulq %r8
-; X64-NEXT: movq %rdx, %rbx
-; X64-NEXT: movq %rax, %rbp
-; X64-NEXT: addq %rdi, %rbp
-; X64-NEXT: adcq $0, %rbx
+; X64-NEXT: movq %rdx, %rbp
+; X64-NEXT: movq %rax, %rbx
+; X64-NEXT: addq %rdi, %rbx
+; X64-NEXT: adcq $0, %rbp
; X64-NEXT: movq 24(%rsi), %rdi
; X64-NEXT: movq %r9, %rax
; X64-NEXT: mulq %rdi
; X64-NEXT: movq %rdx, %rsi
-; X64-NEXT: addq %rbp, %rax
+; X64-NEXT: addq %rbx, %rax
; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: adcq $0, %rsi
-; X64-NEXT: addq %rbx, %rsi
+; X64-NEXT: adcq %rbp, %rsi
; X64-NEXT: sbbq %rbp, %rbp
; X64-NEXT: andl $1, %ebp
; X64-NEXT: movq %rcx, %rax
@@ -1047,13 +1044,12 @@ define void @test_512(i512* %a, i512* %b, i512* %out) nounwind {
; X64-NEXT: adcq %rdx, %r14
; X64-NEXT: addq %r9, %r11
; X64-NEXT: adcq %rbx, %r14
-; X64-NEXT: addq %r10, %r12
-; X64-NEXT: movq %r12, -{{[0-9]+}}(%rsp) # 8-byte Spill
+; X64-NEXT: addq %r10, -{{[0-9]+}}(%rsp) # 8-byte Folded Spill
; X64-NEXT: adcq %r13, -{{[0-9]+}}(%rsp) # 8-byte Folded Spill
; X64-NEXT: adcq $0, %r11
; X64-NEXT: adcq $0, %r14
; X64-NEXT: addq %r15, %r11
-; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %r14 # 8-byte Folded Reload
+; X64-NEXT: adcq %r12, %r14
; X64-NEXT: adcq $0, %rcx
; X64-NEXT: movq %rcx, %r13
; X64-NEXT: sbbq %r9, %r9
@@ -1075,8 +1071,7 @@ define void @test_512(i512* %a, i512* %b, i512* %out) nounwind {
; X64-NEXT: movq %rdx, %rcx
; X64-NEXT: addq %rbx, %rax
; X64-NEXT: movq %rax, %rbx
-; X64-NEXT: adcq $0, %rcx
-; X64-NEXT: addq %rsi, %rcx
+; X64-NEXT: adcq %rsi, %rcx
; X64-NEXT: sbbq %rsi, %rsi
; X64-NEXT: andl $1, %esi
; X64-NEXT: movq %r10, %rax
@@ -1102,7 +1097,7 @@ define void @test_512(i512* %a, i512* %b, i512* %out) nounwind {
; X64-NEXT: imulq %rsi, %rdi
; X64-NEXT: movq %rsi, %rax
; X64-NEXT: mulq %r8
-; X64-NEXT: movq %rax, %r11
+; X64-NEXT: movq %rax, %r10
; X64-NEXT: addq %rdi, %rdx
; X64-NEXT: movq 40(%rcx), %r9
; X64-NEXT: imulq %r9, %r8
@@ -1110,60 +1105,58 @@ define void @test_512(i512* %a, i512* %b, i512* %out) nounwind {
; X64-NEXT: movq 48(%rcx), %rax
; X64-NEXT: movq %rcx, %rbx
; X64-NEXT: movq %rax, %rdi
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r11 # 8-byte Reload
+; X64-NEXT: imulq %r11, %rdi
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rcx # 8-byte Reload
-; X64-NEXT: imulq %rcx, %rdi
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rbp # 8-byte Reload
-; X64-NEXT: mulq %rbp
+; X64-NEXT: mulq %rcx
; X64-NEXT: movq %rax, %r12
; X64-NEXT: addq %rdi, %rdx
; X64-NEXT: movq 56(%rbx), %rbx
-; X64-NEXT: imulq %rbp, %rbx
+; X64-NEXT: imulq %rcx, %rbx
; X64-NEXT: addq %rdx, %rbx
-; X64-NEXT: addq %r11, %r12
+; X64-NEXT: addq %r10, %r12
; X64-NEXT: adcq %r8, %rbx
-; X64-NEXT: movq %rbp, %rax
-; X64-NEXT: movq %rbp, %r8
+; X64-NEXT: movq %rcx, %rax
; X64-NEXT: mulq %rsi
; X64-NEXT: movq %rdx, %rdi
; X64-NEXT: movq %rax, -{{[0-9]+}}(%rsp) # 8-byte Spill
-; X64-NEXT: movq %rcx, %rax
+; X64-NEXT: movq %r11, %rax
; X64-NEXT: mulq %rsi
; X64-NEXT: movq %rdx, %rsi
; X64-NEXT: movq %rax, %rbp
; X64-NEXT: addq %rdi, %rbp
; X64-NEXT: adcq $0, %rsi
-; X64-NEXT: movq %r8, %rax
+; X64-NEXT: movq %rcx, %rax
; X64-NEXT: mulq %r9
; X64-NEXT: movq %rdx, %rdi
-; X64-NEXT: movq %rax, %r11
-; X64-NEXT: addq %rbp, %r11
-; X64-NEXT: adcq $0, %rdi
-; X64-NEXT: addq %rsi, %rdi
+; X64-NEXT: movq %rax, %r15
+; X64-NEXT: addq %rbp, %r15
+; X64-NEXT: adcq %rsi, %rdi
; X64-NEXT: sbbq %rsi, %rsi
; X64-NEXT: andl $1, %esi
-; X64-NEXT: movq %rcx, %rax
+; X64-NEXT: movq %r11, %rax
; X64-NEXT: mulq %r9
-; X64-NEXT: movq %rdx, %r14
-; X64-NEXT: movq %rax, %r15
-; X64-NEXT: addq %rdi, %r15
-; X64-NEXT: adcq %rsi, %r14
-; X64-NEXT: addq %r12, %r15
-; X64-NEXT: adcq %rbx, %r14
+; X64-NEXT: movq %rdx, %r11
+; X64-NEXT: movq %rax, %r14
+; X64-NEXT: addq %rdi, %r14
+; X64-NEXT: adcq %rsi, %r11
+; X64-NEXT: addq %r12, %r14
+; X64-NEXT: adcq %rbx, %r11
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rdx # 8-byte Reload
; X64-NEXT: movq 56(%rdx), %rcx
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r8 # 8-byte Reload
-; X64-NEXT: imulq %r8, %rcx
-; X64-NEXT: movq 48(%rdx), %rbp
-; X64-NEXT: movq %rdx, %rbx
-; X64-NEXT: movq %r8, %rax
-; X64-NEXT: mulq %rbp
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r10 # 8-byte Reload
+; X64-NEXT: imulq %r10, %rcx
+; X64-NEXT: movq 48(%rdx), %rbx
+; X64-NEXT: movq %rdx, %rbp
+; X64-NEXT: movq %r10, %rax
+; X64-NEXT: mulq %rbx
; X64-NEXT: movq %rax, %rsi
; X64-NEXT: addq %rcx, %rdx
-; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r10 # 8-byte Reload
-; X64-NEXT: imulq %r10, %rbp
-; X64-NEXT: addq %rdx, %rbp
-; X64-NEXT: movq 32(%rbx), %rdi
-; X64-NEXT: movq 40(%rbx), %r12
+; X64-NEXT: movq -{{[0-9]+}}(%rsp), %r8 # 8-byte Reload
+; X64-NEXT: imulq %r8, %rbx
+; X64-NEXT: addq %rdx, %rbx
+; X64-NEXT: movq 32(%rbp), %rdi
+; X64-NEXT: movq 40(%rbp), %r12
; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rax # 8-byte Reload
; X64-NEXT: movq %rax, %rcx
; X64-NEXT: imulq %r12, %rcx
@@ -1174,36 +1167,35 @@ define void @test_512(i512* %a, i512* %b, i512* %out) nounwind {
; X64-NEXT: imulq %rdi, %r13
; X64-NEXT: addq %rdx, %r13
; X64-NEXT: addq %rsi, %r9
-; X64-NEXT: adcq %rbp, %r13
+; X64-NEXT: adcq %rbx, %r13
; X64-NEXT: movq %rdi, %rax
-; X64-NEXT: mulq %r8
+; X64-NEXT: mulq %r10
; X64-NEXT: movq %rdx, %rcx
; X64-NEXT: movq %rax, %rsi
; X64-NEXT: movq %r12, %rax
-; X64-NEXT: mulq %r8
+; X64-NEXT: mulq %r10
; X64-NEXT: movq %rdx, %rbx
; X64-NEXT: movq %rax, %rbp
; X64-NEXT: addq %rcx, %rbp
; X64-NEXT: adcq $0, %rbx
; X64-NEXT: movq %rdi, %rax
-; X64-NEXT: mulq %r10
+; X64-NEXT: mulq %r8
; X64-NEXT: movq %rdx, %rcx
; X64-NEXT: movq %rax, %rdi
; X64-NEXT: addq %rbp, %rdi
-; X64-NEXT: adcq $0, %rcx
-; X64-NEXT: addq %rbx, %rcx
-; X64-NEXT: sbbq %rbp, %rbp
-; X64-NEXT: andl $1, %ebp
+; X64-NEXT: adcq %rbx, %rcx
+; X64-NEXT: sbbq %rbx, %rbx
+; X64-NEXT: andl $1, %ebx
; X64-NEXT: movq %r12, %rax
-; X64-NEXT: mulq %r10
+; X64-NEXT: mulq %r8
; X64-NEXT: addq %rcx, %rax
-; X64-NEXT: adcq %rbp, %rdx
+; X64-NEXT: adcq %rbx, %rdx
; X64-NEXT: addq %r9, %rax
; X64-NEXT: adcq %r13, %rdx
; X64-NEXT: addq -{{[0-9]+}}(%rsp), %rsi # 8-byte Folded Reload
-; X64-NEXT: adcq %r11, %rdi
-; X64-NEXT: adcq %r15, %rax
-; X64-NEXT: adcq %r14, %rdx
+; X64-NEXT: adcq %r15, %rdi
+; X64-NEXT: adcq %r14, %rax
+; X64-NEXT: adcq %r11, %rdx
; X64-NEXT: addq -{{[0-9]+}}(%rsp), %rsi # 8-byte Folded Reload
; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rdi # 8-byte Folded Reload
; X64-NEXT: adcq -{{[0-9]+}}(%rsp), %rax # 8-byte Folded Reload
diff --git a/test/CodeGen/X86/patchpoint-invoke.ll b/test/CodeGen/X86/patchpoint-invoke.ll
index c6dff3b78f16..9270bf2b06ba 100644
--- a/test/CodeGen/X86/patchpoint-invoke.ll
+++ b/test/CodeGen/X86/patchpoint-invoke.ll
@@ -45,7 +45,7 @@ threw:
; Verify that the stackmap section got emitted:
; CHECK-LABEL: __LLVM_StackMaps:
; Header
-; CHECK-NEXT: .byte 2
+; CHECK-NEXT: .byte 3
; CHECK-NEXT: .byte 0
; CHECK-NEXT: .short 0
; Num Functions
diff --git a/test/CodeGen/X86/pr14657.ll b/test/CodeGen/X86/pr14657.ll
deleted file mode 100644
index cc7d3e068d4a..000000000000
--- a/test/CodeGen/X86/pr14657.ll
+++ /dev/null
@@ -1,325 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
-
-; PR14657 - avoid truncation/extension of comparison results
-
-@da = common global [1024 x float] zeroinitializer, align 32
-@db = common global [1024 x float] zeroinitializer, align 32
-@dc = common global [1024 x float] zeroinitializer, align 32
-@dd = common global [1024 x float] zeroinitializer, align 32
-@dj = common global [1024 x i32] zeroinitializer, align 32
-
-define void @_Z9example25v() nounwind uwtable noinline ssp {
-; SSE2-LABEL: _Z9example25v:
-; SSE2: # BB#0: # %vector.ph
-; SSE2-NEXT: movq $-4096, %rax # imm = 0xF000
-; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [1,1,1,1]
-; SSE2-NEXT: .p2align 4, 0x90
-; SSE2-NEXT: .LBB0_1: # %vector.body
-; SSE2-NEXT: # =>This Inner Loop Header: Depth=1
-; SSE2-NEXT: movaps da+4096(%rax), %xmm1
-; SSE2-NEXT: movaps da+4112(%rax), %xmm2
-; SSE2-NEXT: cmpltps db+4112(%rax), %xmm2
-; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,2,2,3,4,5,6,7]
-; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,4,6,6,7]
-; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NEXT: cmpltps db+4096(%rax), %xmm1
-; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
-; SSE2-NEXT: pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,6,6,7]
-; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
-; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
-; SSE2-NEXT: psllw $15, %xmm1
-; SSE2-NEXT: psraw $15, %xmm1
-; SSE2-NEXT: movaps dc+4096(%rax), %xmm2
-; SSE2-NEXT: movaps dc+4112(%rax), %xmm3
-; SSE2-NEXT: cmpltps dd+4112(%rax), %xmm3
-; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[0,2,2,3,4,5,6,7]
-; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,6,6,7]
-; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NEXT: cmpltps dd+4096(%rax), %xmm2
-; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,2,2,3,4,5,6,7]
-; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,4,6,6,7]
-; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
-; SSE2-NEXT: psllw $15, %xmm2
-; SSE2-NEXT: psraw $15, %xmm2
-; SSE2-NEXT: pand %xmm1, %xmm2
-; SSE2-NEXT: movdqa %xmm2, %xmm1
-; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
-; SSE2-NEXT: pand %xmm0, %xmm1
-; SSE2-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
-; SSE2-NEXT: pand %xmm0, %xmm2
-; SSE2-NEXT: movdqa %xmm2, dj+4112(%rax)
-; SSE2-NEXT: movdqa %xmm1, dj+4096(%rax)
-; SSE2-NEXT: addq $32, %rax
-; SSE2-NEXT: jne .LBB0_1
-; SSE2-NEXT: # BB#2: # %for.end
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: _Z9example25v:
-; SSE41: # BB#0: # %vector.ph
-; SSE41-NEXT: movq $-4096, %rax # imm = 0xF000
-; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
-; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [1,1,1,1]
-; SSE41-NEXT: .p2align 4, 0x90
-; SSE41-NEXT: .LBB0_1: # %vector.body
-; SSE41-NEXT: # =>This Inner Loop Header: Depth=1
-; SSE41-NEXT: movaps da+4096(%rax), %xmm2
-; SSE41-NEXT: movaps da+4112(%rax), %xmm3
-; SSE41-NEXT: cmpltps db+4112(%rax), %xmm3
-; SSE41-NEXT: pshufb %xmm0, %xmm3
-; SSE41-NEXT: cmpltps db+4096(%rax), %xmm2
-; SSE41-NEXT: pshufb %xmm0, %xmm2
-; SSE41-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
-; SSE41-NEXT: psllw $15, %xmm2
-; SSE41-NEXT: psraw $15, %xmm2
-; SSE41-NEXT: movaps dc+4096(%rax), %xmm3
-; SSE41-NEXT: movaps dc+4112(%rax), %xmm4
-; SSE41-NEXT: cmpltps dd+4112(%rax), %xmm4
-; SSE41-NEXT: pshufb %xmm0, %xmm4
-; SSE41-NEXT: cmpltps dd+4096(%rax), %xmm3
-; SSE41-NEXT: pshufb %xmm0, %xmm3
-; SSE41-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm4[0]
-; SSE41-NEXT: psllw $15, %xmm3
-; SSE41-NEXT: psraw $15, %xmm3
-; SSE41-NEXT: pand %xmm2, %xmm3
-; SSE41-NEXT: pmovzxwd {{.*#+}} xmm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero
-; SSE41-NEXT: pand %xmm1, %xmm2
-; SSE41-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
-; SSE41-NEXT: pand %xmm1, %xmm3
-; SSE41-NEXT: movdqa %xmm3, dj+4112(%rax)
-; SSE41-NEXT: movdqa %xmm2, dj+4096(%rax)
-; SSE41-NEXT: addq $32, %rax
-; SSE41-NEXT: jne .LBB0_1
-; SSE41-NEXT: # BB#2: # %for.end
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: _Z9example25v:
-; AVX1: # BB#0: # %vector.ph
-; AVX1-NEXT: movq $-4096, %rax # imm = 0xF000
-; AVX1-NEXT: vmovaps {{.*#+}} ymm0 = [1,1,1,1,1,1,1,1]
-; AVX1-NEXT: .p2align 4, 0x90
-; AVX1-NEXT: .LBB0_1: # %vector.body
-; AVX1-NEXT: # =>This Inner Loop Header: Depth=1
-; AVX1-NEXT: vmovups da+4096(%rax), %ymm1
-; AVX1-NEXT: vcmpltps db+4096(%rax), %ymm1, %ymm1
-; AVX1-NEXT: vmovups dc+4096(%rax), %ymm2
-; AVX1-NEXT: vcmpltps dd+4096(%rax), %ymm2, %ymm2
-; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm1
-; AVX1-NEXT: vandps %ymm0, %ymm1, %ymm1
-; AVX1-NEXT: vmovups %ymm1, dj+4096(%rax)
-; AVX1-NEXT: addq $32, %rax
-; AVX1-NEXT: jne .LBB0_1
-; AVX1-NEXT: # BB#2: # %for.end
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: _Z9example25v:
-; AVX2: # BB#0: # %vector.ph
-; AVX2-NEXT: movq $-4096, %rax # imm = 0xF000
-; AVX2-NEXT: vbroadcastss {{.*}}(%rip), %ymm0
-; AVX2-NEXT: .p2align 4, 0x90
-; AVX2-NEXT: .LBB0_1: # %vector.body
-; AVX2-NEXT: # =>This Inner Loop Header: Depth=1
-; AVX2-NEXT: vmovups da+4096(%rax), %ymm1
-; AVX2-NEXT: vcmpltps db+4096(%rax), %ymm1, %ymm1
-; AVX2-NEXT: vmovups dc+4096(%rax), %ymm2
-; AVX2-NEXT: vcmpltps dd+4096(%rax), %ymm2, %ymm2
-; AVX2-NEXT: vandps %ymm2, %ymm1, %ymm1
-; AVX2-NEXT: vandps %ymm0, %ymm1, %ymm1
-; AVX2-NEXT: vmovups %ymm1, dj+4096(%rax)
-; AVX2-NEXT: addq $32, %rax
-; AVX2-NEXT: jne .LBB0_1
-; AVX2-NEXT: # BB#2: # %for.end
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
-vector.ph:
- br label %vector.body
-
-vector.body: ; preds = %vector.body, %vector.ph
- %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
- %0 = getelementptr inbounds [1024 x float], [1024 x float]* @da, i64 0, i64 %index
- %1 = bitcast float* %0 to <8 x float>*
- %2 = load <8 x float>, <8 x float>* %1, align 16
- %3 = getelementptr inbounds [1024 x float], [1024 x float]* @db, i64 0, i64 %index
- %4 = bitcast float* %3 to <8 x float>*
- %5 = load <8 x float>, <8 x float>* %4, align 16
- %6 = fcmp olt <8 x float> %2, %5
- %7 = getelementptr inbounds [1024 x float], [1024 x float]* @dc, i64 0, i64 %index
- %8 = bitcast float* %7 to <8 x float>*
- %9 = load <8 x float>, <8 x float>* %8, align 16
- %10 = getelementptr inbounds [1024 x float], [1024 x float]* @dd, i64 0, i64 %index
- %11 = bitcast float* %10 to <8 x float>*
- %12 = load <8 x float>, <8 x float>* %11, align 16
- %13 = fcmp olt <8 x float> %9, %12
- %14 = and <8 x i1> %6, %13
- %15 = zext <8 x i1> %14 to <8 x i32>
- %16 = getelementptr inbounds [1024 x i32], [1024 x i32]* @dj, i64 0, i64 %index
- %17 = bitcast i32* %16 to <8 x i32>*
- store <8 x i32> %15, <8 x i32>* %17, align 16
- %index.next = add i64 %index, 8
- %18 = icmp eq i64 %index.next, 1024
- br i1 %18, label %for.end, label %vector.body
-
-for.end: ; preds = %vector.body
- ret void
-}
-
-define void @_Z9example24ss(i16 signext %x, i16 signext %y) nounwind uwtable noinline ssp {
-; SSE2-LABEL: _Z9example24ss:
-; SSE2: # BB#0: # %vector.ph
-; SSE2-NEXT: movd %edi, %xmm0
-; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
-; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
-; SSE2-NEXT: movd %esi, %xmm1
-; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
-; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
-; SSE2-NEXT: movq $-4096, %rax # imm = 0xF000
-; SSE2-NEXT: .p2align 4, 0x90
-; SSE2-NEXT: .LBB1_1: # %vector.body
-; SSE2-NEXT: # =>This Inner Loop Header: Depth=1
-; SSE2-NEXT: movaps da+4096(%rax), %xmm2
-; SSE2-NEXT: movaps da+4112(%rax), %xmm3
-; SSE2-NEXT: cmpltps db+4112(%rax), %xmm3
-; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm3[0,2,2,3,4,5,6,7]
-; SSE2-NEXT: pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,6,6,7]
-; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NEXT: cmpltps db+4096(%rax), %xmm2
-; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,2,2,3,4,5,6,7]
-; SSE2-NEXT: pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,4,6,6,7]
-; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
-; SSE2-NEXT: movdqa %xmm0, %xmm3
-; SSE2-NEXT: pand %xmm2, %xmm3
-; SSE2-NEXT: pandn %xmm1, %xmm2
-; SSE2-NEXT: por %xmm3, %xmm2
-; SSE2-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
-; SSE2-NEXT: psrad $16, %xmm3
-; SSE2-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]
-; SSE2-NEXT: psrad $16, %xmm2
-; SSE2-NEXT: movdqa %xmm2, dj+4112(%rax)
-; SSE2-NEXT: movdqa %xmm3, dj+4096(%rax)
-; SSE2-NEXT: addq $32, %rax
-; SSE2-NEXT: jne .LBB1_1
-; SSE2-NEXT: # BB#2: # %for.end
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: _Z9example24ss:
-; SSE41: # BB#0: # %vector.ph
-; SSE41-NEXT: movd %edi, %xmm0
-; SSE41-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
-; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
-; SSE41-NEXT: movd %esi, %xmm1
-; SSE41-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
-; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
-; SSE41-NEXT: movq $-4096, %rax # imm = 0xF000
-; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
-; SSE41-NEXT: .p2align 4, 0x90
-; SSE41-NEXT: .LBB1_1: # %vector.body
-; SSE41-NEXT: # =>This Inner Loop Header: Depth=1
-; SSE41-NEXT: movaps da+4096(%rax), %xmm3
-; SSE41-NEXT: movaps da+4112(%rax), %xmm4
-; SSE41-NEXT: cmpltps db+4112(%rax), %xmm4
-; SSE41-NEXT: pshufb %xmm2, %xmm4
-; SSE41-NEXT: cmpltps db+4096(%rax), %xmm3
-; SSE41-NEXT: pshufb %xmm2, %xmm3
-; SSE41-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm4[0]
-; SSE41-NEXT: movdqa %xmm0, %xmm4
-; SSE41-NEXT: pand %xmm3, %xmm4
-; SSE41-NEXT: pandn %xmm1, %xmm3
-; SSE41-NEXT: por %xmm4, %xmm3
-; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[2,3,0,1]
-; SSE41-NEXT: pmovsxwd %xmm4, %xmm4
-; SSE41-NEXT: pmovsxwd %xmm3, %xmm3
-; SSE41-NEXT: movdqa %xmm3, dj+4096(%rax)
-; SSE41-NEXT: movdqa %xmm4, dj+4112(%rax)
-; SSE41-NEXT: addq $32, %rax
-; SSE41-NEXT: jne .LBB1_1
-; SSE41-NEXT: # BB#2: # %for.end
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: _Z9example24ss:
-; AVX1: # BB#0: # %vector.ph
-; AVX1-NEXT: vmovd %edi, %xmm0
-; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
-; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
-; AVX1-NEXT: vmovd %esi, %xmm1
-; AVX1-NEXT: vpshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
-; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
-; AVX1-NEXT: movq $-4096, %rax # imm = 0xF000
-; AVX1-NEXT: .p2align 4, 0x90
-; AVX1-NEXT: .LBB1_1: # %vector.body
-; AVX1-NEXT: # =>This Inner Loop Header: Depth=1
-; AVX1-NEXT: vmovups da+4096(%rax), %ymm2
-; AVX1-NEXT: vcmpltps db+4096(%rax), %ymm2, %ymm2
-; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
-; AVX1-NEXT: vpacksswb %xmm3, %xmm2, %xmm2
-; AVX1-NEXT: vpandn %xmm1, %xmm2, %xmm3
-; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm2
-; AVX1-NEXT: vpor %xmm3, %xmm2, %xmm2
-; AVX1-NEXT: vpmovsxwd %xmm2, %xmm3
-; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
-; AVX1-NEXT: vpmovsxwd %xmm2, %xmm2
-; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
-; AVX1-NEXT: vmovups %ymm2, dj+4096(%rax)
-; AVX1-NEXT: addq $32, %rax
-; AVX1-NEXT: jne .LBB1_1
-; AVX1-NEXT: # BB#2: # %for.end
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: _Z9example24ss:
-; AVX2: # BB#0: # %vector.ph
-; AVX2-NEXT: vmovd %edi, %xmm0
-; AVX2-NEXT: vpbroadcastw %xmm0, %xmm0
-; AVX2-NEXT: vmovd %esi, %xmm1
-; AVX2-NEXT: vpbroadcastw %xmm1, %xmm1
-; AVX2-NEXT: movq $-4096, %rax # imm = 0xF000
-; AVX2-NEXT: .p2align 4, 0x90
-; AVX2-NEXT: .LBB1_1: # %vector.body
-; AVX2-NEXT: # =>This Inner Loop Header: Depth=1
-; AVX2-NEXT: vmovups da+4096(%rax), %ymm2
-; AVX2-NEXT: vcmpltps db+4096(%rax), %ymm2, %ymm2
-; AVX2-NEXT: vextractf128 $1, %ymm2, %xmm3
-; AVX2-NEXT: vpacksswb %xmm3, %xmm2, %xmm2
-; AVX2-NEXT: vpandn %xmm1, %xmm2, %xmm3
-; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm2
-; AVX2-NEXT: vpor %xmm3, %xmm2, %xmm2
-; AVX2-NEXT: vpmovsxwd %xmm2, %ymm2
-; AVX2-NEXT: vmovdqu %ymm2, dj+4096(%rax)
-; AVX2-NEXT: addq $32, %rax
-; AVX2-NEXT: jne .LBB1_1
-; AVX2-NEXT: # BB#2: # %for.end
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
-vector.ph:
- %0 = insertelement <8 x i16> undef, i16 %x, i32 0
- %broadcast11 = shufflevector <8 x i16> %0, <8 x i16> undef, <8 x i32> zeroinitializer
- %1 = insertelement <8 x i16> undef, i16 %y, i32 0
- %broadcast12 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> zeroinitializer
- br label %vector.body
-
-vector.body: ; preds = %vector.body, %vector.ph
- %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
- %2 = getelementptr inbounds [1024 x float], [1024 x float]* @da, i64 0, i64 %index
- %3 = bitcast float* %2 to <8 x float>*
- %4 = load <8 x float>, <8 x float>* %3, align 16
- %5 = getelementptr inbounds [1024 x float], [1024 x float]* @db, i64 0, i64 %index
- %6 = bitcast float* %5 to <8 x float>*
- %7 = load <8 x float>, <8 x float>* %6, align 16
- %8 = fcmp olt <8 x float> %4, %7
- %9 = select <8 x i1> %8, <8 x i16> %broadcast11, <8 x i16> %broadcast12
- %10 = sext <8 x i16> %9 to <8 x i32>
- %11 = getelementptr inbounds [1024 x i32], [1024 x i32]* @dj, i64 0, i64 %index
- %12 = bitcast i32* %11 to <8 x i32>*
- store <8 x i32> %10, <8 x i32>* %12, align 16
- %index.next = add i64 %index, 8
- %13 = icmp eq i64 %index.next, 1024
- br i1 %13, label %for.end, label %vector.body
-
-for.end: ; preds = %vector.body
- ret void
-}
diff --git a/test/CodeGen/X86/pr28129.ll b/test/CodeGen/X86/pr28129.ll
new file mode 100644
index 000000000000..a155f71f79c3
--- /dev/null
+++ b/test/CodeGen/X86/pr28129.ll
@@ -0,0 +1,87 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=avx | FileCheck %s --check-prefix=X86
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx | FileCheck %s --check-prefix=X64
+
+define <4 x double> @cmp4f64_domain(<4 x double> %a) {
+; X86-LABEL: cmp4f64_domain:
+; X86: # BB#0:
+; X86-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; X86-NEXT: vinsertf128 $1, %xmm1, %ymm1, %ymm1
+; X86-NEXT: vaddpd %ymm1, %ymm0, %ymm0
+; X86-NEXT: retl
+;
+; X64-LABEL: cmp4f64_domain:
+; X64: # BB#0:
+; X64-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; X64-NEXT: vinsertf128 $1, %xmm1, %ymm1, %ymm1
+; X64-NEXT: vaddpd %ymm1, %ymm0, %ymm0
+; X64-NEXT: retq
+ %cmp = fcmp oeq <4 x double> zeroinitializer, zeroinitializer
+ %sext = sext <4 x i1> %cmp to <4 x i64>
+ %mask = bitcast <4 x i64> %sext to <4 x double>
+ %add = fadd <4 x double> %a, %mask
+ ret <4 x double> %add
+}
+
+define <4 x double> @cmp4f64_domain_optsize(<4 x double> %a) optsize {
+; X86-LABEL: cmp4f64_domain_optsize:
+; X86: # BB#0:
+; X86-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; X86-NEXT: vinsertf128 $1, %xmm1, %ymm1, %ymm1
+; X86-NEXT: vaddpd %ymm1, %ymm0, %ymm0
+; X86-NEXT: retl
+;
+; X64-LABEL: cmp4f64_domain_optsize:
+; X64: # BB#0:
+; X64-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; X64-NEXT: vinsertf128 $1, %xmm1, %ymm1, %ymm1
+; X64-NEXT: vaddpd %ymm1, %ymm0, %ymm0
+; X64-NEXT: retq
+ %cmp = fcmp oeq <4 x double> zeroinitializer, zeroinitializer
+ %sext = sext <4 x i1> %cmp to <4 x i64>
+ %mask = bitcast <4 x i64> %sext to <4 x double>
+ %add = fadd <4 x double> %a, %mask
+ ret <4 x double> %add
+}
+
+define <8 x float> @cmp8f32_domain(<8 x float> %a) {
+; X86-LABEL: cmp8f32_domain:
+; X86: # BB#0:
+; X86-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; X86-NEXT: vinsertf128 $1, %xmm1, %ymm1, %ymm1
+; X86-NEXT: vaddps %ymm1, %ymm0, %ymm0
+; X86-NEXT: retl
+;
+; X64-LABEL: cmp8f32_domain:
+; X64: # BB#0:
+; X64-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; X64-NEXT: vinsertf128 $1, %xmm1, %ymm1, %ymm1
+; X64-NEXT: vaddps %ymm1, %ymm0, %ymm0
+; X64-NEXT: retq
+ %cmp = fcmp oeq <8 x float> zeroinitializer, zeroinitializer
+ %sext = sext <8 x i1> %cmp to <8 x i32>
+ %mask = bitcast <8 x i32> %sext to <8 x float>
+ %add = fadd <8 x float> %a, %mask
+ ret <8 x float> %add
+}
+
+define <8 x float> @cmp8f32_domain_optsize(<8 x float> %a) optsize {
+; X86-LABEL: cmp8f32_domain_optsize:
+; X86: # BB#0:
+; X86-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; X86-NEXT: vinsertf128 $1, %xmm1, %ymm1, %ymm1
+; X86-NEXT: vaddps %ymm1, %ymm0, %ymm0
+; X86-NEXT: retl
+;
+; X64-LABEL: cmp8f32_domain_optsize:
+; X64: # BB#0:
+; X64-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; X64-NEXT: vinsertf128 $1, %xmm1, %ymm1, %ymm1
+; X64-NEXT: vaddps %ymm1, %ymm0, %ymm0
+; X64-NEXT: retq
+ %cmp = fcmp oeq <8 x float> zeroinitializer, zeroinitializer
+ %sext = sext <8 x i1> %cmp to <8 x i32>
+ %mask = bitcast <8 x i32> %sext to <8 x float>
+ %add = fadd <8 x float> %a, %mask
+ ret <8 x float> %add
+}
diff --git a/test/CodeGen/X86/pr31088.ll b/test/CodeGen/X86/pr31088.ll
new file mode 100644
index 000000000000..0dd8eb0ece85
--- /dev/null
+++ b/test/CodeGen/X86/pr31088.ll
@@ -0,0 +1,162 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X86
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X64
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+f16c | FileCheck %s --check-prefix=F16C
+
+define <1 x half> @ir_fadd_v1f16(<1 x half> %arg0, <1 x half> %arg1) nounwind {
+; X86-LABEL: ir_fadd_v1f16:
+; X86: # BB#0:
+; X86-NEXT: subl $28, %esp
+; X86-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
+; X86-NEXT: movss %xmm0, (%esp)
+; X86-NEXT: calll __gnu_f2h_ieee
+; X86-NEXT: movzwl %ax, %eax
+; X86-NEXT: movl %eax, (%esp)
+; X86-NEXT: calll __gnu_h2f_ieee
+; X86-NEXT: fstpt {{[0-9]+}}(%esp) # 10-byte Folded Spill
+; X86-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
+; X86-NEXT: movss %xmm0, (%esp)
+; X86-NEXT: calll __gnu_f2h_ieee
+; X86-NEXT: movzwl %ax, %eax
+; X86-NEXT: movl %eax, (%esp)
+; X86-NEXT: fldt {{[0-9]+}}(%esp) # 10-byte Folded Reload
+; X86-NEXT: fstps {{[0-9]+}}(%esp)
+; X86-NEXT: calll __gnu_h2f_ieee
+; X86-NEXT: fstps {{[0-9]+}}(%esp)
+; X86-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
+; X86-NEXT: addss {{[0-9]+}}(%esp), %xmm0
+; X86-NEXT: movss %xmm0, {{[0-9]+}}(%esp)
+; X86-NEXT: flds {{[0-9]+}}(%esp)
+; X86-NEXT: addl $28, %esp
+; X86-NEXT: retl
+;
+; X64-LABEL: ir_fadd_v1f16:
+; X64: # BB#0:
+; X64-NEXT: pushq %rax
+; X64-NEXT: movss %xmm0, {{[0-9]+}}(%rsp) # 4-byte Spill
+; X64-NEXT: movaps %xmm1, %xmm0
+; X64-NEXT: callq __gnu_f2h_ieee
+; X64-NEXT: movzwl %ax, %edi
+; X64-NEXT: callq __gnu_h2f_ieee
+; X64-NEXT: movss %xmm0, (%rsp) # 4-byte Spill
+; X64-NEXT: movss {{[0-9]+}}(%rsp), %xmm0 # 4-byte Reload
+; X64-NEXT: # xmm0 = mem[0],zero,zero,zero
+; X64-NEXT: callq __gnu_f2h_ieee
+; X64-NEXT: movzwl %ax, %edi
+; X64-NEXT: callq __gnu_h2f_ieee
+; X64-NEXT: addss (%rsp), %xmm0 # 4-byte Folded Reload
+; X64-NEXT: popq %rax
+; X64-NEXT: retq
+;
+; F16C-LABEL: ir_fadd_v1f16:
+; F16C: # BB#0:
+; F16C-NEXT: vcvtps2ph $4, %xmm1, %xmm1
+; F16C-NEXT: vcvtph2ps %xmm1, %xmm1
+; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0
+; F16C-NEXT: vcvtph2ps %xmm0, %xmm0
+; F16C-NEXT: vaddss %xmm1, %xmm0, %xmm0
+; F16C-NEXT: retq
+ %retval = fadd <1 x half> %arg0, %arg1
+ ret <1 x half> %retval
+}
+
+define <2 x half> @ir_fadd_v2f16(<2 x half> %arg0, <2 x half> %arg1) nounwind {
+; X86-LABEL: ir_fadd_v2f16:
+; X86: # BB#0:
+; X86-NEXT: subl $64, %esp
+; X86-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
+; X86-NEXT: movss %xmm0, (%esp)
+; X86-NEXT: calll __gnu_f2h_ieee
+; X86-NEXT: movzwl %ax, %eax
+; X86-NEXT: movl %eax, (%esp)
+; X86-NEXT: calll __gnu_h2f_ieee
+; X86-NEXT: fstpt {{[0-9]+}}(%esp) # 10-byte Folded Spill
+; X86-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
+; X86-NEXT: movss %xmm0, (%esp)
+; X86-NEXT: calll __gnu_f2h_ieee
+; X86-NEXT: movzwl %ax, %eax
+; X86-NEXT: movl %eax, (%esp)
+; X86-NEXT: calll __gnu_h2f_ieee
+; X86-NEXT: fstpt {{[0-9]+}}(%esp) # 10-byte Folded Spill
+; X86-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
+; X86-NEXT: movss %xmm0, (%esp)
+; X86-NEXT: calll __gnu_f2h_ieee
+; X86-NEXT: movzwl %ax, %eax
+; X86-NEXT: movl %eax, (%esp)
+; X86-NEXT: calll __gnu_h2f_ieee
+; X86-NEXT: fstpt {{[0-9]+}}(%esp) # 10-byte Folded Spill
+; X86-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
+; X86-NEXT: movss %xmm0, (%esp)
+; X86-NEXT: calll __gnu_f2h_ieee
+; X86-NEXT: movzwl %ax, %eax
+; X86-NEXT: movl %eax, (%esp)
+; X86-NEXT: fldt {{[0-9]+}}(%esp) # 10-byte Folded Reload
+; X86-NEXT: fstps {{[0-9]+}}(%esp)
+; X86-NEXT: fldt {{[0-9]+}}(%esp) # 10-byte Folded Reload
+; X86-NEXT: fstps {{[0-9]+}}(%esp)
+; X86-NEXT: fldt {{[0-9]+}}(%esp) # 10-byte Folded Reload
+; X86-NEXT: fstps {{[0-9]+}}(%esp)
+; X86-NEXT: calll __gnu_h2f_ieee
+; X86-NEXT: fstps {{[0-9]+}}(%esp)
+; X86-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
+; X86-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
+; X86-NEXT: addss {{[0-9]+}}(%esp), %xmm1
+; X86-NEXT: addss {{[0-9]+}}(%esp), %xmm0
+; X86-NEXT: movss %xmm0, {{[0-9]+}}(%esp)
+; X86-NEXT: movss %xmm1, {{[0-9]+}}(%esp)
+; X86-NEXT: flds {{[0-9]+}}(%esp)
+; X86-NEXT: flds {{[0-9]+}}(%esp)
+; X86-NEXT: addl $64, %esp
+; X86-NEXT: retl
+;
+; X64-LABEL: ir_fadd_v2f16:
+; X64: # BB#0:
+; X64-NEXT: subq $24, %rsp
+; X64-NEXT: movss %xmm2, {{[0-9]+}}(%rsp) # 4-byte Spill
+; X64-NEXT: movss %xmm1, {{[0-9]+}}(%rsp) # 4-byte Spill
+; X64-NEXT: movss %xmm0, {{[0-9]+}}(%rsp) # 4-byte Spill
+; X64-NEXT: movaps %xmm3, %xmm0
+; X64-NEXT: callq __gnu_f2h_ieee
+; X64-NEXT: movzwl %ax, %edi
+; X64-NEXT: callq __gnu_h2f_ieee
+; X64-NEXT: movss %xmm0, {{[0-9]+}}(%rsp) # 4-byte Spill
+; X64-NEXT: movss {{[0-9]+}}(%rsp), %xmm0 # 4-byte Reload
+; X64-NEXT: # xmm0 = mem[0],zero,zero,zero
+; X64-NEXT: callq __gnu_f2h_ieee
+; X64-NEXT: movzwl %ax, %edi
+; X64-NEXT: callq __gnu_h2f_ieee
+; X64-NEXT: movss %xmm0, {{[0-9]+}}(%rsp) # 4-byte Spill
+; X64-NEXT: movss {{[0-9]+}}(%rsp), %xmm0 # 4-byte Reload
+; X64-NEXT: # xmm0 = mem[0],zero,zero,zero
+; X64-NEXT: callq __gnu_f2h_ieee
+; X64-NEXT: movzwl %ax, %edi
+; X64-NEXT: callq __gnu_h2f_ieee
+; X64-NEXT: movss %xmm0, {{[0-9]+}}(%rsp) # 4-byte Spill
+; X64-NEXT: movss {{[0-9]+}}(%rsp), %xmm0 # 4-byte Reload
+; X64-NEXT: # xmm0 = mem[0],zero,zero,zero
+; X64-NEXT: callq __gnu_f2h_ieee
+; X64-NEXT: movzwl %ax, %edi
+; X64-NEXT: callq __gnu_h2f_ieee
+; X64-NEXT: addss {{[0-9]+}}(%rsp), %xmm0 # 4-byte Folded Reload
+; X64-NEXT: movss {{[0-9]+}}(%rsp), %xmm1 # 4-byte Reload
+; X64-NEXT: # xmm1 = mem[0],zero,zero,zero
+; X64-NEXT: addss {{[0-9]+}}(%rsp), %xmm1 # 4-byte Folded Reload
+; X64-NEXT: addq $24, %rsp
+; X64-NEXT: retq
+;
+; F16C-LABEL: ir_fadd_v2f16:
+; F16C: # BB#0:
+; F16C-NEXT: vcvtps2ph $4, %xmm3, %xmm3
+; F16C-NEXT: vcvtph2ps %xmm3, %xmm3
+; F16C-NEXT: vcvtps2ph $4, %xmm1, %xmm1
+; F16C-NEXT: vcvtph2ps %xmm1, %xmm1
+; F16C-NEXT: vcvtps2ph $4, %xmm2, %xmm2
+; F16C-NEXT: vcvtph2ps %xmm2, %xmm2
+; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0
+; F16C-NEXT: vcvtph2ps %xmm0, %xmm0
+; F16C-NEXT: vaddss %xmm2, %xmm0, %xmm0
+; F16C-NEXT: vaddss %xmm3, %xmm1, %xmm1
+; F16C-NEXT: retq
+ %retval = fadd <2 x half> %arg0, %arg1
+ ret <2 x half> %retval
+}
diff --git a/test/CodeGen/X86/sse2-intrinsics-fast-isel.ll b/test/CodeGen/X86/sse2-intrinsics-fast-isel.ll
index 964037ea80af..20387ccd6b7a 100644
--- a/test/CodeGen/X86/sse2-intrinsics-fast-isel.ll
+++ b/test/CodeGen/X86/sse2-intrinsics-fast-isel.ll
@@ -2318,6 +2318,22 @@ define <2 x double> @test_mm_set_pd(double %a0, double %a1) nounwind {
ret <2 x double> %res1
}
+define <2 x double> @test_mm_set_pd1(double %a0) nounwind {
+; X32-LABEL: test_mm_set_pd1:
+; X32: # BB#0:
+; X32-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
+; X32-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0,0]
+; X32-NEXT: retl
+;
+; X64-LABEL: test_mm_set_pd1:
+; X64: # BB#0:
+; X64-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0,0]
+; X64-NEXT: retq
+ %res0 = insertelement <2 x double> undef, double %a0, i32 0
+ %res1 = insertelement <2 x double> %res0, double %a0, i32 1
+ ret <2 x double> %res1
+}
+
define <2 x double> @test_mm_set_sd(double %a0) nounwind {
; X32-LABEL: test_mm_set_sd:
; X32: # BB#0:
diff --git a/test/CodeGen/X86/stack-protector-dbginfo.ll b/test/CodeGen/X86/stack-protector-dbginfo.ll
index 8413b8ef82cb..a685ed1f6784 100644
--- a/test/CodeGen/X86/stack-protector-dbginfo.ll
+++ b/test/CodeGen/X86/stack-protector-dbginfo.ll
@@ -49,7 +49,7 @@ attributes #0 = { sspreq }
!22 = !{i64* getelementptr inbounds ({ i64, [56 x i8] }, { i64, [56 x i8] }* @a, i32 0, i32 0)}
!23 = !DILocalVariable(name: "p2", line: 12, arg: 2, scope: !24, file: !10, type: !32)
!24 = distinct !DISubprogram(name: "min<unsigned long long>", linkageName: "_ZN3__13minIyEERKT_S3_RS1_", line: 12, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: true, unit: !0, scopeLine: 12, file: !1, scope: !25, type: !27, templateParams: !33, variables: !35)
-!25 = !DINamespace(name: "__1", line: 1, file: !26, scope: null)
+!25 = !DINamespace(name: "__1", scope: null)
!26 = !DIFile(filename: "main.cpp", directory: "/Users/matt/ryan_bug")
!27 = !DISubroutineType(types: !28)
!28 = !{!29, !29, !32}
diff --git a/test/CodeGen/X86/stackmap-fast-isel.ll b/test/CodeGen/X86/stackmap-fast-isel.ll
index 7afe966b77aa..ae10a37756bc 100644
--- a/test/CodeGen/X86/stackmap-fast-isel.ll
+++ b/test/CodeGen/X86/stackmap-fast-isel.ll
@@ -4,7 +4,7 @@
; CHECK-LABEL: .section __LLVM_STACKMAPS,__llvm_stackmaps
; CHECK-NEXT: __LLVM_StackMaps:
; Header
-; CHECK-NEXT: .byte 2
+; CHECK-NEXT: .byte 3
; CHECK-NEXT: .byte 0
; CHECK-NEXT: .short 0
; Num Functions
@@ -42,62 +42,86 @@
; CHECK-NEXT: .short 12
; SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long -1
; SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long -1
; SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 65536
; SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 2000000000
; SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 2147483647
; SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long -1
; SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long -1
; SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; LargeConstant at index 0
; CHECK-NEXT: .byte 5
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; LargeConstant at index 1
; CHECK-NEXT: .byte 5
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 1
; LargeConstant at index 2
; CHECK-NEXT: .byte 5
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 2
; SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long -1
@@ -115,7 +139,9 @@ entry:
; CHECK-NEXT: .short 1
; Loc 0: SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 33
@@ -133,8 +159,10 @@ define void @liveConstant() {
; CHECK-NEXT: .short 1
; Loc 0: Direct RBP - ofs
; CHECK-NEXT: .byte 2
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short 6
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long
define void @directFrameIdx() {
diff --git a/test/CodeGen/X86/stackmap-large-constants.ll b/test/CodeGen/X86/stackmap-large-constants.ll
index 99a2c11828e0..7de430b5393a 100644
--- a/test/CodeGen/X86/stackmap-large-constants.ll
+++ b/test/CodeGen/X86/stackmap-large-constants.ll
@@ -3,7 +3,7 @@
; CHECK-LABEL: .section __LLVM_STACKMAPS,__llvm_stackmaps
; CHECK-NEXT: __LLVM_StackMaps:
; version
-; CHECK-NEXT: .byte 2
+; CHECK-NEXT: .byte 3
; reserved
; CHECK-NEXT: .byte 0
; reserved
@@ -38,12 +38,17 @@
; ConstantIndex
; CHECK-NEXT: .byte 5
; reserved
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; size
+; CHECK-NEXT: .short 8
; Dwarf RegNum
; CHECK-NEXT: .short 0
+; reserved
+; CHECK-NEXT: .short 0
; Offset
; CHECK-NEXT: .long 0
; padding
+; CHECK-NEXT: .p2align 3
; CHECK-NEXT: .short 0
; NumLiveOuts
; CHECK-NEXT: .short 0
@@ -68,12 +73,17 @@ define void @foo() {
; ConstantIndex
; CHECK-NEXT: .byte 5
; reserved
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; size
+; CHECK-NEXT: .short 8
; Dwarf RegNum
; CHECK-NEXT: .short 0
+; reserved
+; CHECK-NEXT: .short 0
; Offset
; CHECK-NEXT: .long 1
; padding
+; CHECK-NEXT: .p2align 3
; CHECK-NEXT: .short 0
; NumLiveOuts
; CHECK-NEXT: .short 0
diff --git a/test/CodeGen/X86/stackmap-large-location-size.ll b/test/CodeGen/X86/stackmap-large-location-size.ll
new file mode 100644
index 000000000000..6c90ddaedcc9
--- /dev/null
+++ b/test/CodeGen/X86/stackmap-large-location-size.ll
@@ -0,0 +1,172 @@
+; RUN: llc < %s -mtriple="x86_64-pc-linux-gnu" | FileCheck %s
+
+declare void @callee()
+
+define void @f_0(<1024 x i64> %val) {
+; CHECK: .quad 2882400015
+; CHECK-NEXT: .long .Ltmp0-f_0
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 4
+; Constant(0)
+; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long 0
+; Constant(0)
+; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long 0
+; Constant(1)
+; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long 1
+; Indirect
+; CHECK-NEXT: .byte 3
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8192
+; CHECK-NEXT: .short 7
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long 0
+; Padding
+; CHECK-NEXT: .p2align 3
+ call void @callee() [ "deopt"(<1024 x i64> %val) ]
+ ret void
+}
+
+define void @f_1(<1024 x i8*> %val) {
+; CHECK: .quad 2882400015
+; CHECK-NEXT: .long .Ltmp1-f_1
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 4
+; Constant(0)
+; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long 0
+; Constant(0)
+; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long 0
+; Constant(1)
+; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long 1
+; Indirect
+; CHECK-NEXT: .byte 3
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8192
+; CHECK-NEXT: .short 7
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long 0
+; Padding
+; CHECK-NEXT: .p2align 3
+ call void @callee() [ "deopt"(<1024 x i8*> %val) ]
+ ret void
+}
+
+define void @f_2(<99 x i8*> %val) {
+; CHECK: .quad 2882400015
+; CHECK-NEXT: .long .Ltmp2-f_2
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 4
+; Constant(0)
+; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long 0
+; Constant(0)
+; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long 0
+; Constant(1)
+; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long 1
+; Indirect
+; CHECK-NEXT: .byte 3
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 792
+; CHECK-NEXT: .short 7
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long 0
+; CHECK-NEXT: .p2align 3
+ call void @callee() [ "deopt"(<99 x i8*> %val) ]
+ ret void
+}
+
+
+define <400 x i8 addrspace(1)*> @f_3(<400 x i8 addrspace(1)*> %obj) gc "statepoint-example" {
+; CHECK: .quad 4242
+; CHECK-NEXT: .long .Ltmp3-f_3
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 5
+; Constant(0)
+; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long 0
+; Constant(0)
+; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long 0
+; Constant(0)
+; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long 0
+; Indirect
+; CHECK-NEXT: .byte 3
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 3200
+; CHECK-NEXT: .short 7
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long 0
+; Indirect
+; CHECK-NEXT: .byte 3
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 3200
+; CHECK-NEXT: .short 7
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long 0
+; Padding
+; CHECK-NEXT: .p2align 3
+ %tok = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 4242, i32 0, void ()* @do_safepoint, i32 0, i32 0, i32 0, i32 0, <400 x i8 addrspace(1)*> %obj)
+ %obj.r = call coldcc <400 x i8 addrspace(1)*> @llvm.experimental.gc.relocate.v400p1i8(token %tok, i32 7, i32 7)
+ ret <400 x i8 addrspace(1)*> %obj.r
+}
+
+declare void @do_safepoint()
+
+declare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...)
+declare <400 x i8 addrspace(1)*> @llvm.experimental.gc.relocate.v400p1i8(token, i32, i32)
diff --git a/test/CodeGen/X86/stackmap-liveness.ll b/test/CodeGen/X86/stackmap-liveness.ll
index a5809ace795b..eb95b9c8df4e 100644
--- a/test/CodeGen/X86/stackmap-liveness.ll
+++ b/test/CodeGen/X86/stackmap-liveness.ll
@@ -6,7 +6,7 @@
; CHECK-LABEL: .section __LLVM_STACKMAPS,__llvm_stackmaps
; CHECK-NEXT: __LLVM_StackMaps:
; Header
-; CHECK-NEXT: .byte 2
+; CHECK-NEXT: .byte 3
; CHECK-NEXT: .byte 0
; CHECK-NEXT: .short 0
; Num Functions
@@ -32,6 +32,7 @@ entry:
; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; Padding
+; CHECK-NEXT: .p2align 3
; CHECK-NEXT: .short 0
; Num LiveOut Entries: 0
; CHECK-NEXT: .short 0
@@ -43,6 +44,7 @@ entry:
; PATCH-NEXT: .short 0
; PATCH-NEXT: .short 0
; Padding
+; PATCH-NEXT: .p2align 3
; PATCH-NEXT: .short 0
; Num LiveOut Entries: 1
; PATCH-NEXT: .short 1
@@ -63,6 +65,7 @@ entry:
; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; Padding
+; CHECK-NEXT: .p2align 3
; CHECK-NEXT: .short 0
; Num LiveOut Entries: 0
; CHECK-NEXT: .short 0
@@ -74,6 +77,7 @@ entry:
; PATCH-NEXT: .short 0
; PATCH-NEXT: .short 0
; Padding
+; PATCH-NEXT: .p2align 3
; PATCH-NEXT: .short 0
; Num LiveOut Entries: 5
; PATCH-NEXT: .short 5
@@ -107,6 +111,7 @@ entry:
; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; Padding
+; CHECK-NEXT: .p2align 3
; CHECK-NEXT: .short 0
; Num LiveOut Entries: 0
; CHECK-NEXT: .short 0
@@ -118,6 +123,7 @@ entry:
; PATCH-NEXT: .short 0
; PATCH-NEXT: .short 0
; Padding
+; PATCH-NEXT: .p2align 3
; PATCH-NEXT: .short 0
; Num LiveOut Entries: 2
; PATCH-NEXT: .short 2
@@ -144,6 +150,7 @@ entry:
; PATCH-NEXT: .short 0
; PATCH-NEXT: .short 0
; Padding
+; PATCH-NEXT: .p2align 3
; PATCH-NEXT: .short 0
; Num LiveOut Entries: 0
; PATCH-NEXT: .short 0
@@ -155,6 +162,7 @@ entry:
; PATCH-NEXT: .short 0
; PATCH-NEXT: .short 0
; Padding
+; PATCH-NEXT: .p2align 3
; PATCH-NEXT: .short 0
; Num LiveOut Entries: 2
; PATCH-NEXT: .short 2
diff --git a/test/CodeGen/X86/stackmap.ll b/test/CodeGen/X86/stackmap.ll
index 9818d3547fca..601100bd5705 100644
--- a/test/CodeGen/X86/stackmap.ll
+++ b/test/CodeGen/X86/stackmap.ll
@@ -5,7 +5,7 @@
; CHECK-LABEL: .section __LLVM_STACKMAPS,__llvm_stackmaps
; CHECK-NEXT: __LLVM_StackMaps:
; Header
-; CHECK-NEXT: .byte 2
+; CHECK-NEXT: .byte 3
; CHECK-NEXT: .byte 0
; CHECK-NEXT: .short 0
; Num Functions
@@ -79,62 +79,86 @@
; CHECK-NEXT: .short 12
; SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long -1
; SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long -1
; SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 65536
; SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 2000000000
; SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 2147483647
; SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long -1
; SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long -1
; SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; LargeConstant at index 0
; CHECK-NEXT: .byte 5
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; LargeConstant at index 1
; CHECK-NEXT: .byte 5
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 1
; LargeConstant at index 2
; CHECK-NEXT: .byte 5
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 2
; SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long -1
@@ -151,12 +175,16 @@ entry:
; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 2
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define void @osrinline(i64 %a, i64 %b) {
entry:
@@ -175,12 +203,16 @@ entry:
; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 2
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define void @osrcold(i64 %a, i64 %b) {
entry:
@@ -200,12 +232,16 @@ ret:
; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 2
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define i64 @propertyRead(i64* %obj) {
entry:
@@ -220,12 +256,16 @@ entry:
; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 2
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define void @propertyWrite(i64 %dummy1, i64* %obj, i64 %dummy2, i64 %a) {
entry:
@@ -242,12 +282,16 @@ entry:
; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 2
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define void @jsVoidCall(i64 %dummy1, i64* %obj, i64 %arg, i64 %l1, i64 %l2) {
entry:
@@ -264,12 +308,16 @@ entry:
; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 2
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short {{[0-9]+}}
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define i64 @jsIntCall(i64 %dummy1, i64* %obj, i64 %arg, i64 %l1, i64 %l2) {
entry:
@@ -290,8 +338,11 @@ entry:
; Check that at least one is a spilled entry from RBP.
; Location: Indirect RBP + ...
; CHECK: .byte 3
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short 6
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long
define void @spilledValue(i64 %arg0, i64 %arg1, i64 %arg2, i64 %arg3, i64 %arg4, i64 %l0, i64 %l1, i64 %l2, i64 %l3, i64 %l4, i64 %l5, i64 %l6, i64 %l7, i64 %l8, i64 %l9, i64 %l10, i64 %l11, i64 %l12, i64 %l13, i64 %l14, i64 %l15, i64 %l16) {
entry:
call void (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.void(i64 11, i32 15, i8* null, i32 5, i64 %arg0, i64 %arg1, i64 %arg2, i64 %arg3, i64 %arg4, i64 %l0, i64 %l1, i64 %l2, i64 %l3, i64 %l4, i64 %l5, i64 %l6, i64 %l7, i64 %l8, i64 %l9, i64 %l10, i64 %l11, i64 %l12, i64 %l13, i64 %l14, i64 %l15, i64 %l16)
@@ -309,8 +360,11 @@ entry:
; Check that at least one is a spilled entry from RBP.
; Location: Indirect RBP + ...
; CHECK: .byte 3
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short 6
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long
define webkit_jscc void @spilledStackMapValue(i64 %l0, i64 %l1, i64 %l2, i64 %l3, i64 %l4, i64 %l5, i64 %l6, i64 %l7, i64 %l8, i64 %l9, i64 %l10, i64 %l11, i64 %l12, i64 %l13, i64 %l14, i64 %l15, i64 %l16) {
entry:
call void (i64, i32, ...) @llvm.experimental.stackmap(i64 12, i32 15, i64 %l0, i64 %l1, i64 %l2, i64 %l3, i64 %l4, i64 %l5, i64 %l6, i64 %l7, i64 %l8, i64 %l9, i64 %l10, i64 %l11, i64 %l12, i64 %l13, i64 %l14, i64 %l15, i64 %l16)
@@ -327,8 +381,11 @@ entry:
; Check that the subregister operand is a 4-byte spill.
; Location: Indirect, 4-byte, RBP + ...
; CHECK: .byte 3
-; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 4
; CHECK-NEXT: .short 6
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long
define void @spillSubReg(i64 %arg) #0 {
bb:
br i1 undef, label %bb1, label %bb2
@@ -367,14 +424,18 @@ bb61:
; Check that the subregister operands are 1-byte spills.
; Location 0: Register, 4-byte, AL
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 1
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 1
; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
;
; Location 1: Register, 4-byte, BL
; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 1
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 1
; CHECK-NEXT: .short 3
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
define void @subRegOffset(i16 %arg) {
%v = mul i16 %arg, 5
@@ -395,7 +456,9 @@ define void @subRegOffset(i16 %arg) {
; CHECK-NEXT: .short 1
; Loc 0: SmallConstant
; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 33
@@ -413,8 +476,10 @@ define void @liveConstant() {
; CHECK-NEXT: .short 1
; Loc 0: Direct RBP - ofs
; CHECK-NEXT: .byte 2
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short 6
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long
; Callsite 17
@@ -424,13 +489,17 @@ define void @liveConstant() {
; CHECK-NEXT: .short 2
; Loc 0: Direct RBP - ofs
; CHECK-NEXT: .byte 2
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short 6
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long
; Loc 1: Direct RBP - ofs
; CHECK-NEXT: .byte 2
-; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 8
; CHECK-NEXT: .short 6
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long
define void @directFrameIdx() {
entry:
@@ -473,8 +542,10 @@ entry:
; CHECK-NEXT: .short 1
; Loc 0: Indirect fp - offset
; CHECK-NEXT: .byte 3
-; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 4
; CHECK-NEXT: .short 6
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long -{{[0-9]+}}
define void @clobberScratch(i32 %a) {
tail call void asm sideeffect "nop", "~{ax},~{bx},~{cx},~{dx},~{bp},~{si},~{di},~{r8},~{r9},~{r10},~{r12},~{r13},~{r14},~{r15}"() nounwind
diff --git a/test/CodeGen/X86/statepoint-allocas.ll b/test/CodeGen/X86/statepoint-allocas.ll
index 95ce8f376170..9f5418432abc 100644
--- a/test/CodeGen/X86/statepoint-allocas.ll
+++ b/test/CodeGen/X86/statepoint-allocas.ll
@@ -48,7 +48,7 @@ declare token @llvm.experimental.gc.statepoint.p0f_i1f(i64, i32, i1 ()*, i32, i3
; CHECK-LABEL: .section .llvm_stackmaps
; CHECK-NEXT: __LLVM_StackMaps:
; Header
-; CHECK-NEXT: .byte 2
+; CHECK-NEXT: .byte 3
; CHECK-NEXT: .byte 0
; CHECK-NEXT: .short 0
; Num Functions
@@ -77,23 +77,31 @@ declare token @llvm.experimental.gc.statepoint.p0f_i1f(i64, i32, i1 ()*, i32, i3
; CHECK: .short 4
; SmallConstant (0)
; CHECK: .byte 4
-; CHECK: .byte 8
+; CHECK: .byte 0
+; CHECK: .short 8
+; CHECK: .short 0
; CHECK: .short 0
; CHECK: .long 0
; SmallConstant (0)
; CHECK: .byte 4
-; CHECK: .byte 8
+; CHECK: .byte 0
+; CHECK: .short 8
+; CHECK: .short 0
; CHECK: .short 0
; CHECK: .long 0
; SmallConstant (0)
; CHECK: .byte 4
-; CHECK: .byte 8
+; CHECK: .byte 0
+; CHECK: .short 8
+; CHECK: .short 0
; CHECK: .short 0
; CHECK: .long 0
; Direct Spill Slot [RSP+0]
; CHECK: .byte 2
-; CHECK: .byte 8
+; CHECK: .byte 0
+; CHECK: .short 8
; CHECK: .short 7
+; CHECK: .short 0
; CHECK: .long 0
; No Padding or LiveOuts
; CHECK: .short 0
@@ -106,23 +114,31 @@ declare token @llvm.experimental.gc.statepoint.p0f_i1f(i64, i32, i1 ()*, i32, i3
; CHECK: .short 4
; SmallConstant (0)
; CHECK: .byte 4
-; CHECK: .byte 8
+; CHECK: .byte 0
+; CHECK: .short 8
+; CHECK: .short 0
; CHECK: .short 0
; CHECK: .long 0
; SmallConstant (0)
; CHECK: .byte 4
-; CHECK: .byte 8
+; CHECK: .byte 0
+; CHECK: .short 8
+; CHECK: .short 0
; CHECK: .short 0
; CHECK: .long 0
; SmallConstant (1)
; CHECK: .byte 4
-; CHECK: .byte 8
+; CHECK: .byte 0
+; CHECK: .short 8
+; CHECK: .short 0
; CHECK: .short 0
; CHECK: .long 1
; Direct Spill Slot [RSP+0]
; CHECK: .byte 2
-; CHECK: .byte 8
+; CHECK: .byte 0
+; CHECK: .short 8
; CHECK: .short 7
+; CHECK: .short 0
; CHECK: .long 0
; No Padding or LiveOuts
diff --git a/test/CodeGen/X86/statepoint-live-in.ll b/test/CodeGen/X86/statepoint-live-in.ll
index b236393e9f49..abe2b0a7acc8 100644
--- a/test/CodeGen/X86/statepoint-live-in.ll
+++ b/test/CodeGen/X86/statepoint-live-in.ll
@@ -89,27 +89,37 @@ entry:
; CHECK: Ltmp0-_test1
; CHECK: .byte 1
-; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 4
; CHECK-NEXT: .short 5
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; CHECK: Ltmp1-_test2
; CHECK: .byte 1
-; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 4
; CHECK-NEXT: .short 6
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; CHECK: .byte 1
-; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 4
; CHECK-NEXT: .short 3
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; CHECK: Ltmp2-_test2
; CHECK: .byte 1
-; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 4
; CHECK-NEXT: .short 3
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
; CHECK: .byte 1
-; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .byte 0
+; CHECK-NEXT: .short 4
; CHECK-NEXT: .short 6
+; CHECK-NEXT: .short 0
; CHECK-NEXT: .long 0
declare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...)
diff --git a/test/CodeGen/X86/statepoint-stackmap-format.ll b/test/CodeGen/X86/statepoint-stackmap-format.ll
index df6180de17a3..0506381b9ec2 100644
--- a/test/CodeGen/X86/statepoint-stackmap-format.ll
+++ b/test/CodeGen/X86/statepoint-stackmap-format.ll
@@ -79,7 +79,7 @@ declare i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token, i32, i32)
; CHECK-LABEL: .section .llvm_stackmaps
; CHECK-NEXT: __LLVM_StackMaps:
; Header
-; CHECK-NEXT: .byte 2
+; CHECK-NEXT: .byte 3
; CHECK-NEXT: .byte 0
; CHECK-NEXT: .short 0
; Num Functions
@@ -114,58 +114,80 @@ declare i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token, i32, i32)
; CHECK: .short 11
; SmallConstant (0)
; CHECK: .byte 4
-; CHECK: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK: .short 8
; CHECK: .short 0
+; CHECK-NEXT: .short 0
; CHECK: .long 0
; SmallConstant (0)
; CHECK: .byte 4
-; CHECK: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK: .short 8
; CHECK: .short 0
+; CHECK-NEXT: .short 0
; CHECK: .long 0
; SmallConstant (2)
; CHECK: .byte 4
-; CHECK: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK: .short 8
; CHECK: .short 0
+; CHECK-NEXT: .short 0
; CHECK: .long 2
; Indirect Spill Slot [RSP+0]
; CHECK: .byte 3
-; CHECK: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK: .short 8
; CHECK: .short 7
+; CHECK-NEXT: .short 0
; CHECK: .long 16
; SmallConstant (0)
; CHECK: .byte 4
-; CHECK: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK: .short 8
; CHECK: .short 0
+; CHECK-NEXT: .short 0
; CHECK: .long 0
; SmallConstant (0)
; CHECK: .byte 4
-; CHECK: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK: .short 8
; CHECK: .short 0
+; CHECK-NEXT: .short 0
; CHECK: .long 0
; SmallConstant (0)
; CHECK: .byte 4
-; CHECK: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK: .short 8
; CHECK: .short 0
+; CHECK-NEXT: .short 0
; CHECK: .long 0
; Indirect Spill Slot [RSP+16]
; CHECK: .byte 3
-; CHECK: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK: .short 8
; CHECK: .short 7
+; CHECK-NEXT: .short 0
; CHECK: .long 16
; Indirect Spill Slot [RSP+8]
; CHECK: .byte 3
-; CHECK: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK: .short 8
; CHECK: .short 7
+; CHECK-NEXT: .short 0
; CHECK: .long 8
; Indirect Spill Slot [RSP+16]
; CHECK: .byte 3
-; CHECK: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK: .short 8
; CHECK: .short 7
+; CHECK-NEXT: .short 0
; CHECK: .long 16
; Indirect Spill Slot [RSP+16]
; CHECK: .byte 3
-; CHECK: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK: .short 8
; CHECK: .short 7
+; CHECK-NEXT: .short 0
; CHECK: .long 16
; No Padding or LiveOuts
@@ -186,53 +208,73 @@ declare i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token, i32, i32)
; CHECK: .short 11
; SmallConstant (0)
; CHECK: .byte 4
-; CHECK: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK: .short 8
; CHECK: .short 0
+; CHECK-NEXT: .short 0
; CHECK: .long 0
; SmallConstant (2)
; CHECK: .byte 4
-; CHECK: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK: .short 8
; CHECK: .short 0
+; CHECK-NEXT: .short 0
; CHECK: .long 2
; Indirect Spill Slot [RSP+0]
; CHECK: .byte 3
-; CHECK: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK: .short 8
; CHECK: .short 7
+; CHECK-NEXT: .short 0
; CHECK: .long 16
; SmallConstant (0)
; CHECK: .byte 4
-; CHECK: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK: .short 8
; CHECK: .short 0
+; CHECK-NEXT: .short 0
; CHECK: .long 0
; SmallConstant (0)
; CHECK: .byte 4
-; CHECK: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK: .short 8
; CHECK: .short 0
+; CHECK-NEXT: .short 0
; CHECK: .long 0
; SmallConstant (0)
; CHECK: .byte 4
-; CHECK: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK: .short 8
; CHECK: .short 0
+; CHECK-NEXT: .short 0
; CHECK: .long 0
; Indirect Spill Slot [RSP+16]
; CHECK: .byte 3
-; CHECK: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK: .short 8
; CHECK: .short 7
+; CHECK-NEXT: .short 0
; CHECK: .long 16
; Indirect Spill Slot [RSP+8]
; CHECK: .byte 3
-; CHECK: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK: .short 8
; CHECK: .short 7
+; CHECK-NEXT: .short 0
; CHECK: .long 8
; Indirect Spill Slot [RSP+16]
; CHECK: .byte 3
-; CHECK: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK: .short 8
; CHECK: .short 7
+; CHECK-NEXT: .short 0
; CHECK: .long 16
; Indirect Spill Slot [RSP+16]
; CHECK: .byte 3
-; CHECK: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK: .short 8
; CHECK: .short 7
+; CHECK-NEXT: .short 0
; CHECK: .long 16
; No Padding or LiveOuts
@@ -257,22 +299,28 @@ declare i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token, i32, i32)
; StkMapRecord[0]:
; SmallConstant(0):
; CHECK: .byte 4
-; CHECK: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK: .short 8
; CHECK: .short 0
+; CHECK-NEXT: .short 0
; CHECK: .long 0
; StkMapRecord[1]:
; SmallConstant(0):
; CHECK: .byte 4
-; CHECK: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK: .short 8
; CHECK: .short 0
+; CHECK-NEXT: .short 0
; CHECK: .long 0
; StkMapRecord[2]:
; SmallConstant(0):
; CHECK: .byte 4
-; CHECK: .byte 8
+; CHECK-NEXT: .byte 0
+; CHECK: .short 8
; CHECK: .short 0
+; CHECK-NEXT: .short 0
; CHECK: .long 0
; No padding or LiveOuts
diff --git a/test/CodeGen/X86/statepoint-vector.ll b/test/CodeGen/X86/statepoint-vector.ll
index 15fb25777edd..000e88742880 100644
--- a/test/CodeGen/X86/statepoint-vector.ll
+++ b/test/CodeGen/X86/statepoint-vector.ll
@@ -108,51 +108,67 @@ entry:
; CHECK: .Ltmp0-test
; Check for the two spill slots
-; Stack Maps: Loc 3: Indirect 7+0 [encoding: .byte 3, .byte 16, .short 7, .int 0]
-; Stack Maps: Loc 4: Indirect 7+0 [encoding: .byte 3, .byte 16, .short 7, .int 0]
+; Stack Maps: Loc 3: Indirect 7+0 [encoding: .byte 3, .byte 0, .short 16, .short 7, .short 0, .int 0]
+; Stack Maps: Loc 4: Indirect 7+0 [encoding: .byte 3, .byte 0, .short 16, .short 7, .short 0, .int 0]
; CHECK: .byte 3
-; CHECK: .byte 16
+; CHECK: .byte 0
+; CHECK: .short 16
; CHECK: .short 7
+; CHECK: .short 0
; CHECK: .long 0
; CHECK: .byte 3
-; CHECK: .byte 16
+; CHECK: .byte 0
+; CHECK: .short 16
; CHECK: .short 7
+; CHECK: .short 0
; CHECK: .long 0
; CHECK: .Ltmp1-test2
; Check for the two spill slots
-; Stack Maps: Loc 3: Indirect 7+16 [encoding: .byte 3, .byte 16, .short 7, .int 16]
-; Stack Maps: Loc 4: Indirect 7+0 [encoding: .byte 3, .byte 16, .short 7, .int 0]
+; Stack Maps: Loc 3: Indirect 7+16 [encoding: .byte 3, .byte 0, .short 16, .short 7, .short 0, .int 16]
+; Stack Maps: Loc 4: Indirect 7+0 [encoding: .byte 3, .byte 0, .short 16, .short 7, .short 0, .int 0]
; CHECK: .byte 3
-; CHECK: .byte 16
+; CHECK: .byte 0
+; CHECK: .short 16
; CHECK: .short 7
+; CHECK: .short 0
; CHECK: .long 16
; CHECK: .byte 3
-; CHECK: .byte 16
+; CHECK: .byte 0
+; CHECK: .short 16
; CHECK: .short 7
+; CHECK: .short 0
; CHECK: .long 0
; CHECK: .Ltmp2-test3
; Check for the four spill slots
-; Stack Maps: Loc 3: Indirect 7+16 [encoding: .byte 3, .byte 16, .short 7, .int 16]
-; Stack Maps: Loc 4: Indirect 7+16 [encoding: .byte 3, .byte 16, .short 7, .int 16]
-; Stack Maps: Loc 5: Indirect 7+16 [encoding: .byte 3, .byte 16, .short 7, .int 16]
-; Stack Maps: Loc 6: Indirect 7+0 [encoding: .byte 3, .byte 16, .short 7, .int 0]
+; Stack Maps: Loc 3: Indirect 7+16 [encoding: .byte 3, .byte 0, .short 16, .short 7, .short 0, .int 16]
+; Stack Maps: Loc 4: Indirect 7+16 [encoding: .byte 3, .byte 0, .short 16, .short 7, .short 0, .int 16]
+; Stack Maps: Loc 5: Indirect 7+16 [encoding: .byte 3, .byte 0, .short 16, .short 7, .short 0, .int 16]
+; Stack Maps: Loc 6: Indirect 7+0 [encoding: .byte 3, .byte 0, .short 16, .short 7, .short 0, .int 0]
; CHECK: .byte 3
-; CHECK: .byte 16
+; CHECK: .byte 0
+; CHECK: .short 16
; CHECK: .short 7
+; CHECK: .short 0
; CHECK: .long 16
; CHECK: .byte 3
-; CHECK: .byte 16
+; CHECK: .byte 0
+; CHECK: .short 16
; CHECK: .short 7
+; CHECK: .short 0
; CHECK: .long 16
; CHECK: .byte 3
-; CHECK: .byte 16
+; CHECK: .byte 0
+; CHECK: .short 16
; CHECK: .short 7
+; CHECK: .short 0
; CHECK: .long 16
; CHECK: .byte 3
-; CHECK: .byte 16
+; CHECK: .byte 0
+; CHECK: .short 16
; CHECK: .short 7
+; CHECK: .short 0
; CHECK: .long 0
declare void @do_safepoint()
diff --git a/test/CodeGen/X86/vector-shuffle-combining.ll b/test/CodeGen/X86/vector-shuffle-combining.ll
index a65d830351e4..e04c5321fa25 100644
--- a/test/CodeGen/X86/vector-shuffle-combining.ll
+++ b/test/CodeGen/X86/vector-shuffle-combining.ll
@@ -2899,3 +2899,37 @@ entry:
%s2 = shufflevector <8 x float> %s1, <8 x float> undef, <8 x i32> <i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2>
ret <8 x float> %s2
}
+
+define <4 x float> @PR30264(<4 x float> %x) {
+; SSE2-LABEL: PR30264:
+; SSE2: # BB#0:
+; SSE2-NEXT: xorps %xmm1, %xmm1
+; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,0],xmm0[0,0]
+; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[2,0],mem[2,3]
+; SSE2-NEXT: movaps %xmm1, %xmm0
+; SSE2-NEXT: retq
+;
+; SSSE3-LABEL: PR30264:
+; SSSE3: # BB#0:
+; SSSE3-NEXT: xorps %xmm1, %xmm1
+; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,0],xmm0[0,0]
+; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[2,0],mem[2,3]
+; SSSE3-NEXT: movaps %xmm1, %xmm0
+; SSSE3-NEXT: retq
+;
+; SSE41-LABEL: PR30264:
+; SSE41: # BB#0:
+; SSE41-NEXT: movaps {{.*#+}} xmm1 = <u,u,4,1>
+; SSE41-NEXT: insertps {{.*#+}} xmm1 = xmm0[0],zero,xmm1[2,3]
+; SSE41-NEXT: movaps %xmm1, %xmm0
+; SSE41-NEXT: retq
+;
+; AVX-LABEL: PR30264:
+; AVX: # BB#0:
+; AVX-NEXT: vmovaps {{.*#+}} xmm1 = <u,u,4,1>
+; AVX-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0],zero,xmm1[2,3]
+; AVX-NEXT: retq
+ %shuf1 = shufflevector <4 x float> %x, <4 x float> <float undef, float 0.0, float undef, float undef>, <4 x i32> <i32 0, i32 5, i32 undef, i32 undef>
+ %shuf2 = shufflevector <4 x float> %shuf1, <4 x float> <float undef, float undef, float 4.0, float 1.0>, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
+ ret <4 x float> %shuf2
+}
diff --git a/test/CodeGen/X86/widened-broadcast.ll b/test/CodeGen/X86/widened-broadcast.ll
index 900a7546f15b..6b2e4de5cdaa 100644
--- a/test/CodeGen/X86/widened-broadcast.ll
+++ b/test/CodeGen/X86/widened-broadcast.ll
@@ -579,3 +579,72 @@ entry:
%ret = shufflevector <32 x i8> %ld, <32 x i8> undef, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
ret <32 x i8> %ret
}
+
+define <4 x float> @load_splat_4f32_8f32_0000(<8 x float>* %ptr) nounwind uwtable readnone ssp {
+; SSE-LABEL: load_splat_4f32_8f32_0000:
+; SSE: # BB#0: # %entry
+; SSE-NEXT: movaps (%rdi), %xmm0
+; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0,0,0]
+; SSE-NEXT: retq
+;
+; AVX1-LABEL: load_splat_4f32_8f32_0000:
+; AVX1: # BB#0: # %entry
+; AVX1-NEXT: vmovaps (%rdi), %ymm0
+; AVX1-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,0,0,0]
+; AVX1-NEXT: vzeroupper
+; AVX1-NEXT: retq
+;
+; AVX2-LABEL: load_splat_4f32_8f32_0000:
+; AVX2: # BB#0: # %entry
+; AVX2-NEXT: vmovaps (%rdi), %ymm0
+; AVX2-NEXT: vbroadcastss %xmm0, %xmm0
+; AVX2-NEXT: vzeroupper
+; AVX2-NEXT: retq
+;
+; AVX512-LABEL: load_splat_4f32_8f32_0000:
+; AVX512: # BB#0: # %entry
+; AVX512-NEXT: vmovaps (%rdi), %ymm0
+; AVX512-NEXT: vbroadcastss %xmm0, %xmm0
+; AVX512-NEXT: vzeroupper
+; AVX512-NEXT: retq
+entry:
+ %ld = load <8 x float>, <8 x float>* %ptr
+ %ret = shufflevector <8 x float> %ld, <8 x float> undef, <4 x i32> zeroinitializer
+ ret <4 x float> %ret
+}
+
+define <8 x float> @load_splat_8f32_16f32_89898989(<16 x float>* %ptr) nounwind uwtable readnone ssp {
+; SSE2-LABEL: load_splat_8f32_16f32_89898989:
+; SSE2: # BB#0: # %entry
+; SSE2-NEXT: movaps 32(%rdi), %xmm0
+; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0,0]
+; SSE2-NEXT: movaps %xmm0, %xmm1
+; SSE2-NEXT: retq
+;
+; SSE42-LABEL: load_splat_8f32_16f32_89898989:
+; SSE42: # BB#0: # %entry
+; SSE42-NEXT: movddup {{.*#+}} xmm0 = mem[0,0]
+; SSE42-NEXT: movapd %xmm0, %xmm1
+; SSE42-NEXT: retq
+;
+; AVX1-LABEL: load_splat_8f32_16f32_89898989:
+; AVX1: # BB#0: # %entry
+; AVX1-NEXT: vbroadcastsd 32(%rdi), %ymm0
+; AVX1-NEXT: retq
+;
+; AVX2-LABEL: load_splat_8f32_16f32_89898989:
+; AVX2: # BB#0: # %entry
+; AVX2-NEXT: vbroadcastsd 32(%rdi), %ymm0
+; AVX2-NEXT: retq
+;
+; AVX512-LABEL: load_splat_8f32_16f32_89898989:
+; AVX512: # BB#0: # %entry
+; AVX512-NEXT: vmovapd (%rdi), %zmm0
+; AVX512-NEXT: vextractf64x4 $1, %zmm0, %ymm0
+; AVX512-NEXT: vbroadcastsd %xmm0, %ymm0
+; AVX512-NEXT: retq
+entry:
+ %ld = load <16 x float>, <16 x float>* %ptr
+ %ret = shufflevector <16 x float> %ld, <16 x float> undef, <8 x i32> <i32 8, i32 9, i32 8, i32 9, i32 8, i32 9, i32 8, i32 9>
+ ret <8 x float> %ret
+}