svn commit: r294938 - in vendor/llvm/dist: include/llvm/Analysis lib/Analysis lib/Target/AMDGPU lib/Target/X86 lib/Transforms/Instrumentation test/Analysis/DemandedBits test/CodeGen/X86 test/Transf...

Dimitry Andric dim at FreeBSD.org
Wed Jan 27 21:08:54 UTC 2016


Author: dim
Date: Wed Jan 27 21:08:51 2016
New Revision: 294938
URL: https://svnweb.freebsd.org/changeset/base/294938

Log:
  Vendor import of llvm release_38 branch r258968:
  https://llvm.org/svn/llvm-project/llvm/branches/release_38@258968

Added:
  vendor/llvm/dist/test/Transforms/GCOVProfiling/modules.ll
  vendor/llvm/dist/test/Transforms/IndVarSimplify/pr26207.ll
Modified:
  vendor/llvm/dist/include/llvm/Analysis/ScalarEvolution.h
  vendor/llvm/dist/lib/Analysis/DemandedBits.cpp
  vendor/llvm/dist/lib/Analysis/ScalarEvolution.cpp
  vendor/llvm/dist/lib/Target/AMDGPU/AMDGPU.td
  vendor/llvm/dist/lib/Target/AMDGPU/AMDGPUSubtarget.cpp
  vendor/llvm/dist/lib/Target/AMDGPU/AMDGPUSubtarget.h
  vendor/llvm/dist/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp
  vendor/llvm/dist/lib/Target/X86/X86ISelLowering.cpp
  vendor/llvm/dist/lib/Transforms/Instrumentation/GCOVProfiling.cpp
  vendor/llvm/dist/test/Analysis/DemandedBits/basic.ll
  vendor/llvm/dist/test/CodeGen/X86/cmovcmov.ll
  vendor/llvm/dist/utils/release/test-release.sh

Modified: vendor/llvm/dist/include/llvm/Analysis/ScalarEvolution.h
==============================================================================
--- vendor/llvm/dist/include/llvm/Analysis/ScalarEvolution.h	Wed Jan 27 20:23:42 2016	(r294937)
+++ vendor/llvm/dist/include/llvm/Analysis/ScalarEvolution.h	Wed Jan 27 21:08:51 2016	(r294938)
@@ -412,7 +412,11 @@ namespace llvm {
 
       /*implicit*/ ExitLimit(const SCEV *E) : Exact(E), Max(E) {}
 
-      ExitLimit(const SCEV *E, const SCEV *M) : Exact(E), Max(M) {}
+      ExitLimit(const SCEV *E, const SCEV *M) : Exact(E), Max(M) {
+        assert((isa<SCEVCouldNotCompute>(Exact) ||
+                !isa<SCEVCouldNotCompute>(Max)) &&
+               "Exact is not allowed to be less precise than Max");
+      }
 
       /// Test whether this ExitLimit contains any computed information, or
       /// whether it's all SCEVCouldNotCompute values.

Modified: vendor/llvm/dist/lib/Analysis/DemandedBits.cpp
==============================================================================
--- vendor/llvm/dist/lib/Analysis/DemandedBits.cpp	Wed Jan 27 20:23:42 2016	(r294937)
+++ vendor/llvm/dist/lib/Analysis/DemandedBits.cpp	Wed Jan 27 21:08:51 2016	(r294938)
@@ -244,7 +244,7 @@ void DemandedBits::determineLiveOperandB
     break;
   case Instruction::ICmp:
     // Count the number of leading zeroes in each operand.
-    ComputeKnownBits(BitWidth, I, UserI->getOperand(1));
+    ComputeKnownBits(BitWidth, UserI->getOperand(0), UserI->getOperand(1));
     auto NumLeadingZeroes = std::min(KnownZero.countLeadingOnes(),
                                      KnownZero2.countLeadingOnes());
     AB = ~APInt::getHighBitsSet(BitWidth, NumLeadingZeroes);

Modified: vendor/llvm/dist/lib/Analysis/ScalarEvolution.cpp
==============================================================================
--- vendor/llvm/dist/lib/Analysis/ScalarEvolution.cpp	Wed Jan 27 20:23:42 2016	(r294937)
+++ vendor/llvm/dist/lib/Analysis/ScalarEvolution.cpp	Wed Jan 27 21:08:51 2016	(r294938)
@@ -5368,6 +5368,14 @@ ScalarEvolution::computeExitLimitFromCon
           BECount = EL0.Exact;
       }
 
+      // There are cases (e.g. PR26207) where computeExitLimitFromCond is able
+      // to be more aggressive when computing BECount than when computing
+      // MaxBECount.  In these cases it is possible for EL0.Exact and EL1.Exact
+      // to match, but for EL0.Max and EL1.Max to not.
+      if (isa<SCEVCouldNotCompute>(MaxBECount) &&
+          !isa<SCEVCouldNotCompute>(BECount))
+        MaxBECount = BECount;
+
       return ExitLimit(BECount, MaxBECount);
     }
     if (BO->getOpcode() == Instruction::Or) {

Modified: vendor/llvm/dist/lib/Target/AMDGPU/AMDGPU.td
==============================================================================
--- vendor/llvm/dist/lib/Target/AMDGPU/AMDGPU.td	Wed Jan 27 20:23:42 2016	(r294937)
+++ vendor/llvm/dist/lib/Target/AMDGPU/AMDGPU.td	Wed Jan 27 21:08:51 2016	(r294938)
@@ -138,6 +138,11 @@ def FeatureEnableHugeScratchBuffer : Sub
         "true",
         "Enable scratch buffer sizes greater than 128 GB">;
 
+def FeatureEnableSIScheduler : SubtargetFeature<"si-scheduler",
+        "EnableSIScheduler",
+        "true",
+        "Enable SI Machine Scheduler">;
+
 class SubtargetFeatureFetchLimit <string Value> :
                           SubtargetFeature <"fetch"#Value,
         "TexVTXClauseSize",

Modified: vendor/llvm/dist/lib/Target/AMDGPU/AMDGPUSubtarget.cpp
==============================================================================
--- vendor/llvm/dist/lib/Target/AMDGPU/AMDGPUSubtarget.cpp	Wed Jan 27 20:23:42 2016	(r294937)
+++ vendor/llvm/dist/lib/Target/AMDGPU/AMDGPUSubtarget.cpp	Wed Jan 27 21:08:51 2016	(r294938)
@@ -78,7 +78,7 @@ AMDGPUSubtarget::AMDGPUSubtarget(const T
       EnableVGPRSpilling(false), SGPRInitBug(false), IsGCN(false),
       GCN1Encoding(false), GCN3Encoding(false), CIInsts(false), LDSBankCount(0),
       IsaVersion(ISAVersion0_0_0), EnableHugeScratchBuffer(false),
-      FrameLowering(nullptr),
+      EnableSIScheduler(false), FrameLowering(nullptr),
       InstrItins(getInstrItineraryForCPU(GPU)), TargetTriple(TT) {
 
   initializeSubtargetDependencies(TT, GPU, FS);

Modified: vendor/llvm/dist/lib/Target/AMDGPU/AMDGPUSubtarget.h
==============================================================================
--- vendor/llvm/dist/lib/Target/AMDGPU/AMDGPUSubtarget.h	Wed Jan 27 20:23:42 2016	(r294937)
+++ vendor/llvm/dist/lib/Target/AMDGPU/AMDGPUSubtarget.h	Wed Jan 27 21:08:51 2016	(r294938)
@@ -90,6 +90,7 @@ private:
   int LDSBankCount;
   unsigned IsaVersion;
   bool EnableHugeScratchBuffer;
+  bool EnableSIScheduler;
 
   std::unique_ptr<AMDGPUFrameLowering> FrameLowering;
   std::unique_ptr<AMDGPUTargetLowering> TLInfo;
@@ -280,6 +281,10 @@ public:
     return EnableHugeScratchBuffer;
   }
 
+  bool enableSIScheduler() const {
+    return EnableSIScheduler;
+  }
+
   bool dumpCode() const {
     return DumpCode;
   }

Modified: vendor/llvm/dist/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp
==============================================================================
--- vendor/llvm/dist/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp	Wed Jan 27 20:23:42 2016	(r294937)
+++ vendor/llvm/dist/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp	Wed Jan 27 21:08:51 2016	(r294938)
@@ -147,6 +147,8 @@ public:
     const AMDGPUSubtarget &ST = *getAMDGPUTargetMachine().getSubtargetImpl();
     if (ST.getGeneration() <= AMDGPUSubtarget::NORTHERN_ISLANDS)
       return createR600MachineScheduler(C);
+    else if (ST.enableSIScheduler())
+      return createSIMachineScheduler(C);
     return nullptr;
   }
 

Modified: vendor/llvm/dist/lib/Target/X86/X86ISelLowering.cpp
==============================================================================
--- vendor/llvm/dist/lib/Target/X86/X86ISelLowering.cpp	Wed Jan 27 20:23:42 2016	(r294937)
+++ vendor/llvm/dist/lib/Target/X86/X86ISelLowering.cpp	Wed Jan 27 21:08:51 2016	(r294938)
@@ -21880,7 +21880,8 @@ X86TargetLowering::EmitLoweredSelect(Mac
   if (LastCMOV == MI &&
       NextMIIt != BB->end() && NextMIIt->getOpcode() == MI->getOpcode() &&
       NextMIIt->getOperand(2).getReg() == MI->getOperand(2).getReg() &&
-      NextMIIt->getOperand(1).getReg() == MI->getOperand(0).getReg()) {
+      NextMIIt->getOperand(1).getReg() == MI->getOperand(0).getReg() &&
+      NextMIIt->getOperand(1).isKill()) {
     CascadedCMOV = &*NextMIIt;
   }
 

Modified: vendor/llvm/dist/lib/Transforms/Instrumentation/GCOVProfiling.cpp
==============================================================================
--- vendor/llvm/dist/lib/Transforms/Instrumentation/GCOVProfiling.cpp	Wed Jan 27 20:23:42 2016	(r294937)
+++ vendor/llvm/dist/lib/Transforms/Instrumentation/GCOVProfiling.cpp	Wed Jan 27 21:08:51 2016	(r294938)
@@ -494,6 +494,11 @@ void GCOVProfiler::emitProfileNotes() {
     // LTO, we'll generate the same .gcno files.
 
     auto *CU = cast<DICompileUnit>(CU_Nodes->getOperand(i));
+
+    // Skip module skeleton (and module) CUs.
+    if (CU->getDWOId())
+      continue;
+
     std::error_code EC;
     raw_fd_ostream out(mangleName(CU, "gcno"), EC, sys::fs::F_None);
     std::string EdgeDestinations;
@@ -853,6 +858,11 @@ Function *GCOVProfiler::insertCounterWri
   if (CU_Nodes) {
     for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
       auto *CU = cast<DICompileUnit>(CU_Nodes->getOperand(i));
+
+      // Skip module skeleton (and module) CUs.
+      if (CU->getDWOId())
+        continue;
+
       std::string FilenameGcda = mangleName(CU, "gcda");
       uint32_t CfgChecksum = FileChecksums.empty() ? 0 : FileChecksums[i];
       Builder.CreateCall(StartFile,

Modified: vendor/llvm/dist/test/Analysis/DemandedBits/basic.ll
==============================================================================
--- vendor/llvm/dist/test/Analysis/DemandedBits/basic.ll	Wed Jan 27 20:23:42 2016	(r294937)
+++ vendor/llvm/dist/test/Analysis/DemandedBits/basic.ll	Wed Jan 27 21:08:51 2016	(r294938)
@@ -24,11 +24,20 @@ define i1 @test_icmp1(i32 %a, i32 %b) {
 
 ; CHECK-LABEL: 'test_icmp2'
 ; CHECK-DAG: DemandedBits: 0x1 for   %3 = icmp eq i32 %1, %2
-; CHECK-DAG: DemandedBits: 0xFF for   %1 = and i32 %a, 255
-; CHECK-DAG: DemandedBits: 0xF for   %2 = ashr i32 %1, 4
+; CHECK-DAG: DemandedBits: 0xFFF for   %1 = and i32 %a, 255
+; CHECK-DAG: DemandedBits: 0xFF for   %2 = ashr i32 %1, 4
 define i1 @test_icmp2(i32 %a, i32 %b) {
   %1 = and i32 %a, 255
   %2 = ashr i32 %1, 4
   %3 = icmp eq i32 %1, %2
   ret i1 %3
 }
+
+; CHECK-LABEL: 'test_icmp3'
+; CHECK-DAG: DemandedBits: 0xFFFFFFFF for   %1 = and i32 %a, 255
+; CHECK-DAG: DemandedBits: 0x1 for   %2 = icmp eq i32 -1, %1
+define i1 @test_icmp3(i32 %a) {
+  %1 = and i32 %a, 255
+  %2 = icmp eq i32 -1, %1
+  ret i1 %2
+}

Modified: vendor/llvm/dist/test/CodeGen/X86/cmovcmov.ll
==============================================================================
--- vendor/llvm/dist/test/CodeGen/X86/cmovcmov.ll	Wed Jan 27 20:23:42 2016	(r294937)
+++ vendor/llvm/dist/test/CodeGen/X86/cmovcmov.ll	Wed Jan 27 21:08:51 2016	(r294938)
@@ -224,3 +224,52 @@ entry:
 }
 
 attributes #0 = { nounwind }
+
+ at g8 = global i8 0
+
+; The following test failed because llvm had a bug where a structure like:
+;
+; %vreg12<def> = CMOV_GR8 %vreg7, %vreg11 ... (lt)
+; %vreg13<def> = CMOV_GR8 %vreg12, %vreg11 ... (gt)
+;
+; was lowered to:
+;
+; The first two cmovs got expanded to:
+; BB#0:
+;   JL_1 BB#9
+; BB#7:
+;   JG_1 BB#9
+; BB#8:
+; BB#9:
+;   vreg12 = phi(vreg7, BB#8, vreg11, BB#0, vreg12, BB#7)
+;   vreg13 = COPY vreg12
+; Which was invalid as %vreg12 is not the same value as %vreg13
+
+; CHECK-LABEL: no_cascade_opt:
+; CMOV-DAG: cmpl %edx, %esi
+; CMOV-DAG: movb $20, %al
+; CMOV-DAG: movb $20, %dl
+; CMOV:   jl [[BB0:.LBB[0-9_]+]]
+; CMOV:   movb %cl, %dl
+; CMOV: [[BB0]]:
+; CMOV:   jg [[BB1:.LBB[0-9_]+]]
+; CMOV:   movb %dl, %al
+; CMOV: [[BB1]]:
+; CMOV:   testl %edi, %edi
+; CMOV:   je [[BB2:.LBB[0-9_]+]]
+; CMOV:   movb %dl, %al
+; CMOV: [[BB2]]:
+; CMOV:   movb %al, g8(%rip)
+; CMOV:   retq
+define void @no_cascade_opt(i32 %v0, i32 %v1, i32 %v2, i32 %v3) {
+entry:
+  %c0 = icmp eq i32 %v0, 0
+  %c1 = icmp slt i32 %v1, %v2
+  %c2 = icmp sgt i32 %v1, %v2
+  %trunc = trunc i32 %v3 to i8
+  %sel0 = select i1 %c1, i8 20, i8 %trunc
+  %sel1 = select i1 %c2, i8 20, i8 %sel0
+  %sel2 = select i1 %c0, i8 %sel1, i8 %sel0
+  store volatile i8 %sel2, i8* @g8
+  ret void
+}

Added: vendor/llvm/dist/test/Transforms/GCOVProfiling/modules.ll
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ vendor/llvm/dist/test/Transforms/GCOVProfiling/modules.ll	Wed Jan 27 21:08:51 2016	(r294938)
@@ -0,0 +1,12 @@
+; RUN: opt -insert-gcov-profiling -o - < %s | llvm-dis | FileCheck -check-prefix=EMIT-ARCS %s
+
+; EMIT-ARCS-NOT: call void @llvm_gcda_start_file
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!3, !4}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "LLVM", isOptimized: false, runtimeVersion: 2, splitDebugFilename: "my.dwo", emissionKind: 1, enums: !2, retainedTypes: !2, subprograms: !2, globals: !2, imports: !2, dwoId: 43981)
+!1 = !DIFile(filename: "<stdin>", directory: "/")
+!2 = !{}
+!3 = !{i32 2, !"Dwarf Version", i32 4}
+!4 = !{i32 2, !"Debug Info Version", i32 3}

Added: vendor/llvm/dist/test/Transforms/IndVarSimplify/pr26207.ll
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ vendor/llvm/dist/test/Transforms/IndVarSimplify/pr26207.ll	Wed Jan 27 21:08:51 2016	(r294938)
@@ -0,0 +1,20 @@
+; RUN: opt -S -indvars < %s | FileCheck %s
+
+target triple = "x86_64-unknown-linux-gnu"
+
+define void @main(i16 %in) {
+; CHECK-LABEL: @main(
+  br label %bb2
+
+bb2:                                              ; preds = %bb1.i, %bb2, %0
+  %_tmp44.i = icmp slt i16 %in, 2
+  br i1 %_tmp44.i, label %bb1.i, label %bb2
+
+bb1.i:                                            ; preds = %bb1.i, %bb2
+  %_tmp25.i = phi i16 [ %in, %bb2 ], [ %_tmp6.i, %bb1.i ]
+  %_tmp6.i = add nsw i16 %_tmp25.i, 1
+  %_tmp10.i = icmp sge i16 %_tmp6.i, 2
+  %exitcond.i = icmp eq i16 %_tmp6.i, 2
+  %or.cond = and i1 %_tmp10.i, %exitcond.i
+  br i1 %or.cond, label %bb2, label %bb1.i
+}

Modified: vendor/llvm/dist/utils/release/test-release.sh
==============================================================================
--- vendor/llvm/dist/utils/release/test-release.sh	Wed Jan 27 20:23:42 2016	(r294937)
+++ vendor/llvm/dist/utils/release/test-release.sh	Wed Jan 27 21:08:51 2016	(r294938)
@@ -267,56 +267,36 @@ function export_sources() {
     check_valid_urls
 
     for proj in $projects ; do
-        if [ -d $proj.src ]; then
-          echo "# Reusing $proj $Release-$RC sources"
+        case $proj in
+        llvm)
+            projsrc=$proj.src
+            ;;
+        cfe)
+            projsrc=llvm.src/tools/clang
+            ;;
+        clang-tools-extra)
+            projsrc=llvm.src/tools/clang/tools/extra
+            ;;
+        compiler-rt|libcxx|libcxxabi|libunwind|openmp|test-suite)
+            projsrc=llvm.src/projects/$proj
+            ;;
+        *)
+            echo "error: unknown project $proj"
+            exit 1
+            ;;
+        esac
+
+        if [ -d $projsrc ]; then
+          echo "# Reusing $proj $Release-$RC sources in $projsrc"
           continue
         fi
-        echo "# Exporting $proj $Release-$RC sources"
-        if ! svn export -q $Base_url/$proj/$ExportBranch $proj.src ; then
+        echo "# Exporting $proj $Release-$RC sources to $projsrc"
+        if ! svn export -q $Base_url/$proj/$ExportBranch $projsrc ; then
             echo "error: failed to export $proj project"
             exit 1
         fi
     done
 
-    echo "# Creating symlinks"
-    cd $BuildDir/llvm.src/tools
-    if [ ! -h clang ]; then
-        ln -s ../../cfe.src clang
-    fi
-
-    # The autoconf and CMake builds want different symlinks here:
-    if [ "$use_autoconf" = "yes" ]; then
-      cd $BuildDir/llvm.src/tools/clang/tools
-      if [ ! -h extra ]; then
-          ln -s ../../../../clang-tools-extra.src extra
-      fi
-    else
-      cd $BuildDir/cfe.src/tools
-      if [ ! -h extra ]; then
-          ln -s ../../clang-tools-extra.src extra
-      fi
-    fi
-
-    cd $BuildDir/llvm.src/projects
-    if [ -d $BuildDir/test-suite.src ] && [ ! -h test-suite ]; then
-        ln -s ../../test-suite.src test-suite
-    fi
-    if [ -d $BuildDir/compiler-rt.src ] && [ ! -h compiler-rt ]; then
-        ln -s ../../compiler-rt.src compiler-rt
-    fi
-    if [ -d $BuildDir/openmp.src ] && [ ! -h openmp ]; then
-        ln -s ../../openmp.src openmp
-    fi
-    if [ -d $BuildDir/libcxx.src ] && [ ! -h libcxx ]; then
-        ln -s ../../libcxx.src libcxx
-    fi
-    if [ -d $BuildDir/libcxxabi.src ] && [ ! -h libcxxabi ]; then
-        ln -s ../../libcxxabi.src libcxxabi
-    fi
-    if [ -d $BuildDir/libunwind.src ] && [ ! -h libunwind ]; then
-        ln -s ../../libunwind.src libunwind
-    fi
-
     cd $BuildDir
 }
 
@@ -560,8 +540,9 @@ for Flavor in $Flavors ; do
             # Substitute 'Phase2' for 'Phase3' in the Phase 2 object file in
             # case there are build paths in the debug info. On some systems,
             # sed adds a newline to the output, so pass $p3 through sed too.
-            if ! cmp -s <(sed -e 's,Phase2,Phase3,g' $p2) <(sed -e '' $p3) \
-                    16 16 ; then
+            if ! cmp -s \
+                <(env LC_CTYPE=C sed -e 's,Phase2,Phase3,g' $p2) \
+                <(env LC_CTYPE=C sed -e '' $p3) 16 16; then
                 echo "file `basename $p2` differs between phase 2 and phase 3"
             fi
         done


More information about the svn-src-all mailing list