================
@@ -1444,15 +1444,16 @@ void clang::emitBackendOutput(CompilerInstance &CI, 
CodeGenOptions &CGOpts,
 
   // Verify clang's TargetInfo DataLayout against the LLVM TargetMachine's
   // DataLayout.
-  if (AsmHelper.TM) {
-    std::string DLDesc = M->getDataLayout().getStringRepresentation();
-    if (DLDesc != TDesc) {
+  if (AsmHelper.TM)
+    if (!AsmHelper.TM->isCompatibleDataLayout(M->getDataLayout()) ||
+        !AsmHelper.TM->isCompatibleDataLayout(DataLayout(TDesc))) {
+      std::string DLDesc = M->getDataLayout().getStringRepresentation();
----------------
thetheodor wrote:

A lot (most?) of these address space casts in the tests stem from front-end 
lowering patterns like this:
```
define hidden noundef i32 @_Z3fooRi(ptr noundef nonnull align 4 
dereferenceable(4) %a) #3 {
entry:
  %retval = alloca i32, align 4, addrspace(5)
  %a.addr = alloca ptr, align 8, addrspace(5)
  %retval.ascast = addrspacecast ptr addrspace(5) %retval to ptr
  %a.addr.ascast = addrspacecast ptr addrspace(5) %a.addr to ptr
  store ptr %a, ptr %a.addr.ascast, align 8, !tbaa !12
  %0 = load ptr, ptr %a.addr.ascast, align 8, !tbaa !12, !nonnull !14, !align 
!15
  %1 = load i32, ptr %0, align 4, !tbaa !10
  ret i32 %1
}
```
and because no optimizations are enabled in these OpenMP tests, these 
alloca-cast-store-load chains are not simplified. Running SROA eliminates the 
noise:
```
; *** IR Dump After SROAPass on _Z3fooRi ***
; Function Attrs: convergent mustprogress nounwind
define hidden noundef i32 @_Z3fooRi(ptr noundef nonnull align 4 
dereferenceable(4) %a) #3 {
entry:
  %0 = load i32, ptr %a, align 4, !tbaa !10
  ret i32 %0
}
```
The only casts not removed by SROA are for the OpenMP API calls that need 
generic addresses.

(The amdgpu OpenMP tests also include this pattern)


https://github.com/llvm/llvm-project/pull/154814
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to