-
-
Save nikic/04876ffe96a5ee2ffb4be102cbbb8d60 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
commit ddba55a74aa5965ce0b51552e0dcb8cc4e3296a7 | |
Author: Nikita Popov <nikita.ppv@gmail.com> | |
Date: Sun Mar 28 15:40:46 2021 +0200 | |
don't use xor to zero register | |
diff --git a/llvm/lib/Target/X86/X86FastISel.cpp b/llvm/lib/Target/X86/X86FastISel.cpp | |
index b37cd25c7de1..9106157aaf01 100644 | |
--- a/llvm/lib/Target/X86/X86FastISel.cpp | |
+++ b/llvm/lib/Target/X86/X86FastISel.cpp | |
@@ -3713,29 +3713,6 @@ unsigned X86FastISel::X86MaterializeInt(const ConstantInt *CI, MVT VT) { | |
return 0; | |
uint64_t Imm = CI->getZExtValue(); | |
- if (Imm == 0) { | |
- Register SrcReg = fastEmitInst_(X86::MOV32r0, &X86::GR32RegClass); | |
- switch (VT.SimpleTy) { | |
- default: llvm_unreachable("Unexpected value type"); | |
- case MVT::i1: | |
- case MVT::i8: | |
- return fastEmitInst_extractsubreg(MVT::i8, SrcReg, /*Op0IsKill=*/true, | |
- X86::sub_8bit); | |
- case MVT::i16: | |
- return fastEmitInst_extractsubreg(MVT::i16, SrcReg, /*Op0IsKill=*/true, | |
- X86::sub_16bit); | |
- case MVT::i32: | |
- return SrcReg; | |
- case MVT::i64: { | |
- Register ResultReg = createResultReg(&X86::GR64RegClass); | |
- BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, | |
- TII.get(TargetOpcode::SUBREG_TO_REG), ResultReg) | |
- .addImm(0).addReg(SrcReg).addImm(X86::sub_32bit); | |
- return ResultReg; | |
- } | |
- } | |
- } | |
- | |
unsigned Opc = 0; | |
switch (VT.SimpleTy) { | |
default: llvm_unreachable("Unexpected value type"); | |
diff --git a/llvm/test/CodeGen/X86/atomic-unordered.ll b/llvm/test/CodeGen/X86/atomic-unordered.ll | |
index f5eaa6f2409a..06a10aa6aada 100644 | |
--- a/llvm/test/CodeGen/X86/atomic-unordered.ll | |
+++ b/llvm/test/CodeGen/X86/atomic-unordered.ll | |
@@ -321,7 +321,7 @@ define i256 @load_i256(i256* %ptr) { | |
; CHECK-O0-NEXT: movl $32, %edi | |
; CHECK-O0-NEXT: leaq {{[0-9]+}}(%rsp), %rdx | |
; CHECK-O0-NEXT: xorl %ecx, %ecx | |
-; CHECK-O0-NEXT: callq __atomic_load | |
+; CHECK-O0-NEXT: callq __atomic_load@PLT | |
; CHECK-O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdi # 8-byte Reload | |
; CHECK-O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload | |
; CHECK-O0-NEXT: movq {{[0-9]+}}(%rsp), %rcx | |
@@ -347,7 +347,7 @@ define i256 @load_i256(i256* %ptr) { | |
; CHECK-O3-NEXT: movq %rsp, %rdx | |
; CHECK-O3-NEXT: movl $32, %edi | |
; CHECK-O3-NEXT: xorl %ecx, %ecx | |
-; CHECK-O3-NEXT: callq __atomic_load | |
+; CHECK-O3-NEXT: callq __atomic_load@PLT | |
; CHECK-O3-NEXT: vmovups (%rsp), %ymm0 | |
; CHECK-O3-NEXT: vmovups %ymm0, (%rbx) | |
; CHECK-O3-NEXT: movq %rbx, %rax | |
@@ -376,8 +376,8 @@ define void @store_i256(i256* %ptr, i256 %v) { | |
; CHECK-O0-NEXT: movq %rcx, {{[0-9]+}}(%rsp) | |
; CHECK-O0-NEXT: movq %r8, {{[0-9]+}}(%rsp) | |
; CHECK-O0-NEXT: movl $32, %edi | |
-; CHECK-O0-NEXT: xorl %ecx, %ecx | |
-; CHECK-O0-NEXT: callq __atomic_store | |
+; CHECK-O0-NEXT: movl $0, %ecx | |
+; CHECK-O0-NEXT: callq __atomic_store@PLT | |
; CHECK-O0-NEXT: addq $40, %rsp | |
; CHECK-O0-NEXT: .cfi_def_cfa_offset 8 | |
; CHECK-O0-NEXT: retq | |
@@ -395,7 +395,7 @@ define void @store_i256(i256* %ptr, i256 %v) { | |
; CHECK-O3-NEXT: movl $32, %edi | |
; CHECK-O3-NEXT: movq %rax, %rsi | |
; CHECK-O3-NEXT: xorl %ecx, %ecx | |
-; CHECK-O3-NEXT: callq __atomic_store | |
+; CHECK-O3-NEXT: callq __atomic_store@PLT | |
; CHECK-O3-NEXT: addq $40, %rsp | |
; CHECK-O3-NEXT: .cfi_def_cfa_offset 8 | |
; CHECK-O3-NEXT: retq | |
diff --git a/llvm/test/CodeGen/X86/avx512-calling-conv.ll b/llvm/test/CodeGen/X86/avx512-calling-conv.ll | |
index 515787e98ece..dad3116f832f 100644 | |
--- a/llvm/test/CodeGen/X86/avx512-calling-conv.ll | |
+++ b/llvm/test/CodeGen/X86/avx512-calling-conv.ll | |
@@ -506,7 +506,7 @@ define i32 @test12(i32 %a1, i32 %a2, i32 %b1) { | |
; FASTISEL-NEXT: movl %r14d, %esi | |
; FASTISEL-NEXT: movl %ebx, %edx | |
; FASTISEL-NEXT: callq _test10 | |
-; FASTISEL-NEXT: xorl %ecx, %ecx | |
+; FASTISEL-NEXT: movl $0, %ecx | |
; FASTISEL-NEXT: testb $1, %bl | |
; FASTISEL-NEXT: cmovel %ecx, %eax | |
; FASTISEL-NEXT: popq %rbx | |
diff --git a/llvm/test/CodeGen/X86/avx512-fsel.ll b/llvm/test/CodeGen/X86/avx512-fsel.ll | |
index 6efb66e6865e..7b7a56bb2a91 100644 | |
--- a/llvm/test/CodeGen/X86/avx512-fsel.ll | |
+++ b/llvm/test/CodeGen/X86/avx512-fsel.ll | |
@@ -21,7 +21,7 @@ define i32 @test(float %a, float %b) { | |
; CHECK-NEXT: callq ___assert_rtn | |
; CHECK-NEXT: ud2 | |
; CHECK-NEXT: LBB0_2: ## %L_1 | |
-; CHECK-NEXT: xorl %eax, %eax | |
+; CHECK-NEXT: movl $0, %eax | |
; CHECK-NEXT: popq %rcx | |
; CHECK-NEXT: retq | |
%x10 = fcmp oeq float %a, %b | |
diff --git a/llvm/test/CodeGen/X86/bmi-intrinsics-fast-isel-x86_64.ll b/llvm/test/CodeGen/X86/bmi-intrinsics-fast-isel-x86_64.ll | |
index d704f38307fc..8af17dafa4b5 100644 | |
--- a/llvm/test/CodeGen/X86/bmi-intrinsics-fast-isel-x86_64.ll | |
+++ b/llvm/test/CodeGen/X86/bmi-intrinsics-fast-isel-x86_64.ll | |
@@ -31,7 +31,7 @@ define i64 @test__bextr_u64(i64 %a0, i64 %a1) { | |
define i64 @test__blsi_u64(i64 %a0) { | |
; X64-LABEL: test__blsi_u64: | |
; X64: # %bb.0: | |
-; X64-NEXT: xorl %eax, %eax | |
+; X64-NEXT: movl $0, %eax | |
; X64-NEXT: subq %rdi, %rax | |
; X64-NEXT: andq %rdi, %rax | |
; X64-NEXT: retq | |
@@ -110,7 +110,7 @@ define i64 @test_bextr_u64(i64 %a0, i32 %a1, i32 %a2) { | |
define i64 @test_blsi_u64(i64 %a0) { | |
; X64-LABEL: test_blsi_u64: | |
; X64: # %bb.0: | |
-; X64-NEXT: xorl %eax, %eax | |
+; X64-NEXT: movl $0, %eax | |
; X64-NEXT: subq %rdi, %rax | |
; X64-NEXT: andq %rdi, %rax | |
; X64-NEXT: retq | |
diff --git a/llvm/test/CodeGen/X86/bmi-intrinsics-fast-isel.ll b/llvm/test/CodeGen/X86/bmi-intrinsics-fast-isel.ll | |
index fc3e54e06d5f..6354e594c96f 100644 | |
--- a/llvm/test/CodeGen/X86/bmi-intrinsics-fast-isel.ll | |
+++ b/llvm/test/CodeGen/X86/bmi-intrinsics-fast-isel.ll | |
@@ -62,14 +62,14 @@ define i32 @test__blsi_u32(i32 %a0) { | |
; X86-LABEL: test__blsi_u32: | |
; X86: # %bb.0: | |
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx | |
-; X86-NEXT: xorl %eax, %eax | |
+; X86-NEXT: movl $0, %eax | |
; X86-NEXT: subl %ecx, %eax | |
; X86-NEXT: andl %ecx, %eax | |
; X86-NEXT: retl | |
; | |
; X64-LABEL: test__blsi_u32: | |
; X64: # %bb.0: | |
-; X64-NEXT: xorl %eax, %eax | |
+; X64-NEXT: movl $0, %eax | |
; X64-NEXT: subl %edi, %eax | |
; X64-NEXT: andl %edi, %eax | |
; X64-NEXT: retq | |
@@ -202,14 +202,14 @@ define i32 @test_blsi_u32(i32 %a0) { | |
; X86-LABEL: test_blsi_u32: | |
; X86: # %bb.0: | |
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx | |
-; X86-NEXT: xorl %eax, %eax | |
+; X86-NEXT: movl $0, %eax | |
; X86-NEXT: subl %ecx, %eax | |
; X86-NEXT: andl %ecx, %eax | |
; X86-NEXT: retl | |
; | |
; X64-LABEL: test_blsi_u32: | |
; X64: # %bb.0: | |
-; X64-NEXT: xorl %eax, %eax | |
+; X64-NEXT: movl $0, %eax | |
; X64-NEXT: subl %edi, %eax | |
; X64-NEXT: andl %edi, %eax | |
; X64-NEXT: retq | |
diff --git a/llvm/test/CodeGen/X86/crash-O0.ll b/llvm/test/CodeGen/X86/crash-O0.ll | |
index 1b64247d170a..69aa0e6ba4de 100644 | |
--- a/llvm/test/CodeGen/X86/crash-O0.ll | |
+++ b/llvm/test/CodeGen/X86/crash-O0.ll | |
@@ -16,13 +16,11 @@ define i32 @div8() nounwind { | |
; CHECK-NEXT: movq %rsp, %rbp | |
; CHECK-NEXT: ## implicit-def: $rax | |
; CHECK-NEXT: movb %al, %cl | |
-; CHECK-NEXT: xorl %eax, %eax | |
-; CHECK-NEXT: ## kill: def $al killed $al killed $eax | |
+; CHECK-NEXT: movb $0, %al | |
; CHECK-NEXT: movzbw %al, %ax | |
; CHECK-NEXT: divb %cl | |
; CHECK-NEXT: movb %al, {{[-0-9]+}}(%r{{[sb]}}p) ## 1-byte Spill | |
-; CHECK-NEXT: xorl %eax, %eax | |
-; CHECK-NEXT: ## kill: def $al killed $al killed $eax | |
+; CHECK-NEXT: movb $0, %al | |
; CHECK-NEXT: movzbw %al, %ax | |
; CHECK-NEXT: divb %cl | |
; CHECK-NEXT: shrw $8, %ax | |
@@ -80,8 +78,7 @@ define i64 @addressModeWith32bitIndex(i32 %V) { | |
; CHECK-NEXT: .cfi_offset %rbp, -16 | |
; CHECK-NEXT: movq %rsp, %rbp | |
; CHECK-NEXT: .cfi_def_cfa_register %rbp | |
-; CHECK-NEXT: xorl %eax, %eax | |
-; CHECK-NEXT: movl %eax, %ecx | |
+; CHECK-NEXT: movl $0, %ecx | |
; CHECK-NEXT: movq %rcx, %rax | |
; CHECK-NEXT: cqto | |
; CHECK-NEXT: movslq %edi, %rsi | |
diff --git a/llvm/test/CodeGen/X86/fast-isel-cmp-branch3.ll b/llvm/test/CodeGen/X86/fast-isel-cmp-branch3.ll | |
index 8f09b2e38356..43e575bdb979 100644 | |
--- a/llvm/test/CodeGen/X86/fast-isel-cmp-branch3.ll | |
+++ b/llvm/test/CodeGen/X86/fast-isel-cmp-branch3.ll | |
@@ -1,9 +1,17 @@ | |
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | |
; RUN: llc < %s -fast-isel -fast-isel-abort=1 -mtriple=x86_64-apple-darwin10 | FileCheck %s | |
define i32 @fcmp_oeq1(float %x) { | |
-; CHECK-LABEL: fcmp_oeq1 | |
-; CHECK: ucomiss %xmm0, %xmm0 | |
-; CHECK-NEXT: jp {{LBB.+_1}} | |
+; CHECK-LABEL: fcmp_oeq1: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: ucomiss %xmm0, %xmm0 | |
+; CHECK-NEXT: jp LBB0_1 | |
+; CHECK-NEXT: ## %bb.2: ## %bb1 | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
+; CHECK-NEXT: LBB0_1: ## %bb2 | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp oeq float %x, %x | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -13,11 +21,18 @@ bb1: | |
} | |
define i32 @fcmp_oeq2(float %x) { | |
-; CHECK-LABEL: fcmp_oeq2 | |
-; CHECK: xorps %xmm1, %xmm1 | |
-; CHECK-NEXT: ucomiss %xmm1, %xmm0 | |
-; CHECK-NEXT: jne {{LBB.+_1}} | |
-; CHECK-NEXT: jp {{LBB.+_1}} | |
+; CHECK-LABEL: fcmp_oeq2: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: xorps %xmm1, %xmm1 | |
+; CHECK-NEXT: ucomiss %xmm1, %xmm0 | |
+; CHECK-NEXT: jne LBB1_1 | |
+; CHECK-NEXT: jp LBB1_1 | |
+; CHECK-NEXT: ## %bb.2: ## %bb1 | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
+; CHECK-NEXT: LBB1_1: ## %bb2 | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp oeq float %x, 0.000000e+00 | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -27,9 +42,10 @@ bb1: | |
} | |
define i32 @fcmp_ogt1(float %x) { | |
-; CHECK-LABEL: fcmp_ogt1 | |
-; CHECK-NOT: ucomiss | |
-; CHECK: movl $1, %eax | |
+; CHECK-LABEL: fcmp_ogt1: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp ogt float %x, %x | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -39,10 +55,17 @@ bb1: | |
} | |
define i32 @fcmp_ogt2(float %x) { | |
-; CHECK-LABEL: fcmp_ogt2 | |
-; CHECK: xorps %xmm1, %xmm1 | |
-; CHECK-NEXT: ucomiss %xmm1, %xmm0 | |
-; CHECK-NEXT: jbe {{LBB.+_1}} | |
+; CHECK-LABEL: fcmp_ogt2: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: xorps %xmm1, %xmm1 | |
+; CHECK-NEXT: ucomiss %xmm1, %xmm0 | |
+; CHECK-NEXT: jbe LBB3_1 | |
+; CHECK-NEXT: ## %bb.2: ## %bb1 | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
+; CHECK-NEXT: LBB3_1: ## %bb2 | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp ogt float %x, 0.000000e+00 | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -52,9 +75,16 @@ bb1: | |
} | |
define i32 @fcmp_oge1(float %x) { | |
-; CHECK-LABEL: fcmp_oge1 | |
-; CHECK: ucomiss %xmm0, %xmm0 | |
-; CHECK-NEXT: jp {{LBB.+_1}} | |
+; CHECK-LABEL: fcmp_oge1: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: ucomiss %xmm0, %xmm0 | |
+; CHECK-NEXT: jp LBB4_1 | |
+; CHECK-NEXT: ## %bb.2: ## %bb1 | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
+; CHECK-NEXT: LBB4_1: ## %bb2 | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp oge float %x, %x | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -64,10 +94,17 @@ bb1: | |
} | |
define i32 @fcmp_oge2(float %x) { | |
-; CHECK-LABEL: fcmp_oge2 | |
-; CHECK: xorps %xmm1, %xmm1 | |
-; CHECK-NEXT: ucomiss %xmm1, %xmm0 | |
-; CHECK-NEXT: jb {{LBB.+_1}} | |
+; CHECK-LABEL: fcmp_oge2: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: xorps %xmm1, %xmm1 | |
+; CHECK-NEXT: ucomiss %xmm1, %xmm0 | |
+; CHECK-NEXT: jb LBB5_1 | |
+; CHECK-NEXT: ## %bb.2: ## %bb1 | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
+; CHECK-NEXT: LBB5_1: ## %bb2 | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp oge float %x, 0.000000e+00 | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -77,9 +114,10 @@ bb1: | |
} | |
define i32 @fcmp_olt1(float %x) { | |
-; CHECK-LABEL: fcmp_olt1 | |
-; CHECK-NOT: ucomiss | |
-; CHECK: movl $1, %eax | |
+; CHECK-LABEL: fcmp_olt1: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp olt float %x, %x | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -89,10 +127,17 @@ bb1: | |
} | |
define i32 @fcmp_olt2(float %x) { | |
-; CHECK-LABEL: fcmp_olt2 | |
-; CHECK: xorps %xmm1, %xmm1 | |
-; CHECK-NEXT: ucomiss %xmm0, %xmm1 | |
-; CHECK-NEXT: jbe {{LBB.+_1}} | |
+; CHECK-LABEL: fcmp_olt2: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: xorps %xmm1, %xmm1 | |
+; CHECK-NEXT: ucomiss %xmm0, %xmm1 | |
+; CHECK-NEXT: jbe LBB7_1 | |
+; CHECK-NEXT: ## %bb.2: ## %bb1 | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
+; CHECK-NEXT: LBB7_1: ## %bb2 | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp olt float %x, 0.000000e+00 | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -102,9 +147,16 @@ bb1: | |
} | |
define i32 @fcmp_ole1(float %x) { | |
-; CHECK-LABEL: fcmp_ole1 | |
-; CHECK: ucomiss %xmm0, %xmm0 | |
-; CHECK-NEXT: jp {{LBB.+_1}} | |
+; CHECK-LABEL: fcmp_ole1: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: ucomiss %xmm0, %xmm0 | |
+; CHECK-NEXT: jp LBB8_1 | |
+; CHECK-NEXT: ## %bb.2: ## %bb1 | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
+; CHECK-NEXT: LBB8_1: ## %bb2 | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp ole float %x, %x | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -114,10 +166,17 @@ bb1: | |
} | |
define i32 @fcmp_ole2(float %x) { | |
-; CHECK-LABEL: fcmp_ole2 | |
-; CHECK: xorps %xmm1, %xmm1 | |
-; CHECK-NEXT: ucomiss %xmm0, %xmm1 | |
-; CHECK-NEXT: jb {{LBB.+_1}} | |
+; CHECK-LABEL: fcmp_ole2: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: xorps %xmm1, %xmm1 | |
+; CHECK-NEXT: ucomiss %xmm0, %xmm1 | |
+; CHECK-NEXT: jb LBB9_1 | |
+; CHECK-NEXT: ## %bb.2: ## %bb1 | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
+; CHECK-NEXT: LBB9_1: ## %bb2 | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp ole float %x, 0.000000e+00 | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -127,9 +186,10 @@ bb1: | |
} | |
define i32 @fcmp_one1(float %x) { | |
-; CHECK-LABEL: fcmp_one1 | |
-; CHECK-NOT: ucomiss | |
-; CHECK: movl $1, %eax | |
+; CHECK-LABEL: fcmp_one1: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp one float %x, %x | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -139,10 +199,17 @@ bb1: | |
} | |
define i32 @fcmp_one2(float %x) { | |
-; CHECK-LABEL: fcmp_one2 | |
-; CHECK: xorps %xmm1, %xmm1 | |
-; CHECK-NEXT: ucomiss %xmm1, %xmm0 | |
-; CHECK-NEXT: je {{LBB.+_1}} | |
+; CHECK-LABEL: fcmp_one2: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: xorps %xmm1, %xmm1 | |
+; CHECK-NEXT: ucomiss %xmm1, %xmm0 | |
+; CHECK-NEXT: je LBB11_1 | |
+; CHECK-NEXT: ## %bb.2: ## %bb1 | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
+; CHECK-NEXT: LBB11_1: ## %bb2 | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp one float %x, 0.000000e+00 | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -152,9 +219,16 @@ bb1: | |
} | |
define i32 @fcmp_ord1(float %x) { | |
-; CHECK-LABEL: fcmp_ord1 | |
-; CHECK: ucomiss %xmm0, %xmm0 | |
-; CHECK-NEXT: jp {{LBB.+_1}} | |
+; CHECK-LABEL: fcmp_ord1: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: ucomiss %xmm0, %xmm0 | |
+; CHECK-NEXT: jp LBB12_1 | |
+; CHECK-NEXT: ## %bb.2: ## %bb1 | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
+; CHECK-NEXT: LBB12_1: ## %bb2 | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp ord float %x, %x | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -164,9 +238,16 @@ bb1: | |
} | |
define i32 @fcmp_ord2(float %x) { | |
-; CHECK-LABEL: fcmp_ord2 | |
-; CHECK: ucomiss %xmm0, %xmm0 | |
-; CHECK-NEXT: jp {{LBB.+_1}} | |
+; CHECK-LABEL: fcmp_ord2: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: ucomiss %xmm0, %xmm0 | |
+; CHECK-NEXT: jp LBB13_1 | |
+; CHECK-NEXT: ## %bb.2: ## %bb1 | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
+; CHECK-NEXT: LBB13_1: ## %bb2 | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp ord float %x, 0.000000e+00 | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -176,9 +257,16 @@ bb1: | |
} | |
define i32 @fcmp_uno1(float %x) { | |
-; CHECK-LABEL: fcmp_uno1 | |
-; CHECK: ucomiss %xmm0, %xmm0 | |
-; CHECK-NEXT: jp {{LBB.+_2}} | |
+; CHECK-LABEL: fcmp_uno1: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: ucomiss %xmm0, %xmm0 | |
+; CHECK-NEXT: jp LBB14_2 | |
+; CHECK-NEXT: ## %bb.1: ## %bb2 | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
+; CHECK-NEXT: LBB14_2: ## %bb1 | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp uno float %x, %x | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -188,9 +276,16 @@ bb1: | |
} | |
define i32 @fcmp_uno2(float %x) { | |
-; CHECK-LABEL: fcmp_uno2 | |
-; CHECK: ucomiss %xmm0, %xmm0 | |
-; CHECK-NEXT: jp {{LBB.+_2}} | |
+; CHECK-LABEL: fcmp_uno2: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: ucomiss %xmm0, %xmm0 | |
+; CHECK-NEXT: jp LBB15_2 | |
+; CHECK-NEXT: ## %bb.1: ## %bb2 | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
+; CHECK-NEXT: LBB15_2: ## %bb1 | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp uno float %x, 0.000000e+00 | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -200,8 +295,10 @@ bb1: | |
} | |
define i32 @fcmp_ueq1(float %x) { | |
-; CHECK-LABEL: fcmp_ueq1 | |
-; CHECK-NOT: ucomiss | |
+; CHECK-LABEL: fcmp_ueq1: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp ueq float %x, %x | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -211,10 +308,17 @@ bb1: | |
} | |
define i32 @fcmp_ueq2(float %x) { | |
-; CHECK-LABEL: fcmp_ueq2 | |
-; CHECK: xorps %xmm1, %xmm1 | |
-; CHECK-NEXT: ucomiss %xmm1, %xmm0 | |
-; CHECK-NEXT: je {{LBB.+_2}} | |
+; CHECK-LABEL: fcmp_ueq2: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: xorps %xmm1, %xmm1 | |
+; CHECK-NEXT: ucomiss %xmm1, %xmm0 | |
+; CHECK-NEXT: je LBB17_2 | |
+; CHECK-NEXT: ## %bb.1: ## %bb2 | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
+; CHECK-NEXT: LBB17_2: ## %bb1 | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp ueq float %x, 0.000000e+00 | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -224,9 +328,16 @@ bb1: | |
} | |
define i32 @fcmp_ugt1(float %x) { | |
-; CHECK-LABEL: fcmp_ugt1 | |
-; CHECK: ucomiss %xmm0, %xmm0 | |
-; CHECK-NEXT: jnp {{LBB.+_1}} | |
+; CHECK-LABEL: fcmp_ugt1: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: ucomiss %xmm0, %xmm0 | |
+; CHECK-NEXT: jnp LBB18_1 | |
+; CHECK-NEXT: ## %bb.2: ## %bb1 | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
+; CHECK-NEXT: LBB18_1: ## %bb2 | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp ugt float %x, %x | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -236,10 +347,17 @@ bb1: | |
} | |
define i32 @fcmp_ugt2(float %x) { | |
-; CHECK-LABEL: fcmp_ugt2 | |
-; CHECK: xorps %xmm1, %xmm1 | |
-; CHECK-NEXT: ucomiss %xmm0, %xmm1 | |
-; CHECK-NEXT: jae {{LBB.+_1}} | |
+; CHECK-LABEL: fcmp_ugt2: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: xorps %xmm1, %xmm1 | |
+; CHECK-NEXT: ucomiss %xmm0, %xmm1 | |
+; CHECK-NEXT: jae LBB19_1 | |
+; CHECK-NEXT: ## %bb.2: ## %bb1 | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
+; CHECK-NEXT: LBB19_1: ## %bb2 | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp ugt float %x, 0.000000e+00 | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -249,8 +367,10 @@ bb1: | |
} | |
define i32 @fcmp_uge1(float %x) { | |
-; CHECK-LABEL: fcmp_uge1 | |
-; CHECK-NOT: ucomiss | |
+; CHECK-LABEL: fcmp_uge1: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp uge float %x, %x | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -260,10 +380,17 @@ bb1: | |
} | |
define i32 @fcmp_uge2(float %x) { | |
-; CHECK-LABEL: fcmp_uge2 | |
-; CHECK: xorps %xmm1, %xmm1 | |
-; CHECK-NEXT: ucomiss %xmm0, %xmm1 | |
-; CHECK-NEXT: ja {{LBB.+_1}} | |
+; CHECK-LABEL: fcmp_uge2: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: xorps %xmm1, %xmm1 | |
+; CHECK-NEXT: ucomiss %xmm0, %xmm1 | |
+; CHECK-NEXT: ja LBB21_1 | |
+; CHECK-NEXT: ## %bb.2: ## %bb1 | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
+; CHECK-NEXT: LBB21_1: ## %bb2 | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp uge float %x, 0.000000e+00 | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -273,9 +400,16 @@ bb1: | |
} | |
define i32 @fcmp_ult1(float %x) { | |
-; CHECK-LABEL: fcmp_ult1 | |
-; CHECK: ucomiss %xmm0, %xmm0 | |
-; CHECK-NEXT: jnp {{LBB.+_1}} | |
+; CHECK-LABEL: fcmp_ult1: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: ucomiss %xmm0, %xmm0 | |
+; CHECK-NEXT: jnp LBB22_1 | |
+; CHECK-NEXT: ## %bb.2: ## %bb1 | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
+; CHECK-NEXT: LBB22_1: ## %bb2 | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp ult float %x, %x | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -285,10 +419,17 @@ bb1: | |
} | |
define i32 @fcmp_ult2(float %x) { | |
-; CHECK-LABEL: fcmp_ult2 | |
-; CHECK: xorps %xmm1, %xmm1 | |
-; CHECK-NEXT: ucomiss %xmm1, %xmm0 | |
-; CHECK-NEXT: jae {{LBB.+_1}} | |
+; CHECK-LABEL: fcmp_ult2: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: xorps %xmm1, %xmm1 | |
+; CHECK-NEXT: ucomiss %xmm1, %xmm0 | |
+; CHECK-NEXT: jae LBB23_1 | |
+; CHECK-NEXT: ## %bb.2: ## %bb1 | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
+; CHECK-NEXT: LBB23_1: ## %bb2 | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp ult float %x, 0.000000e+00 | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -298,8 +439,10 @@ bb1: | |
} | |
define i32 @fcmp_ule1(float %x) { | |
-; CHECK-LABEL: fcmp_ule1 | |
-; CHECK-NOT: ucomiss | |
+; CHECK-LABEL: fcmp_ule1: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp ule float %x, %x | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -309,10 +452,17 @@ bb1: | |
} | |
define i32 @fcmp_ule2(float %x) { | |
-; CHECK-LABEL: fcmp_ule2 | |
-; CHECK: xorps %xmm1, %xmm1 | |
-; CHECK-NEXT: ucomiss %xmm1, %xmm0 | |
-; CHECK-NEXT: ja {{LBB.+_1}} | |
+; CHECK-LABEL: fcmp_ule2: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: xorps %xmm1, %xmm1 | |
+; CHECK-NEXT: ucomiss %xmm1, %xmm0 | |
+; CHECK-NEXT: ja LBB25_1 | |
+; CHECK-NEXT: ## %bb.2: ## %bb1 | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
+; CHECK-NEXT: LBB25_1: ## %bb2 | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp ule float %x, 0.000000e+00 | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -322,9 +472,16 @@ bb1: | |
} | |
define i32 @fcmp_une1(float %x) { | |
-; CHECK-LABEL: fcmp_une1 | |
-; CHECK: ucomiss %xmm0, %xmm0 | |
-; CHECK-NEXT: jnp {{LBB.+_1}} | |
+; CHECK-LABEL: fcmp_une1: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: ucomiss %xmm0, %xmm0 | |
+; CHECK-NEXT: jnp LBB26_1 | |
+; CHECK-NEXT: ## %bb.2: ## %bb1 | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
+; CHECK-NEXT: LBB26_1: ## %bb2 | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp une float %x, %x | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -334,11 +491,18 @@ bb1: | |
} | |
define i32 @fcmp_une2(float %x) { | |
-; CHECK-LABEL: fcmp_une2 | |
-; CHECK: xorps %xmm1, %xmm1 | |
-; CHECK-NEXT: ucomiss %xmm1, %xmm0 | |
-; CHECK-NEXT: jne {{LBB.+_2}} | |
-; CHECK-NEXT: jnp {{LBB.+_1}} | |
+; CHECK-LABEL: fcmp_une2: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: xorps %xmm1, %xmm1 | |
+; CHECK-NEXT: ucomiss %xmm1, %xmm0 | |
+; CHECK-NEXT: jne LBB27_2 | |
+; CHECK-NEXT: jnp LBB27_1 | |
+; CHECK-NEXT: LBB27_2: ## %bb1 | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
+; CHECK-NEXT: LBB27_1: ## %bb2 | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = fcmp une float %x, 0.000000e+00 | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -348,9 +512,10 @@ bb1: | |
} | |
define i32 @icmp_eq(i32 %x) { | |
-; CHECK-LABEL: icmp_eq | |
-; CHECK-NOT: cmpl | |
-; CHECK: xorl %eax, %eax | |
+; CHECK-LABEL: icmp_eq: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
%1 = icmp eq i32 %x, %x | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -360,9 +525,10 @@ bb1: | |
} | |
define i32 @icmp_ne(i32 %x) { | |
-; CHECK-LABEL: icmp_ne | |
-; CHECK-NOT: cmpl | |
-; CHECK: movl $1, %eax | |
+; CHECK-LABEL: icmp_ne: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = icmp ne i32 %x, %x | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -372,9 +538,10 @@ bb1: | |
} | |
define i32 @icmp_ugt(i32 %x) { | |
-; CHECK-LABEL: icmp_ugt | |
-; CHECK-NOT: cmpl | |
-; CHECK: movl $1, %eax | |
+; CHECK-LABEL: icmp_ugt: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = icmp ugt i32 %x, %x | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -384,9 +551,10 @@ bb1: | |
} | |
define i32 @icmp_uge(i32 %x) { | |
-; CHECK-LABEL: icmp_uge | |
-; CHECK-NOT: cmpl | |
-; CHECK: xorl %eax, %eax | |
+; CHECK-LABEL: icmp_uge: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
%1 = icmp uge i32 %x, %x | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -396,9 +564,10 @@ bb1: | |
} | |
define i32 @icmp_ult(i32 %x) { | |
-; CHECK-LABEL: icmp_ult | |
-; CHECK-NOT: cmpl | |
-; CHECK: movl $1, %eax | |
+; CHECK-LABEL: icmp_ult: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = icmp ult i32 %x, %x | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -408,9 +577,10 @@ bb1: | |
} | |
define i32 @icmp_ule(i32 %x) { | |
-; CHECK-LABEL: icmp_ule | |
-; CHECK-NOT: cmpl | |
-; CHECK: xorl %eax, %eax | |
+; CHECK-LABEL: icmp_ule: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
%1 = icmp ule i32 %x, %x | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -420,9 +590,10 @@ bb1: | |
} | |
define i32 @icmp_sgt(i32 %x) { | |
-; CHECK-LABEL: icmp_sgt | |
-; CHECK-NOT: cmpl | |
-; CHECK: movl $1, %eax | |
+; CHECK-LABEL: icmp_sgt: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = icmp sgt i32 %x, %x | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -432,9 +603,10 @@ bb1: | |
} | |
define i32 @icmp_sge(i32 %x) { | |
-; CHECK-LABEL: icmp_sge | |
-; CHECK-NOT: cmpl | |
-; CHECK: xorl %eax, %eax | |
+; CHECK-LABEL: icmp_sge: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
%1 = icmp sge i32 %x, %x | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -444,9 +616,10 @@ bb1: | |
} | |
define i32 @icmp_slt(i32 %x) { | |
-; CHECK-LABEL: icmp_slt | |
-; CHECK-NOT: cmpl | |
-; CHECK: movl $1, %eax | |
+; CHECK-LABEL: icmp_slt: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: movl $1, %eax | |
+; CHECK-NEXT: retq | |
%1 = icmp slt i32 %x, %x | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
@@ -456,9 +629,10 @@ bb1: | |
} | |
define i32 @icmp_sle(i32 %x) { | |
-; CHECK-LABEL: icmp_sle | |
-; CHECK-NOT: cmpl | |
-; CHECK: xorl %eax, %eax | |
+; CHECK-LABEL: icmp_sle: | |
+; CHECK: ## %bb.0: | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: retq | |
%1 = icmp sle i32 %x, %x | |
br i1 %1, label %bb1, label %bb2 | |
bb2: | |
diff --git a/llvm/test/CodeGen/X86/fast-isel-mem.ll b/llvm/test/CodeGen/X86/fast-isel-mem.ll | |
index 3564c5db3567..d7ed6c664306 100644 | |
--- a/llvm/test/CodeGen/X86/fast-isel-mem.ll | |
+++ b/llvm/test/CodeGen/X86/fast-isel-mem.ll | |
@@ -1,3 +1,4 @@ | |
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | |
; RUN: llc < %s -fast-isel -mtriple=i386-apple-darwin -mcpu=generic | FileCheck %s | |
; RUN: llc < %s -fast-isel -mtriple=i386-apple-darwin -mcpu=atom | FileCheck -check-prefix=ATOM %s | |
; RUN: llc < %s -fast-isel -fast-isel-abort=3 -mtriple=x86_64 | FileCheck -check-prefix=ELF64 %s | |
@@ -6,6 +7,35 @@ | |
; rdar://6653118 | |
define i32 @loadgv() nounwind { | |
+; CHECK-LABEL: loadgv: | |
+; CHECK: ## %bb.0: ## %entry | |
+; CHECK-NEXT: movl L_src$non_lazy_ptr, %eax | |
+; CHECK-NEXT: movl (%eax), %eax | |
+; CHECK-NEXT: movl L_src$non_lazy_ptr, %ecx | |
+; CHECK-NEXT: addl (%ecx), %eax | |
+; CHECK-NEXT: movl L_src$non_lazy_ptr, %ecx | |
+; CHECK-NEXT: movl %eax, (%ecx) | |
+; CHECK-NEXT: retl | |
+; | |
+; ATOM-LABEL: loadgv: | |
+; ATOM: ## %bb.0: ## %entry | |
+; ATOM-NEXT: movl L_src$non_lazy_ptr, %eax | |
+; ATOM-NEXT: movl (%eax), %eax | |
+; ATOM-NEXT: movl L_src$non_lazy_ptr, %ecx | |
+; ATOM-NEXT: addl (%ecx), %eax | |
+; ATOM-NEXT: movl L_src$non_lazy_ptr, %ecx | |
+; ATOM-NEXT: movl %eax, (%ecx) | |
+; ATOM-NEXT: retl | |
+; | |
+; ELF64-LABEL: loadgv: | |
+; ELF64: # %bb.0: # %entry | |
+; ELF64-NEXT: movq src@{{.*}}(%rip), %rax | |
+; ELF64-NEXT: movl (%rax), %eax | |
+; ELF64-NEXT: movq src@{{.*}}(%rip), %rcx | |
+; ELF64-NEXT: addl (%rcx), %eax | |
+; ELF64-NEXT: movq src@{{.*}}(%rip), %rcx | |
+; ELF64-NEXT: movl %eax, (%rcx) | |
+; ELF64-NEXT: retq | |
entry: | |
%0 = load i32, i32* @src, align 4 | |
%1 = load i32, i32* @src, align 4 | |
@@ -13,33 +43,9 @@ entry: | |
store i32 %2, i32* @src | |
ret i32 %2 | |
; This should fold one of the loads into the add. | |
-; CHECK-LABEL: loadgv: | |
-; CHECK: movl L_src$non_lazy_ptr, %eax | |
-; CHECK: movl (%eax), %eax | |
-; CHECK: movl L_src$non_lazy_ptr, %ecx | |
-; CHECK: addl (%ecx), %eax | |
-; CHECK: movl L_src$non_lazy_ptr, %ecx | |
-; CHECK: movl %eax, (%ecx) | |
-; CHECK: ret | |
- | |
-; ATOM: loadgv: | |
-; ATOM: movl L_src$non_lazy_ptr, %eax | |
-; ATOM: movl (%eax), %eax | |
-; ATOM: movl L_src$non_lazy_ptr, %ecx | |
-; ATOM: addl (%ecx), %eax | |
-; ATOM: movl L_src$non_lazy_ptr, %ecx | |
-; ATOM: movl %eax, (%ecx) | |
-; ATOM: ret | |
+ | |
;; dso_preemptable src is loaded via GOT indirection. | |
-; ELF64-LABEL: loadgv: | |
-; ELF64: movq src@GOTPCREL(%rip), %rax | |
-; ELF64-NEXT: movl (%rax), %eax | |
-; ELF64-NEXT: movq src@GOTPCREL(%rip), %rcx | |
-; ELF64-NEXT: addl (%rcx), %eax | |
-; ELF64-NEXT: movq src@GOTPCREL(%rip), %rcx | |
-; ELF64-NEXT: movl %eax, (%rcx) | |
-; ELF64-NEXT: retq | |
} | |
@@ -47,15 +53,32 @@ entry: | |
@LotsStuff = external constant [4 x i32 (...)*] | |
define void @t(%stuff* %this) nounwind { | |
+; CHECK-LABEL: t: | |
+; CHECK: ## %bb.0: ## %entry | |
+; CHECK-NEXT: movl $0, %eax | |
+; CHECK-NEXT: movl L_LotsStuff$non_lazy_ptr, %ecx | |
+; CHECK-NEXT: addl $8, %ecx | |
+; CHECK-NEXT: movl %ecx, (%eax) | |
+; CHECK-NEXT: retl | |
+; | |
+; ATOM-LABEL: t: | |
+; ATOM: ## %bb.0: ## %entry | |
+; ATOM-NEXT: movl L_LotsStuff$non_lazy_ptr, %eax | |
+; ATOM-NEXT: movl $0, %ecx | |
+; ATOM-NEXT: addl $8, %eax | |
+; ATOM-NEXT: movl %eax, (%ecx) | |
+; ATOM-NEXT: retl | |
+; | |
+; ELF64-LABEL: t: | |
+; ELF64: # %bb.0: # %entry | |
+; ELF64-NEXT: movl $0, %eax | |
+; ELF64-NEXT: movq LotsStuff@{{.*}}(%rip), %rcx | |
+; ELF64-NEXT: addq $16, %rcx | |
+; ELF64-NEXT: movq %rcx, (%rax) | |
+; ELF64-NEXT: retq | |
entry: | |
store i32 (...)** getelementptr ([4 x i32 (...)*], [4 x i32 (...)*]* @LotsStuff, i32 0, i32 2), i32 (...)*** null, align 4 | |
ret void | |
-; CHECK: _t: | |
-; CHECK: xorl %eax, %eax | |
-; CHECK: movl L_LotsStuff$non_lazy_ptr, %ecx | |
-; ATOM: _t: | |
-; ATOM: movl L_LotsStuff$non_lazy_ptr, %e{{..}} | |
-; ATOM: xorl %e{{..}}, %e{{..}} | |
} | |
diff --git a/llvm/test/CodeGen/X86/fast-isel-select.ll b/llvm/test/CodeGen/X86/fast-isel-select.ll | |
index 94477f3286e4..6a99c33ac164 100644 | |
--- a/llvm/test/CodeGen/X86/fast-isel-select.ll | |
+++ b/llvm/test/CodeGen/X86/fast-isel-select.ll | |
@@ -12,7 +12,7 @@ define i32 @fastisel_select(i1 %exchSub2211_, i1 %trunc_8766) { | |
; CHECK-NEXT: movb %sil, %al | |
; CHECK-NEXT: movb %dil, %dl | |
; CHECK-NEXT: subb %al, %dl | |
-; CHECK-NEXT: xorl %eax, %eax | |
+; CHECK-NEXT: movl $0, %eax | |
; CHECK-NEXT: movl $1204476887, %ecx ## imm = 0x47CADBD7 | |
; CHECK-NEXT: testb $1, %dl | |
; CHECK-NEXT: cmovnel %ecx, %eax | |
diff --git a/llvm/test/CodeGen/X86/fast-isel-x86-64.ll b/llvm/test/CodeGen/X86/fast-isel-x86-64.ll | |
index e2de3f334385..fd78fd48d325 100644 | |
--- a/llvm/test/CodeGen/X86/fast-isel-x86-64.ll | |
+++ b/llvm/test/CodeGen/X86/fast-isel-x86-64.ll | |
@@ -1,3 +1,4 @@ | |
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | |
; RUN: llc < %s -mattr=-avx -fast-isel -mcpu=core2 -O0 -regalloc=fast -asm-verbose=0 -fast-isel-abort=1 | FileCheck %s | |
; RUN: llc < %s -mattr=-avx -fast-isel -mcpu=core2 -O0 -regalloc=fast -asm-verbose=0 -pass-remarks-missed=isel 2>&1 >/dev/null | FileCheck %s --check-prefix=STDERR --allow-empty | |
; RUN: llc < %s -mattr=+avx -fast-isel -mcpu=core2 -O0 -regalloc=fast -asm-verbose=0 -fast-isel-abort=1 | FileCheck %s --check-prefix=AVX | |
@@ -30,9 +31,6 @@ if.then: ; preds = %entry | |
if.end: ; preds = %if.then, %entry | |
ret void | |
-; CHECK-LABEL: test2: | |
-; CHECK: movq %rdi, -8(%rsp) | |
-; CHECK: cmpq $42, -8(%rsp) | |
} | |
@@ -42,9 +40,6 @@ if.end: ; preds = %if.then, %entry | |
define i64 @test3() nounwind { | |
%A = ptrtoint i32* @G to i64 | |
ret i64 %A | |
-; CHECK-LABEL: test3: | |
-; CHECK: movq _G@GOTPCREL(%rip), %rax | |
-; CHECK-NEXT: ret | |
} | |
@@ -58,10 +53,6 @@ define i32 @test4(i64 %idxprom9) nounwind { | |
%conv = zext i8 %tmp11 to i32 | |
ret i32 %conv | |
-; CHECK-LABEL: test4: | |
-; CHECK: movq _rtx_length@GOTPCREL(%rip), %rax | |
-; CHECK-NEXT: movzbl (%rax,%rdi), %eax | |
-; CHECK-NEXT: ret | |
} | |
@@ -71,10 +62,6 @@ define void @test5(i32 %x, i32* %p) nounwind { | |
store i32 %y, i32* %p | |
ret void | |
-; CHECK-LABEL: test5: | |
-; CHECK: movl $50000, %ecx | |
-; CHECK: sarl %cl, %edi | |
-; CHECK: ret | |
} | |
; rdar://9289501 - fast isel should fold trivial multiplies to shifts. | |
@@ -83,16 +70,12 @@ entry: | |
%mul = mul nsw i64 %x, 8 | |
ret i64 %mul | |
-; CHECK-LABEL: test6: | |
-; CHECK: shlq $3, {{%r[a-z]+}} | |
} | |
define i32 @test7(i32 %x) nounwind ssp { | |
entry: | |
%mul = mul nsw i32 %x, 8 | |
ret i32 %mul | |
-; CHECK-LABEL: test7: | |
-; CHECK: shll $3, {{%e[a-z]+}} | |
} | |
@@ -102,31 +85,23 @@ entry: | |
%add = add nsw i64 %x, 7 | |
ret i64 %add | |
-; CHECK-LABEL: test8: | |
-; CHECK: addq $7, {{%r[a-z]+}} | |
} | |
define i64 @test9(i64 %x) nounwind ssp { | |
entry: | |
%add = mul nsw i64 %x, 7 | |
ret i64 %add | |
-; CHECK-LABEL: test9: | |
-; CHECK: imulq $7, %rdi, %rax | |
} | |
; rdar://9297011 - Don't reject udiv by a power of 2. | |
define i32 @test10(i32 %X) nounwind { | |
%Y = udiv i32 %X, 8 | |
ret i32 %Y | |
-; CHECK-LABEL: test10: | |
-; CHECK: shrl $3, | |
} | |
define i32 @test11(i32 %X) nounwind { | |
%Y = sdiv exact i32 %X, 8 | |
ret i32 %Y | |
-; CHECK-LABEL: test11: | |
-; CHECK: sarl $3, | |
} | |
@@ -142,11 +117,6 @@ if.then: ; preds = %entry | |
if.end: ; preds = %if.then, %entry | |
ret void | |
-; CHECK-LABEL: test12: | |
-; CHECK: testb $1, | |
-; CHECK-NEXT: je L | |
-; CHECK-NEXT: xorl %edi, %edi | |
-; CHECK-NEXT: callq | |
} | |
declare void @test13f(i1 %X) | |
@@ -154,9 +124,6 @@ declare void @test13f(i1 %X) | |
define void @test13() nounwind { | |
call void @test13f(i1 0) | |
ret void | |
-; CHECK-LABEL: test13: | |
-; CHECK: xorl %edi, %edi | |
-; CHECK-NEXT: callq | |
} | |
@@ -167,9 +134,6 @@ entry: | |
%tobool = trunc i8 %tmp to i1 | |
call void @test13f(i1 zeroext %tobool) noredzone | |
ret void | |
-; CHECK-LABEL: test14: | |
-; CHECK: andb $1, | |
-; CHECK: callq | |
} | |
declare void @llvm.memcpy.p0i8.p0i8.i64(i8*, i8*, i64, i1) | |
@@ -178,30 +142,16 @@ declare void @llvm.memcpy.p0i8.p0i8.i64(i8*, i8*, i64, i1) | |
define void @test15(i8* %a, i8* %b) nounwind { | |
call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %a, i8* align 4 %b, i64 4, i1 false) | |
ret void | |
-; CHECK-LABEL: test15: | |
-; CHECK-NEXT: movl (%rsi), %eax | |
-; CHECK-NEXT: movl %eax, (%rdi) | |
-; CHECK-NEXT: ret | |
} | |
; Handling for varargs calls | |
declare void @test16callee(...) nounwind | |
define void @test16() nounwind { | |
-; CHECK-LABEL: test16: | |
-; CHECK: movl $1, %edi | |
-; CHECK: movb $0, %al | |
-; CHECK: callq _test16callee | |
call void (...) @test16callee(i32 1) | |
br label %block2 | |
block2: | |
-; CHECK: movsd LCP{{.*}}_{{.*}}(%rip), %xmm0 | |
-; CHECK: movb $1, %al | |
-; CHECK: callq _test16callee | |
-; AVX: vmovsd LCP{{.*}}_{{.*}}(%rip), %xmm0 | |
-; AVX: movb $1, %al | |
-; AVX: callq _test16callee | |
call void (...) @test16callee(double 1.000000e+00) | |
ret void | |
} | |
@@ -223,27 +173,18 @@ if.then: ; preds = %entry | |
if.else: ; preds = %entry | |
ret i32 2 | |
-; CHECK-LABEL: test17: | |
-; CHECK: movl (%rdi), %eax | |
-; CHECK: callq _foo | |
-; CHECK: cmpl $5, %eax | |
-; CHECK-NEXT: je | |
} | |
; Check that 0.0 is materialized using xorps | |
define void @test18(float* %p1) { | |
store float 0.0, float* %p1 | |
ret void | |
-; CHECK-LABEL: test18: | |
-; CHECK: xorps | |
} | |
; Without any type hints, doubles use the smaller xorps instead of xorpd. | |
define void @test19(double* %p1) { | |
store double 0.0, double* %p1 | |
ret void | |
-; CHECK-LABEL: test19: | |
-; CHECK: xorps | |
} | |
; Check that we fast-isel sret | |
@@ -253,9 +194,6 @@ entry: | |
%tmp = alloca %struct.a, align 8 | |
call void @test20sret(%struct.a* sret(%struct.a) %tmp) | |
ret void | |
-; CHECK-LABEL: test20: | |
-; CHECK: movq %rsp, %rdi | |
-; CHECK: callq _test20sret | |
} | |
declare void @test20sret(%struct.a* sret(%struct.a)) | |
@@ -263,9 +201,6 @@ declare void @test20sret(%struct.a* sret(%struct.a)) | |
define void @test21(double* %p1) { | |
store double -0.0, double* %p1 | |
ret void | |
-; CHECK-LABEL: test21: | |
-; CHECK-NOT: xor | |
-; CHECK: movsd LCPI | |
} | |
; Check that immediate arguments to a function | |
@@ -278,15 +213,6 @@ entry: | |
call void @foo22(i32 2) | |
call void @foo22(i32 3) | |
ret void | |
-; CHECK-LABEL: test22: | |
-; CHECK: xorl %edi, %edi | |
-; CHECK: callq _foo22 | |
-; CHECK: movl $1, %edi | |
-; CHECK: callq _foo22 | |
-; CHECK: movl $2, %edi | |
-; CHECK: callq _foo22 | |
-; CHECK: movl $3, %edi | |
-; CHECK: callq _foo22 | |
} | |
declare void @foo22(i32) | |
@@ -296,12 +222,6 @@ define void @test23(i8* noalias sret(i8) %result) { | |
%a = alloca i8 | |
%b = call i8* @foo23() | |
ret void | |
-; CHECK-LABEL: test23: | |
-; CHECK: movq %rdi, [[STACK:[0-9]+\(%rsp\)]] | |
-; CHECK: call | |
-; CHECK-NEXT: movq [[STACK]], %rax | |
-; CHECK-NEXT: addq $24, %rsp | |
-; CHECK: ret | |
} | |
declare i8* @foo23() | |
@@ -311,7 +231,6 @@ declare void @takesi32ptr(i32* %arg) | |
; CHECK-LABEL: allocamaterialize | |
define void @allocamaterialize() { | |
%a = alloca i32 | |
-; CHECK: leaq {{.*}}, %rdi | |
call void @takesi32ptr(i32* %a) | |
ret void | |
} | |
@@ -319,6 +238,5 @@ define void @allocamaterialize() { | |
; STDERR-NOT: FastISel missed terminator: ret void | |
; CHECK-LABEL: win64ccfun | |
define win64cc void @win64ccfun(i32 %i) { | |
-; CHECK: ret | |
ret void | |
} | |
diff --git a/llvm/test/CodeGen/X86/indirect-branch-tracking-r2.ll b/llvm/test/CodeGen/X86/indirect-branch-tracking-r2.ll | |
index 7c6417902c12..84d60228d48b 100644 | |
--- a/llvm/test/CodeGen/X86/indirect-branch-tracking-r2.ll | |
+++ b/llvm/test/CodeGen/X86/indirect-branch-tracking-r2.ll | |
@@ -1,3 +1,4 @@ | |
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | |
; RUN: llc -mtriple=x86_64-unknown-unknown < %s | FileCheck %s --check-prefix=X64 | |
; RUN: llc -mtriple=i386-unknown-unknown < %s | FileCheck %s --check-prefix=X86 | |
@@ -9,34 +10,72 @@ | |
;; setzx is not return twice function, should not followed by endbr. | |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
-; X64: callq setjmp | |
-; X64-NEXT: endbr64 | |
-; X64: callq setzx | |
-; X64-NEXT: xorl | |
-; X64: callq sigsetjmp | |
-; X64-NEXT: endbr64 | |
-; X64: callq savectx | |
-; X64-NEXT: endbr64 | |
-; X64: callq vfork | |
-; X64-NEXT: endbr64 | |
-; X64: callq getcontext | |
-; X64-NEXT: endbr64 | |
- | |
-; X86: calll setjmp | |
-; X86-NEXT: endbr32 | |
-; X86: calll setzx | |
-; X86-NEXT: xorl | |
-; X86: calll sigsetjmp | |
-; X86-NEXT: endbr32 | |
-; X86: calll savectx | |
-; X86-NEXT: endbr32 | |
-; X86: calll vfork | |
-; X86-NEXT: endbr32 | |
-; X86: calll getcontext | |
-; X86-NEXT: endbr32 | |
- | |
; Function Attrs: noinline nounwind optnone uwtable | |
define dso_local void @foo() #0 { | |
+; X64-LABEL: foo: | |
+; X64: # %bb.0: # %entry | |
+; X64-NEXT: endbr64 | |
+; X64-NEXT: pushq %rax | |
+; X64-NEXT: .cfi_def_cfa_offset 16 | |
+; X64-NEXT: movl $0, %edi | |
+; X64-NEXT: movb $0, %al | |
+; X64-NEXT: callq setjmp | |
+; X64-NEXT: endbr64 | |
+; X64-NEXT: movl $0, %edi | |
+; X64-NEXT: movb $0, %al | |
+; X64-NEXT: callq setzx | |
+; X64-NEXT: movl $0, %edi | |
+; X64-NEXT: movb $0, %al | |
+; X64-NEXT: callq sigsetjmp | |
+; X64-NEXT: endbr64 | |
+; X64-NEXT: movl $0, %edi | |
+; X64-NEXT: movb $0, %al | |
+; X64-NEXT: callq setzx | |
+; X64-NEXT: movl $0, %edi | |
+; X64-NEXT: movb $0, %al | |
+; X64-NEXT: callq savectx | |
+; X64-NEXT: endbr64 | |
+; X64-NEXT: callq vfork | |
+; X64-NEXT: endbr64 | |
+; X64-NEXT: movl $0, %edi | |
+; X64-NEXT: movb $0, %al | |
+; X64-NEXT: callq setzx | |
+; X64-NEXT: movl $0, %edi | |
+; X64-NEXT: movb $0, %al | |
+; X64-NEXT: callq getcontext | |
+; X64-NEXT: endbr64 | |
+; X64-NEXT: popq %rax | |
+; X64-NEXT: .cfi_def_cfa_offset 8 | |
+; X64-NEXT: retq | |
+; | |
+; X86-LABEL: foo: | |
+; X86: # %bb.0: # %entry | |
+; X86-NEXT: endbr32 | |
+; X86-NEXT: pushl %eax | |
+; X86-NEXT: .cfi_def_cfa_offset 8 | |
+; X86-NEXT: movl $0, (%esp) | |
+; X86-NEXT: calll setjmp | |
+; X86-NEXT: endbr32 | |
+; X86-NEXT: movl $0, (%esp) | |
+; X86-NEXT: calll setzx | |
+; X86-NEXT: movl $0, (%esp) | |
+; X86-NEXT: calll sigsetjmp | |
+; X86-NEXT: endbr32 | |
+; X86-NEXT: movl $0, (%esp) | |
+; X86-NEXT: calll setzx | |
+; X86-NEXT: movl $0, (%esp) | |
+; X86-NEXT: calll savectx | |
+; X86-NEXT: endbr32 | |
+; X86-NEXT: calll vfork | |
+; X86-NEXT: endbr32 | |
+; X86-NEXT: movl $0, (%esp) | |
+; X86-NEXT: calll setzx | |
+; X86-NEXT: movl $0, (%esp) | |
+; X86-NEXT: calll getcontext | |
+; X86-NEXT: endbr32 | |
+; X86-NEXT: popl %eax | |
+; X86-NEXT: .cfi_def_cfa_offset 4 | |
+; X86-NEXT: retl | |
entry: | |
%call = call i32 (i32, ...) bitcast (i32 (...)* @setjmp to i32 (i32, ...)*)(i32 0) #1 | |
%call1 = call i32 (i32, ...) bitcast (i32 (...)* @setzx to i32 (i32, ...)*)(i32 0) | |
diff --git a/llvm/test/CodeGen/X86/membarrier.ll b/llvm/test/CodeGen/X86/membarrier.ll | |
index b70a0a03d609..c2434360bc68 100644 | |
--- a/llvm/test/CodeGen/X86/membarrier.ll | |
+++ b/llvm/test/CodeGen/X86/membarrier.ll | |
@@ -9,7 +9,7 @@ define i32 @t() { | |
; CHECK-NEXT: mfence | |
; CHECK-NEXT: lock decl -{{[0-9]+}}(%rsp) | |
; CHECK-NEXT: mfence | |
-; CHECK-NEXT: xorl %eax, %eax | |
+; CHECK-NEXT: movl $0, %eax | |
; CHECK-NEXT: retq | |
%i = alloca i32, align 4 | |
store i32 1, i32* %i, align 4 | |
diff --git a/llvm/test/CodeGen/X86/mixed-ptr-sizes.ll b/llvm/test/CodeGen/X86/mixed-ptr-sizes.ll | |
index 76f775b834e0..5492b930bcdc 100644 | |
--- a/llvm/test/CodeGen/X86/mixed-ptr-sizes.ll | |
+++ b/llvm/test/CodeGen/X86/mixed-ptr-sizes.ll | |
@@ -125,17 +125,29 @@ entry: | |
; Test that null can be passed as a 32-bit pointer. | |
define dso_local void @test_null_arg(%struct.Foo* %f) { | |
-; ALL-LABEL: test_null_arg: | |
-; ALL: # %bb.0: # %entry | |
-; ALL-NEXT: subq $40, %rsp | |
-; ALL-NEXT: .seh_stackalloc 40 | |
-; ALL-NEXT: .seh_endprologue | |
-; ALL-NEXT: xorl %edx, %edx | |
-; ALL-NEXT: callq test_noop1 | |
-; ALL-NEXT: nop | |
-; ALL-NEXT: addq $40, %rsp | |
-; ALL-NEXT: retq | |
-; ALL-NEXT: .seh_endproc | |
+; CHECK-LABEL: test_null_arg: | |
+; CHECK: # %bb.0: # %entry | |
+; CHECK-NEXT: subq $40, %rsp | |
+; CHECK-NEXT: .seh_stackalloc 40 | |
+; CHECK-NEXT: .seh_endprologue | |
+; CHECK-NEXT: xorl %edx, %edx | |
+; CHECK-NEXT: callq test_noop1 | |
+; CHECK-NEXT: nop | |
+; CHECK-NEXT: addq $40, %rsp | |
+; CHECK-NEXT: retq | |
+; CHECK-NEXT: .seh_endproc | |
+; | |
+; CHECK-O0-LABEL: test_null_arg: | |
+; CHECK-O0: # %bb.0: # %entry | |
+; CHECK-O0-NEXT: subq $40, %rsp | |
+; CHECK-O0-NEXT: .seh_stackalloc 40 | |
+; CHECK-O0-NEXT: .seh_endprologue | |
+; CHECK-O0-NEXT: movl $0, %edx | |
+; CHECK-O0-NEXT: callq test_noop1 | |
+; CHECK-O0-NEXT: nop | |
+; CHECK-O0-NEXT: addq $40, %rsp | |
+; CHECK-O0-NEXT: retq | |
+; CHECK-O0-NEXT: .seh_endproc | |
entry: | |
call void @test_noop1(%struct.Foo* %f, i32 addrspace(270)* null) | |
ret void | |
diff --git a/llvm/test/CodeGen/X86/patchpoint.ll b/llvm/test/CodeGen/X86/patchpoint.ll | |
index abdf37549fd3..d10cda57131c 100644 | |
--- a/llvm/test/CodeGen/X86/patchpoint.ll | |
+++ b/llvm/test/CodeGen/X86/patchpoint.ll | |
@@ -1,19 +1,39 @@ | |
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | |
; RUN: llc -mtriple=x86_64-apple-darwin -mcpu=corei7 < %s | FileCheck %s | |
; RUN: llc -mtriple=x86_64-apple-darwin -mcpu=corei7 -fast-isel -fast-isel-abort=1 < %s | FileCheck %s | |
; Trivial patchpoint codegen | |
; | |
define i64 @trivial_patchpoint_codegen(i64 %p1, i64 %p2, i64 %p3, i64 %p4) { | |
-entry: | |
; CHECK-LABEL: trivial_patchpoint_codegen: | |
-; CHECK: movabsq $-559038736, %r11 | |
-; CHECK-NEXT: callq *%r11 | |
-; CHECK-NEXT: xchgw %ax, %ax | |
-; CHECK: movq %rax, %[[REG:r.+]] | |
-; CHECK: callq *%r11 | |
-; CHECK-NEXT: xchgw %ax, %ax | |
-; CHECK: movq %[[REG]], %rax | |
-; CHECK: ret | |
+; CHECK: ## %bb.0: ## %entry | |
+; CHECK-NEXT: pushq %rbp | |
+; CHECK-NEXT: .cfi_def_cfa_offset 16 | |
+; CHECK-NEXT: .cfi_offset %rbp, -16 | |
+; CHECK-NEXT: movq %rsp, %rbp | |
+; CHECK-NEXT: .cfi_def_cfa_register %rbp | |
+; CHECK-NEXT: pushq %r14 | |
+; CHECK-NEXT: pushq %rbx | |
+; CHECK-NEXT: .cfi_offset %rbx, -32 | |
+; CHECK-NEXT: .cfi_offset %r14, -24 | |
+; CHECK-NEXT: movq %rdi, %r14 | |
+; CHECK-NEXT: Ltmp0: | |
+; CHECK-NEXT: movabsq $-559038736, %r11 ## imm = 0xDEADBEF0 | |
+; CHECK-NEXT: callq *%r11 | |
+; CHECK-NEXT: xchgw %ax, %ax | |
+; CHECK-NEXT: movq %rax, %rbx | |
+; CHECK-NEXT: movq %r14, %rdi | |
+; CHECK-NEXT: movq %rax, %rsi | |
+; CHECK-NEXT: Ltmp1: | |
+; CHECK-NEXT: movabsq $-559038737, %r11 ## imm = 0xDEADBEEF | |
+; CHECK-NEXT: callq *%r11 | |
+; CHECK-NEXT: xchgw %ax, %ax | |
+; CHECK-NEXT: movq %rbx, %rax | |
+; CHECK-NEXT: popq %rbx | |
+; CHECK-NEXT: popq %r14 | |
+; CHECK-NEXT: popq %rbp | |
+; CHECK-NEXT: retq | |
+entry: | |
%resolveCall2 = inttoptr i64 -559038736 to i8* | |
%result = tail call i64 (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.i64(i64 2, i32 15, i8* %resolveCall2, i32 4, i64 %p1, i64 %p2, i64 %p3, i64 %p4) | |
%resolveCall3 = inttoptr i64 -559038737 to i8* | |
@@ -26,12 +46,20 @@ entry: | |
declare i64 @foo(i64 %p1, i64 %p2) | |
define i64 @trivial_symbolic_patchpoint_codegen(i64 %p1, i64 %p2) { | |
-entry: | |
; CHECK-LABEL: trivial_symbolic_patchpoint_codegen: | |
-; CHECK: movabsq $_foo, %r11 | |
-; CHECK-NEXT: callq *%r11 | |
-; CHECK-NEXT: xchgw %ax, %ax | |
-; CHECK: retq | |
+; CHECK: ## %bb.0: ## %entry | |
+; CHECK-NEXT: pushq %rbp | |
+; CHECK-NEXT: .cfi_def_cfa_offset 16 | |
+; CHECK-NEXT: .cfi_offset %rbp, -16 | |
+; CHECK-NEXT: movq %rsp, %rbp | |
+; CHECK-NEXT: .cfi_def_cfa_register %rbp | |
+; CHECK-NEXT: Ltmp2: | |
+; CHECK-NEXT: movabsq $_foo, %r11 | |
+; CHECK-NEXT: callq *%r11 | |
+; CHECK-NEXT: xchgw %ax, %ax | |
+; CHECK-NEXT: popq %rbp | |
+; CHECK-NEXT: retq | |
+entry: | |
%result = tail call i64 (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.i64(i64 9, i32 15, i8* bitcast (i64 (i64, i64)* @foo to i8*), i32 2, i64 %p1, i64 %p2) | |
ret i64 %result | |
} | |
@@ -60,6 +88,47 @@ entry: | |
; There is no way to verify this, since it depends on memory allocation. | |
; But I think it's useful to include as a working example. | |
define i64 @testLowerConstant(i64 %arg, i64 %tmp2, i64 %tmp10, i64* %tmp33, i64 %tmp79) { | |
+; CHECK-LABEL: testLowerConstant: | |
+; CHECK: ## %bb.0: ## %entry | |
+; CHECK-NEXT: pushq %rbp | |
+; CHECK-NEXT: .cfi_def_cfa_offset 16 | |
+; CHECK-NEXT: .cfi_offset %rbp, -16 | |
+; CHECK-NEXT: movq %rsp, %rbp | |
+; CHECK-NEXT: .cfi_def_cfa_register %rbp | |
+; CHECK-NEXT: pushq %r15 | |
+; CHECK-NEXT: pushq %r14 | |
+; CHECK-NEXT: pushq %rbx | |
+; CHECK-NEXT: pushq %rax | |
+; CHECK-NEXT: .cfi_offset %rbx, -40 | |
+; CHECK-NEXT: .cfi_offset %r14, -32 | |
+; CHECK-NEXT: .cfi_offset %r15, -24 | |
+; CHECK-NEXT: movq %rcx, %r14 | |
+; CHECK-NEXT: movq %rdx, %r15 | |
+; CHECK-NEXT: movq %rdi, %rbx | |
+; CHECK-NEXT: movq -16(%r8), %rdx | |
+; CHECK-NEXT: Ltmp4: | |
+; CHECK-NEXT: movq %r15, %rsi | |
+; CHECK-NEXT: xchgw %ax, %ax | |
+; CHECK-NEXT: Ltmp5: | |
+; CHECK-NEXT: nopw %cs:512(%rax,%rax) | |
+; CHECK-NEXT: nopw %cs:512(%rax,%rax) | |
+; CHECK-NEXT: nopw %cs:512(%rax,%rax) | |
+; CHECK-NEXT: movq (%r14), %rax | |
+; CHECK-NEXT: movq -24(%rax), %rdx | |
+; CHECK-NEXT: Ltmp6: | |
+; CHECK-NEXT: movq %rbx, %rdi | |
+; CHECK-NEXT: movq %r15, %rsi | |
+; CHECK-NEXT: Ltmp7: | |
+; CHECK-NEXT: nopw %cs:512(%rax,%rax) | |
+; CHECK-NEXT: nopw %cs:512(%rax,%rax) | |
+; CHECK-NEXT: nopw %cs:512(%rax,%rax) | |
+; CHECK-NEXT: movl $10, %eax | |
+; CHECK-NEXT: addq $8, %rsp | |
+; CHECK-NEXT: popq %rbx | |
+; CHECK-NEXT: popq %r14 | |
+; CHECK-NEXT: popq %r15 | |
+; CHECK-NEXT: popq %rbp | |
+; CHECK-NEXT: retq | |
entry: | |
%tmp80 = add i64 %tmp79, -16 | |
%tmp81 = inttoptr i64 %tmp80 to i64* | |
@@ -77,22 +146,38 @@ entry: | |
; Test small patchpoints that don't emit calls. | |
define void @small_patchpoint_codegen(i64 %p1, i64 %p2, i64 %p3, i64 %p4) { | |
-entry: | |
; CHECK-LABEL: small_patchpoint_codegen: | |
-; CHECK: Ltmp | |
-; CHECK: nopl 8(%rax,%rax) | |
-; CHECK-NEXT: popq | |
-; CHECK-NEXT: ret | |
+; CHECK: ## %bb.0: ## %entry | |
+; CHECK-NEXT: pushq %rbp | |
+; CHECK-NEXT: .cfi_def_cfa_offset 16 | |
+; CHECK-NEXT: .cfi_offset %rbp, -16 | |
+; CHECK-NEXT: movq %rsp, %rbp | |
+; CHECK-NEXT: .cfi_def_cfa_register %rbp | |
+; CHECK-NEXT: Ltmp8: | |
+; CHECK-NEXT: nopl 8(%rax,%rax) | |
+; CHECK-NEXT: popq %rbp | |
+; CHECK-NEXT: retq | |
+entry: | |
%result = tail call i64 (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.i64(i64 5, i32 5, i8* null, i32 2, i64 %p1, i64 %p2) | |
ret void | |
} | |
; Test large target address. | |
define i64 @large_target_address_patchpoint_codegen() { | |
-entry: | |
; CHECK-LABEL: large_target_address_patchpoint_codegen: | |
-; CHECK: movabsq $6153737369414576827, %r11 | |
-; CHECK-NEXT: callq *%r11 | |
+; CHECK: ## %bb.0: ## %entry | |
+; CHECK-NEXT: pushq %rbp | |
+; CHECK-NEXT: .cfi_def_cfa_offset 16 | |
+; CHECK-NEXT: .cfi_offset %rbp, -16 | |
+; CHECK-NEXT: movq %rsp, %rbp | |
+; CHECK-NEXT: .cfi_def_cfa_register %rbp | |
+; CHECK-NEXT: Ltmp9: | |
+; CHECK-NEXT: movabsq $6153737369414576827, %r11 ## imm = 0x556677889900AABB | |
+; CHECK-NEXT: callq *%r11 | |
+; CHECK-NEXT: xchgw %ax, %ax | |
+; CHECK-NEXT: popq %rbp | |
+; CHECK-NEXT: retq | |
+entry: | |
%resolveCall2 = inttoptr i64 6153737369414576827 to i8* | |
%result = tail call i64 (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.i64(i64 2, i32 15, i8* %resolveCall2, i32 0) | |
ret i64 %result | |
@@ -101,14 +186,6 @@ entry: | |
declare i64 @consume_attributes(i64, i8* nest, i64) | |
define i64 @test_patchpoint_with_attributes() { | |
entry: | |
-; CHECK-LABEL: test_patchpoint_with_attributes: | |
-; CHECK: movl $42, %edi | |
-; CHECK: movl $17, %esi | |
-; CHECK: xorl %r10d, %r10d | |
-; CHECK: movabsq $_consume_attributes, %r11 | |
-; CHECK-NEXT: callq *%r11 | |
-; CHECK-NEXT: xchgw %ax, %ax | |
-; CHECK: retq | |
%result = tail call i64 (i64, i32, i8*, i32, ...) @llvm.experimental.patchpoint.i64(i64 21, i32 15, i8* bitcast (i64 (i64, i8*, i64)* @consume_attributes to i8*), i32 3, i64 42, i8* nest null, i64 17) | |
ret i64 %result | |
} | |
diff --git a/llvm/test/CodeGen/X86/pr32241.ll b/llvm/test/CodeGen/X86/pr32241.ll | |
index 3664455d7299..4777aa20b3a0 100644 | |
--- a/llvm/test/CodeGen/X86/pr32241.ll | |
+++ b/llvm/test/CodeGen/X86/pr32241.ll | |
@@ -16,8 +16,7 @@ define i32 @_Z3foov() { | |
; CHECK-NEXT: movb %al, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill | |
; CHECK-NEXT: jne .LBB0_2 | |
; CHECK-NEXT: # %bb.1: # %lor.rhs | |
-; CHECK-NEXT: xorl %eax, %eax | |
-; CHECK-NEXT: # kill: def $al killed $al killed $eax | |
+; CHECK-NEXT: movb $0, %al | |
; CHECK-NEXT: movb %al, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill | |
; CHECK-NEXT: jmp .LBB0_2 | |
; CHECK-NEXT: .LBB0_2: # %lor.end | |
@@ -35,8 +34,7 @@ define i32 @_Z3foov() { | |
; CHECK-NEXT: movb %al, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill | |
; CHECK-NEXT: jne .LBB0_4 | |
; CHECK-NEXT: # %bb.3: # %lor.rhs4 | |
-; CHECK-NEXT: xorl %eax, %eax | |
-; CHECK-NEXT: # kill: def $al killed $al killed $eax | |
+; CHECK-NEXT: movb $0, %al | |
; CHECK-NEXT: movb %al, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill | |
; CHECK-NEXT: jmp .LBB0_4 | |
; CHECK-NEXT: .LBB0_4: # %lor.end5 | |
diff --git a/llvm/test/CodeGen/X86/pr32256.ll b/llvm/test/CodeGen/X86/pr32256.ll | |
index ab51eedff32b..26cd31b3b1a2 100644 | |
--- a/llvm/test/CodeGen/X86/pr32256.ll | |
+++ b/llvm/test/CodeGen/X86/pr32256.ll | |
@@ -11,15 +11,13 @@ define void @_Z1av() { | |
; CHECK-NEXT: .cfi_def_cfa_offset 6 | |
; CHECK-NEXT: movb c, %cl | |
; CHECK-NEXT: xorb $-1, %cl | |
-; CHECK-NEXT: xorl %eax, %eax | |
-; CHECK-NEXT: # kill: def $al killed $al killed $eax | |
+; CHECK-NEXT: movb $0, %al | |
; CHECK-NEXT: testb $1, %cl | |
; CHECK-NEXT: movb %al, (%esp) # 1-byte Spill | |
; CHECK-NEXT: jne .LBB0_1 | |
; CHECK-NEXT: jmp .LBB0_2 | |
; CHECK-NEXT: .LBB0_1: # %land.rhs | |
-; CHECK-NEXT: xorl %eax, %eax | |
-; CHECK-NEXT: # kill: def $al killed $al killed $eax | |
+; CHECK-NEXT: movb $0, %al | |
; CHECK-NEXT: movb %al, (%esp) # 1-byte Spill | |
; CHECK-NEXT: jmp .LBB0_2 | |
; CHECK-NEXT: .LBB0_2: # %land.end | |
diff --git a/llvm/test/CodeGen/X86/pr32284.ll b/llvm/test/CodeGen/X86/pr32284.ll | |
index a4417a517421..178378ede7ed 100644 | |
--- a/llvm/test/CodeGen/X86/pr32284.ll | |
+++ b/llvm/test/CodeGen/X86/pr32284.ll | |
@@ -10,11 +10,10 @@ define void @foo() { | |
; X86-O0-LABEL: foo: | |
; X86-O0: # %bb.0: # %entry | |
; X86-O0-NEXT: movzbl c, %ecx | |
-; X86-O0-NEXT: xorl %eax, %eax | |
+; X86-O0-NEXT: movl $0, %eax | |
; X86-O0-NEXT: subl %ecx, %eax | |
; X86-O0-NEXT: movslq %eax, %rcx | |
-; X86-O0-NEXT: xorl %eax, %eax | |
-; X86-O0-NEXT: # kill: def $rax killed $eax | |
+; X86-O0-NEXT: movl $0, %eax | |
; X86-O0-NEXT: subq %rcx, %rax | |
; X86-O0-NEXT: # kill: def $al killed $al killed $rax | |
; X86-O0-NEXT: cmpb $0, %al | |
diff --git a/llvm/test/CodeGen/X86/pr32340.ll b/llvm/test/CodeGen/X86/pr32340.ll | |
index 668af706524f..b7c230fb7658 100644 | |
--- a/llvm/test/CodeGen/X86/pr32340.ll | |
+++ b/llvm/test/CodeGen/X86/pr32340.ll | |
@@ -39,8 +39,7 @@ define void @foo() { | |
; X64-NEXT: orq %rcx, %rax | |
; X64-NEXT: # kill: def $ax killed $ax killed $rax | |
; X64-NEXT: movw %ax, var_900 | |
-; X64-NEXT: xorl %eax, %eax | |
-; X64-NEXT: # kill: def $rax killed $eax | |
+; X64-NEXT: movl $0, %eax | |
; X64-NEXT: cmpq var_28, %rax | |
; X64-NEXT: setne %al | |
; X64-NEXT: andb $1, %al | |
diff --git a/llvm/test/CodeGen/X86/pr49587.ll b/llvm/test/CodeGen/X86/pr49587.ll | |
index 343f1a0149c0..859d64347249 100644 | |
--- a/llvm/test/CodeGen/X86/pr49587.ll | |
+++ b/llvm/test/CodeGen/X86/pr49587.ll | |
@@ -6,7 +6,7 @@ define i32 @test(i64 %arg) nounwind { | |
; CHECK: # %bb.0: # %entry | |
; CHECK-NEXT: subq $1, %rdi | |
; CHECK-NEXT: setb %al | |
-; CHECK-NEXT: xorl %eax, %eax | |
+; CHECK-NEXT: movl $0, %eax | |
; CHECK-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill | |
; CHECK-NEXT: jb .LBB0_2 | |
; CHECK-NEXT: # %bb.1: # %no_overflow | |
diff --git a/llvm/test/CodeGen/X86/x86-no_callee_saved_registers.ll b/llvm/test/CodeGen/X86/x86-no_callee_saved_registers.ll | |
index 620a7ce49614..e7bb9e666bd9 100644 | |
--- a/llvm/test/CodeGen/X86/x86-no_callee_saved_registers.ll | |
+++ b/llvm/test/CodeGen/X86/x86-no_callee_saved_registers.ll | |
@@ -154,7 +154,7 @@ define i32 @test3() personality i8* undef { | |
; CHECK-O0-NEXT: .LBB3_2: # %lpad | |
; CHECK-O0-NEXT: .cfi_def_cfa_offset 64 | |
; CHECK-O0-NEXT: .Ltmp2: | |
-; CHECK-O0-NEXT: xorl %eax, %eax | |
+; CHECK-O0-NEXT: movl $0, %eax | |
; CHECK-O0-NEXT: addq $8, %rsp | |
; CHECK-O0-NEXT: .cfi_def_cfa_offset 56 | |
; CHECK-O0-NEXT: popq %rbx | |
diff --git a/llvm/test/CodeGen/X86/xaluo.ll b/llvm/test/CodeGen/X86/xaluo.ll | |
index 0de8bdeddd6f..8ff33e772419 100644 | |
--- a/llvm/test/CodeGen/X86/xaluo.ll | |
+++ b/llvm/test/CodeGen/X86/xaluo.ll | |
@@ -736,16 +736,15 @@ define zeroext i1 @saddobri32(i32 %v1, i32 %v2) { | |
; FAST: ## %bb.0: | |
; FAST-NEXT: addl %esi, %edi | |
; FAST-NEXT: jo LBB31_1 | |
-; FAST-NEXT: ## %bb.2: ## %continue | |
+; FAST-NEXT: ## %bb.3: ## %continue | |
; FAST-NEXT: movb $1, %al | |
+; FAST-NEXT: LBB31_2: ## %overflow | |
; FAST-NEXT: andb $1, %al | |
; FAST-NEXT: movzbl %al, %eax | |
; FAST-NEXT: retq | |
; FAST-NEXT: LBB31_1: ## %overflow | |
-; FAST-NEXT: xorl %eax, %eax | |
-; FAST-NEXT: andb $1, %al | |
-; FAST-NEXT: movzbl %al, %eax | |
-; FAST-NEXT: retq | |
+; FAST-NEXT: movb $0, %al | |
+; FAST-NEXT: jmp LBB31_2 | |
%t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2) | |
%val = extractvalue {i32, i1} %t, 0 | |
%obit = extractvalue {i32, i1} %t, 1 | |
@@ -774,16 +773,15 @@ define zeroext i1 @saddobri64(i64 %v1, i64 %v2) { | |
; FAST: ## %bb.0: | |
; FAST-NEXT: addq %rsi, %rdi | |
; FAST-NEXT: jo LBB32_1 | |
-; FAST-NEXT: ## %bb.2: ## %continue | |
+; FAST-NEXT: ## %bb.3: ## %continue | |
; FAST-NEXT: movb $1, %al | |
+; FAST-NEXT: LBB32_2: ## %overflow | |
; FAST-NEXT: andb $1, %al | |
; FAST-NEXT: movzbl %al, %eax | |
; FAST-NEXT: retq | |
; FAST-NEXT: LBB32_1: ## %overflow | |
-; FAST-NEXT: xorl %eax, %eax | |
-; FAST-NEXT: andb $1, %al | |
-; FAST-NEXT: movzbl %al, %eax | |
-; FAST-NEXT: retq | |
+; FAST-NEXT: movb $0, %al | |
+; FAST-NEXT: jmp LBB32_2 | |
%t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2) | |
%val = extractvalue {i64, i1} %t, 0 | |
%obit = extractvalue {i64, i1} %t, 1 | |
@@ -812,16 +810,15 @@ define zeroext i1 @uaddobri32(i32 %v1, i32 %v2) { | |
; FAST: ## %bb.0: | |
; FAST-NEXT: addl %esi, %edi | |
; FAST-NEXT: jb LBB33_1 | |
-; FAST-NEXT: ## %bb.2: ## %continue | |
+; FAST-NEXT: ## %bb.3: ## %continue | |
; FAST-NEXT: movb $1, %al | |
+; FAST-NEXT: LBB33_2: ## %overflow | |
; FAST-NEXT: andb $1, %al | |
; FAST-NEXT: movzbl %al, %eax | |
; FAST-NEXT: retq | |
; FAST-NEXT: LBB33_1: ## %overflow | |
-; FAST-NEXT: xorl %eax, %eax | |
-; FAST-NEXT: andb $1, %al | |
-; FAST-NEXT: movzbl %al, %eax | |
-; FAST-NEXT: retq | |
+; FAST-NEXT: movb $0, %al | |
+; FAST-NEXT: jmp LBB33_2 | |
%t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2) | |
%val = extractvalue {i32, i1} %t, 0 | |
%obit = extractvalue {i32, i1} %t, 1 | |
@@ -850,16 +847,15 @@ define zeroext i1 @uaddobri64(i64 %v1, i64 %v2) { | |
; FAST: ## %bb.0: | |
; FAST-NEXT: addq %rsi, %rdi | |
; FAST-NEXT: jb LBB34_1 | |
-; FAST-NEXT: ## %bb.2: ## %continue | |
+; FAST-NEXT: ## %bb.3: ## %continue | |
; FAST-NEXT: movb $1, %al | |
+; FAST-NEXT: LBB34_2: ## %overflow | |
; FAST-NEXT: andb $1, %al | |
; FAST-NEXT: movzbl %al, %eax | |
; FAST-NEXT: retq | |
; FAST-NEXT: LBB34_1: ## %overflow | |
-; FAST-NEXT: xorl %eax, %eax | |
-; FAST-NEXT: andb $1, %al | |
-; FAST-NEXT: movzbl %al, %eax | |
-; FAST-NEXT: retq | |
+; FAST-NEXT: movb $0, %al | |
+; FAST-NEXT: jmp LBB34_2 | |
%t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2) | |
%val = extractvalue {i64, i1} %t, 0 | |
%obit = extractvalue {i64, i1} %t, 1 | |
@@ -888,16 +884,15 @@ define zeroext i1 @ssubobri32(i32 %v1, i32 %v2) { | |
; FAST: ## %bb.0: | |
; FAST-NEXT: cmpl %esi, %edi | |
; FAST-NEXT: jo LBB35_1 | |
-; FAST-NEXT: ## %bb.2: ## %continue | |
+; FAST-NEXT: ## %bb.3: ## %continue | |
; FAST-NEXT: movb $1, %al | |
+; FAST-NEXT: LBB35_2: ## %overflow | |
; FAST-NEXT: andb $1, %al | |
; FAST-NEXT: movzbl %al, %eax | |
; FAST-NEXT: retq | |
; FAST-NEXT: LBB35_1: ## %overflow | |
-; FAST-NEXT: xorl %eax, %eax | |
-; FAST-NEXT: andb $1, %al | |
-; FAST-NEXT: movzbl %al, %eax | |
-; FAST-NEXT: retq | |
+; FAST-NEXT: movb $0, %al | |
+; FAST-NEXT: jmp LBB35_2 | |
%t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2) | |
%val = extractvalue {i32, i1} %t, 0 | |
%obit = extractvalue {i32, i1} %t, 1 | |
@@ -926,16 +921,15 @@ define zeroext i1 @ssubobri64(i64 %v1, i64 %v2) { | |
; FAST: ## %bb.0: | |
; FAST-NEXT: cmpq %rsi, %rdi | |
; FAST-NEXT: jo LBB36_1 | |
-; FAST-NEXT: ## %bb.2: ## %continue | |
+; FAST-NEXT: ## %bb.3: ## %continue | |
; FAST-NEXT: movb $1, %al | |
+; FAST-NEXT: LBB36_2: ## %overflow | |
; FAST-NEXT: andb $1, %al | |
; FAST-NEXT: movzbl %al, %eax | |
; FAST-NEXT: retq | |
; FAST-NEXT: LBB36_1: ## %overflow | |
-; FAST-NEXT: xorl %eax, %eax | |
-; FAST-NEXT: andb $1, %al | |
-; FAST-NEXT: movzbl %al, %eax | |
-; FAST-NEXT: retq | |
+; FAST-NEXT: movb $0, %al | |
+; FAST-NEXT: jmp LBB36_2 | |
%t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2) | |
%val = extractvalue {i64, i1} %t, 0 | |
%obit = extractvalue {i64, i1} %t, 1 | |
@@ -964,16 +958,15 @@ define zeroext i1 @usubobri32(i32 %v1, i32 %v2) { | |
; FAST: ## %bb.0: | |
; FAST-NEXT: cmpl %esi, %edi | |
; FAST-NEXT: jb LBB37_1 | |
-; FAST-NEXT: ## %bb.2: ## %continue | |
+; FAST-NEXT: ## %bb.3: ## %continue | |
; FAST-NEXT: movb $1, %al | |
+; FAST-NEXT: LBB37_2: ## %overflow | |
; FAST-NEXT: andb $1, %al | |
; FAST-NEXT: movzbl %al, %eax | |
; FAST-NEXT: retq | |
; FAST-NEXT: LBB37_1: ## %overflow | |
-; FAST-NEXT: xorl %eax, %eax | |
-; FAST-NEXT: andb $1, %al | |
-; FAST-NEXT: movzbl %al, %eax | |
-; FAST-NEXT: retq | |
+; FAST-NEXT: movb $0, %al | |
+; FAST-NEXT: jmp LBB37_2 | |
%t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2) | |
%val = extractvalue {i32, i1} %t, 0 | |
%obit = extractvalue {i32, i1} %t, 1 | |
@@ -1002,16 +995,15 @@ define zeroext i1 @usubobri64(i64 %v1, i64 %v2) { | |
; FAST: ## %bb.0: | |
; FAST-NEXT: cmpq %rsi, %rdi | |
; FAST-NEXT: jb LBB38_1 | |
-; FAST-NEXT: ## %bb.2: ## %continue | |
+; FAST-NEXT: ## %bb.3: ## %continue | |
; FAST-NEXT: movb $1, %al | |
+; FAST-NEXT: LBB38_2: ## %overflow | |
; FAST-NEXT: andb $1, %al | |
; FAST-NEXT: movzbl %al, %eax | |
; FAST-NEXT: retq | |
; FAST-NEXT: LBB38_1: ## %overflow | |
-; FAST-NEXT: xorl %eax, %eax | |
-; FAST-NEXT: andb $1, %al | |
-; FAST-NEXT: movzbl %al, %eax | |
-; FAST-NEXT: retq | |
+; FAST-NEXT: movb $0, %al | |
+; FAST-NEXT: jmp LBB38_2 | |
%t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2) | |
%val = extractvalue {i64, i1} %t, 0 | |
%obit = extractvalue {i64, i1} %t, 1 | |
diff --git a/llvm/test/CodeGen/X86/xmulo.ll b/llvm/test/CodeGen/X86/xmulo.ll | |
index f6c36f5afd99..7e25ff51aba2 100644 | |
--- a/llvm/test/CodeGen/X86/xmulo.ll | |
+++ b/llvm/test/CodeGen/X86/xmulo.ll | |
@@ -330,16 +330,15 @@ define zeroext i1 @smulobri8(i8 %v1, i8 %v2) { | |
; FAST-NEXT: seto %al | |
; FAST-NEXT: testb $1, %al | |
; FAST-NEXT: jne LBB15_1 | |
-; FAST-NEXT: ## %bb.2: ## %continue | |
+; FAST-NEXT: ## %bb.3: ## %continue | |
; FAST-NEXT: movb $1, %al | |
+; FAST-NEXT: LBB15_2: ## %overflow | |
; FAST-NEXT: andb $1, %al | |
; FAST-NEXT: movzbl %al, %eax | |
; FAST-NEXT: retq | |
; FAST-NEXT: LBB15_1: ## %overflow | |
-; FAST-NEXT: xorl %eax, %eax | |
-; FAST-NEXT: andb $1, %al | |
-; FAST-NEXT: movzbl %al, %eax | |
-; FAST-NEXT: retq | |
+; FAST-NEXT: movb $0, %al | |
+; FAST-NEXT: jmp LBB15_2 | |
%t = call {i8, i1} @llvm.smul.with.overflow.i8(i8 %v1, i8 %v2) | |
%val = extractvalue {i8, i1} %t, 0 | |
%obit = extractvalue {i8, i1} %t, 1 | |
@@ -370,16 +369,15 @@ define zeroext i1 @smulobri16(i16 %v1, i16 %v2) { | |
; FAST-NEXT: seto %al | |
; FAST-NEXT: testb $1, %al | |
; FAST-NEXT: jne LBB16_1 | |
-; FAST-NEXT: ## %bb.2: ## %continue | |
+; FAST-NEXT: ## %bb.3: ## %continue | |
; FAST-NEXT: movb $1, %al | |
+; FAST-NEXT: LBB16_2: ## %overflow | |
; FAST-NEXT: andb $1, %al | |
; FAST-NEXT: movzbl %al, %eax | |
; FAST-NEXT: retq | |
; FAST-NEXT: LBB16_1: ## %overflow | |
-; FAST-NEXT: xorl %eax, %eax | |
-; FAST-NEXT: andb $1, %al | |
-; FAST-NEXT: movzbl %al, %eax | |
-; FAST-NEXT: retq | |
+; FAST-NEXT: movb $0, %al | |
+; FAST-NEXT: jmp LBB16_2 | |
%t = call {i16, i1} @llvm.smul.with.overflow.i16(i16 %v1, i16 %v2) | |
%val = extractvalue {i16, i1} %t, 0 | |
%obit = extractvalue {i16, i1} %t, 1 | |
@@ -408,16 +406,15 @@ define zeroext i1 @smulobri32(i32 %v1, i32 %v2) { | |
; FAST: ## %bb.0: | |
; FAST-NEXT: imull %esi, %edi | |
; FAST-NEXT: jo LBB17_1 | |
-; FAST-NEXT: ## %bb.2: ## %continue | |
+; FAST-NEXT: ## %bb.3: ## %continue | |
; FAST-NEXT: movb $1, %al | |
+; FAST-NEXT: LBB17_2: ## %overflow | |
; FAST-NEXT: andb $1, %al | |
; FAST-NEXT: movzbl %al, %eax | |
; FAST-NEXT: retq | |
; FAST-NEXT: LBB17_1: ## %overflow | |
-; FAST-NEXT: xorl %eax, %eax | |
-; FAST-NEXT: andb $1, %al | |
-; FAST-NEXT: movzbl %al, %eax | |
-; FAST-NEXT: retq | |
+; FAST-NEXT: movb $0, %al | |
+; FAST-NEXT: jmp LBB17_2 | |
%t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2) | |
%val = extractvalue {i32, i1} %t, 0 | |
%obit = extractvalue {i32, i1} %t, 1 | |
@@ -446,16 +443,15 @@ define zeroext i1 @smulobri64(i64 %v1, i64 %v2) { | |
; FAST: ## %bb.0: | |
; FAST-NEXT: imulq %rsi, %rdi | |
; FAST-NEXT: jo LBB18_1 | |
-; FAST-NEXT: ## %bb.2: ## %continue | |
+; FAST-NEXT: ## %bb.3: ## %continue | |
; FAST-NEXT: movb $1, %al | |
+; FAST-NEXT: LBB18_2: ## %overflow | |
; FAST-NEXT: andb $1, %al | |
; FAST-NEXT: movzbl %al, %eax | |
; FAST-NEXT: retq | |
; FAST-NEXT: LBB18_1: ## %overflow | |
-; FAST-NEXT: xorl %eax, %eax | |
-; FAST-NEXT: andb $1, %al | |
-; FAST-NEXT: movzbl %al, %eax | |
-; FAST-NEXT: retq | |
+; FAST-NEXT: movb $0, %al | |
+; FAST-NEXT: jmp LBB18_2 | |
%t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2) | |
%val = extractvalue {i64, i1} %t, 0 | |
%obit = extractvalue {i64, i1} %t, 1 | |
@@ -490,16 +486,15 @@ define zeroext i1 @umulobri8(i8 %v1, i8 %v2) { | |
; FAST-NEXT: seto %al | |
; FAST-NEXT: testb $1, %al | |
; FAST-NEXT: jne LBB19_1 | |
-; FAST-NEXT: ## %bb.2: ## %continue | |
+; FAST-NEXT: ## %bb.3: ## %continue | |
; FAST-NEXT: movb $1, %al | |
+; FAST-NEXT: LBB19_2: ## %overflow | |
; FAST-NEXT: andb $1, %al | |
; FAST-NEXT: movzbl %al, %eax | |
; FAST-NEXT: retq | |
; FAST-NEXT: LBB19_1: ## %overflow | |
-; FAST-NEXT: xorl %eax, %eax | |
-; FAST-NEXT: andb $1, %al | |
-; FAST-NEXT: movzbl %al, %eax | |
-; FAST-NEXT: retq | |
+; FAST-NEXT: movb $0, %al | |
+; FAST-NEXT: jmp LBB19_2 | |
%t = call {i8, i1} @llvm.umul.with.overflow.i8(i8 %v1, i8 %v2) | |
%val = extractvalue {i8, i1} %t, 0 | |
%obit = extractvalue {i8, i1} %t, 1 | |
@@ -534,16 +529,15 @@ define zeroext i1 @umulobri16(i16 %v1, i16 %v2) { | |
; FAST-NEXT: seto %al | |
; FAST-NEXT: testb $1, %al | |
; FAST-NEXT: jne LBB20_1 | |
-; FAST-NEXT: ## %bb.2: ## %continue | |
+; FAST-NEXT: ## %bb.3: ## %continue | |
; FAST-NEXT: movb $1, %al | |
+; FAST-NEXT: LBB20_2: ## %overflow | |
; FAST-NEXT: andb $1, %al | |
; FAST-NEXT: movzbl %al, %eax | |
; FAST-NEXT: retq | |
; FAST-NEXT: LBB20_1: ## %overflow | |
-; FAST-NEXT: xorl %eax, %eax | |
-; FAST-NEXT: andb $1, %al | |
-; FAST-NEXT: movzbl %al, %eax | |
-; FAST-NEXT: retq | |
+; FAST-NEXT: movb $0, %al | |
+; FAST-NEXT: jmp LBB20_2 | |
%t = call {i16, i1} @llvm.umul.with.overflow.i16(i16 %v1, i16 %v2) | |
%val = extractvalue {i16, i1} %t, 0 | |
%obit = extractvalue {i16, i1} %t, 1 | |
@@ -574,16 +568,15 @@ define zeroext i1 @umulobri32(i32 %v1, i32 %v2) { | |
; FAST-NEXT: movl %edi, %eax | |
; FAST-NEXT: mull %esi | |
; FAST-NEXT: jo LBB21_1 | |
-; FAST-NEXT: ## %bb.2: ## %continue | |
+; FAST-NEXT: ## %bb.3: ## %continue | |
; FAST-NEXT: movb $1, %al | |
+; FAST-NEXT: LBB21_2: ## %overflow | |
; FAST-NEXT: andb $1, %al | |
; FAST-NEXT: movzbl %al, %eax | |
; FAST-NEXT: retq | |
; FAST-NEXT: LBB21_1: ## %overflow | |
-; FAST-NEXT: xorl %eax, %eax | |
-; FAST-NEXT: andb $1, %al | |
-; FAST-NEXT: movzbl %al, %eax | |
-; FAST-NEXT: retq | |
+; FAST-NEXT: movb $0, %al | |
+; FAST-NEXT: jmp LBB21_2 | |
%t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2) | |
%val = extractvalue {i32, i1} %t, 0 | |
%obit = extractvalue {i32, i1} %t, 1 | |
@@ -614,16 +607,15 @@ define zeroext i1 @umulobri64(i64 %v1, i64 %v2) { | |
; FAST-NEXT: movq %rdi, %rax | |
; FAST-NEXT: mulq %rsi | |
; FAST-NEXT: jo LBB22_1 | |
-; FAST-NEXT: ## %bb.2: ## %continue | |
+; FAST-NEXT: ## %bb.3: ## %continue | |
; FAST-NEXT: movb $1, %al | |
+; FAST-NEXT: LBB22_2: ## %overflow | |
; FAST-NEXT: andb $1, %al | |
; FAST-NEXT: movzbl %al, %eax | |
; FAST-NEXT: retq | |
; FAST-NEXT: LBB22_1: ## %overflow | |
-; FAST-NEXT: xorl %eax, %eax | |
-; FAST-NEXT: andb $1, %al | |
-; FAST-NEXT: movzbl %al, %eax | |
-; FAST-NEXT: retq | |
+; FAST-NEXT: movb $0, %al | |
+; FAST-NEXT: jmp LBB22_2 | |
%t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2) | |
%val = extractvalue {i64, i1} %t, 0 | |
%obit = extractvalue {i64, i1} %t, 1 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment