-
Notifications
You must be signed in to change notification settings - Fork 26
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Integrate LLVM at llvm/llvm-project@33363521ca24
Updates LLVM usage to match [33363521ca24](llvm/llvm-project@33363521ca24) PiperOrigin-RevId: 689759936
- Loading branch information
1 parent
bb171ce
commit d78f730
Showing
2 changed files
with
148 additions
and
40 deletions.
There are no files selected for viewing
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,43 +1,151 @@ | ||
Auto generated patch. Do not edit or delete it, even if empty. | ||
diff -ruN --strip-trailing-cr a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp | ||
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp | ||
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp | ||
@@ -50049,8 +50049,9 @@ | ||
SDValue X, Y, Z; | ||
if (sd_match(N, m_And(m_Value(X), | ||
m_OneUse(m_Or(m_Value(Y), m_Not(m_Value(Z))))))) { | ||
- // Don't fold if Y is a constant to prevent infinite loops. | ||
- if (!isa<ConstantSDNode>(Y)) | ||
+ // Don't fold if Y or Z are constants to prevent infinite loops. | ||
+ if (!DAG.isConstantIntBuildVectorOrConstantInt(Y) && | ||
+ !DAG.isConstantIntBuildVectorOrConstantInt(Z)) | ||
return DAG.getNode( | ||
ISD::AND, DL, VT, X, | ||
DAG.getNOT( | ||
diff -ruN --strip-trailing-cr a/llvm/test/CodeGen/X86/pr108731.ll b/llvm/test/CodeGen/X86/pr108731.ll | ||
--- a/llvm/test/CodeGen/X86/pr108731.ll | ||
+++ b/llvm/test/CodeGen/X86/pr108731.ll | ||
@@ -192,3 +192,23 @@ | ||
ret void | ||
} | ||
diff -ruN --strip-trailing-cr a/llvm/lib/Linker/IRMover.cpp b/llvm/lib/Linker/IRMover.cpp | ||
--- a/llvm/lib/Linker/IRMover.cpp | ||
+++ b/llvm/lib/Linker/IRMover.cpp | ||
@@ -595,11 +595,15 @@ | ||
if (!SGV) | ||
return nullptr; | ||
|
||
+define void @PR113240(i64 %a) { | ||
+; CHECK-LABEL: PR113240: | ||
+; CHECK: # %bb.0: # %entry | ||
+; CHECK-NEXT: movq %rdi, %rax | ||
+; CHECK-NEXT: notq %rax | ||
+; CHECK-NEXT: movabsq $8796093022206, %rcx # imm = 0x7FFFFFFFFFE | ||
+; CHECK-NEXT: notq %rcx | ||
+; CHECK-NEXT: orq %rax, %rcx | ||
+; CHECK-NEXT: andq %rdi, %rcx | ||
+; CHECK-NEXT: movq %rcx, 0 | ||
+; CHECK-NEXT: retq | ||
+entry: | ||
+ %and = and i64 %a, 8796093022206 | ||
+ %bf.value = and i64 8796093022206, 0 | ||
+ %not = xor i64 %and, -1 | ||
+ %and4 = and i64 %a, %not | ||
+ store i64 %and4, ptr null, align 8 | ||
+ // If SGV is from dest, it was already materialized when dest was loaded. | ||
+ if (SGV->getParent() == &DstM) | ||
+ return nullptr; | ||
+ | ||
// When linking a global from other modules than source & dest, skip | ||
// materializing it because it would be mapped later when its containing | ||
// module is linked. Linking it now would potentially pull in many types that | ||
// may not be mapped properly. | ||
- if (SGV->getParent() != &DstM && SGV->getParent() != SrcM.get()) | ||
+ if (SGV->getParent() != SrcM.get()) | ||
return nullptr; | ||
|
||
Expected<Constant *> NewProto = linkGlobalValueProto(SGV, ForIndirectSymbol); | ||
diff -ruN --strip-trailing-cr a/llvm/test/ThinLTO/X86/Inputs/ditemplatevalueparameter-remap.ll b/llvm/test/ThinLTO/X86/Inputs/ditemplatevalueparameter-remap.ll | ||
--- a/llvm/test/ThinLTO/X86/Inputs/ditemplatevalueparameter-remap.ll | ||
+++ b/llvm/test/ThinLTO/X86/Inputs/ditemplatevalueparameter-remap.ll | ||
@@ -0,0 +1,29 @@ | ||
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" | ||
+target triple = "x86_64-unknown-linux-gnu" | ||
+ | ||
+define void @_Z8thinlto1v() unnamed_addr { | ||
+ %3 = alloca i64, align 4 | ||
+ #dbg_declare(ptr %3, !14, !DIExpression(), !15) | ||
+ ret void | ||
+} | ||
+ | ||
+!llvm.dbg.cu = !{!0} | ||
+!llvm.module.flags = !{!2, !3, !4, !5} | ||
+ | ||
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None) | ||
+!1 = !DIFile(filename: "B.cpp", directory: ".") | ||
+!2 = !{i32 7, !"Dwarf Version", i32 4} | ||
+!3 = !{i32 2, !"Debug Info Version", i32 3} | ||
+!4 = !{i32 1, !"wchar_size", i32 4} | ||
+!5 = !{i32 8, !"PIC Level", i32 2} | ||
+!10 = distinct !DISubprogram(name: "thinlto1", linkageName: "_Z8thinlto1v", scope: !11, file: !11, line: 8, type: !12, scopeLine: 8, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0) | ||
+!11 = !DIFile(filename: "b.cpp", directory: ".") | ||
+!12 = !DISubroutineType(types: !13) | ||
+!13 = !{null} | ||
+!14 = !DILocalVariable(name: "a", arg: 1, scope: !10, file: !11, line: 18, type: !16) | ||
+!15 = !DILocation(line: 18, column: 19, scope: !10) | ||
+!16 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "S<&func1>", file: !11, line: 2, size: 8, flags: DIFlagTypePassByValue, elements: !17, templateParams: !18, identifier: "_ZTS1SIXadL_Z5func1vEEE") | ||
+!17 = !{} | ||
+!18 = !{!19} | ||
+!19 = !DITemplateValueParameter(name: "Func", type: !20, value: ptr undef) | ||
+!20 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !12, size: 64) | ||
diff -ruN --strip-trailing-cr a/llvm/test/ThinLTO/X86/ditemplatevalueparameter-remap.ll b/llvm/test/ThinLTO/X86/ditemplatevalueparameter-remap.ll | ||
--- a/llvm/test/ThinLTO/X86/ditemplatevalueparameter-remap.ll | ||
+++ b/llvm/test/ThinLTO/X86/ditemplatevalueparameter-remap.ll | ||
@@ -0,0 +1,93 @@ | ||
+; https://github.com/llvm/llvm-project/pull/110064 | ||
+; This test case checks if thinLTO correctly links metadata values in a specific | ||
+; situation. Assume we are linking module B into module A, where an extern | ||
+; function used in A is defined in B, but the function body has a | ||
+; DITemplateValueParameter referring to another function back in A. The | ||
+; compiler must check this other function is actually coming from A, thus | ||
+; already materialized and does not require remapping. The IR here is modified | ||
+; from the following source code. | ||
+; | ||
+; // A.h | ||
+; template <void (*Func)()> | ||
+; struct S { | ||
+; void Impl() { | ||
+; Func(); | ||
+; } | ||
+; }; | ||
+; | ||
+; void func1(); | ||
+; | ||
+; // A.cpp | ||
+; #include "A.h" | ||
+; __attribute__((weak)) void func1() {} | ||
+; extern void thinlto1(); | ||
+; void bar() { | ||
+; S<func1> s; // Force instantiation of S<func1> in this compilation unit. | ||
+; s.Impl(); | ||
+; thinlto1(); | ||
+; } | ||
+; | ||
+; // B.cpp | ||
+; #include "A.h" | ||
+; void thinlto1() { | ||
+; S<func1> s; | ||
+; } | ||
+; | ||
+; RUN: opt -module-summary -o %t1.bc %s | ||
+; RUN: opt -module-summary -o %t2.bc %S/Inputs/ditemplatevalueparameter-remap.ll | ||
+; RUN: llvm-lto2 run %t1.bc %t2.bc -o %t3 -save-temps \ | ||
+; RUN: -r=%t1.bc,_Z5func1v,p \ | ||
+; RUN: -r=%t1.bc,_Z3bazv,px \ | ||
+; RUN: -r=%t1.bc,_Z8thinlto1v,x \ | ||
+; RUN: -r=%t1.bc,_Z3barv,px \ | ||
+; RUN: -r=%t2.bc,_Z8thinlto1v,px | ||
+; RUN: llvm-dis %t3.1.4.opt.bc -o - | FileCheck %s | ||
+ | ||
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" | ||
+target triple = "x86_64-unknown-linux-gnu" | ||
+ | ||
+$_Z5func1v = comdat any | ||
+ | ||
+define linkonce_odr void @_Z5func1v() unnamed_addr !dbg !10 { | ||
+ ret void | ||
+} | ||
+ | ||
+; Dummy function to use _Z5func1v so that it is not treated as dead symbol. | ||
+define void @_Z3bazv() { | ||
+ tail call void @_Z5func1v() | ||
+ ret void | ||
+} | ||
+ | ||
+declare void @_Z8thinlto1v() unnamed_addr | ||
+ | ||
+; Check _Z8thinlto1v is inlined after thinLTO. | ||
+; CHECK: void @_Z3barv() | ||
+; CHECK-NOT: @_Z8thinlto1v() | ||
+; CHECK-NEXT: ret void | ||
+define void @_Z3barv() unnamed_addr !dbg !14 { | ||
+ tail call void @_Z8thinlto1v(), !dbg !25 | ||
+ ret void | ||
+} | ||
+ | ||
+!llvm.dbg.cu = !{!0} | ||
+!llvm.module.flags = !{!2, !3, !4, !5} | ||
+ | ||
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None) | ||
+!1 = !DIFile(filename: "A.cpp", directory: ".") | ||
+!2 = !{i32 7, !"Dwarf Version", i32 4} | ||
+!3 = !{i32 2, !"Debug Info Version", i32 3} | ||
+!4 = !{i32 1, !"wchar_size", i32 4} | ||
+!5 = !{i32 8, !"PIC Level", i32 2} | ||
+!10 = distinct !DISubprogram(name: "func1", linkageName: "_Z5func1v", scope: !11, file: !11, line: 6, type: !12, scopeLine: 6, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0) | ||
+!11 = !DIFile(filename: "a.h", directory: ".") | ||
+!12 = !DISubroutineType(types: !13) | ||
+!13 = !{null} | ||
+!14 = distinct !DISubprogram(name: "bar", linkageName: "_Z3barv", scope: !11, file: !11, line: 15, type: !12, scopeLine: 15, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !16) | ||
+!16 = !{!17} | ||
+!17 = !DILocalVariable(name: "s", scope: !14, file: !11, line: 10, type: !18) | ||
+!18 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "S<&func1>", file: !11, line: 2, size: 8, flags: DIFlagTypePassByValue, elements: !19, templateParams: !20, identifier: "_ZTS1SIXadL_Z5func1vEEE") | ||
+!19 = !{} | ||
+!20 = !{!21} | ||
+!21 = !DITemplateValueParameter(name: "Func", type: !22, value: ptr @_Z5func1v) | ||
+!22 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !12, size: 64) | ||
+!25 = !DILocation(line: 16, column: 5, scope: !14) |
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