lebedev.ri created this revision.
lebedev.ri added reviewers: craig.topper, asbirlea, rnk, GGanesh, andreadb.
Herald added subscribers: Sanitizers, JDevlieghere, arichardson, aprantl, 
dberris, sdardis.

The compiler-rt side of https://reviews.llvm.org/D46314

I have discovered an issue by accident.

  $ lscpu 
  Architecture:        x86_64
  CPU op-mode(s):      32-bit, 64-bit
  Byte Order:          Little Endian
  CPU(s):              8
  On-line CPU(s) list: 0-7
  Thread(s) per core:  2
  Core(s) per socket:  4
  Socket(s):           1
  NUMA node(s):        1
  Vendor ID:           AuthenticAMD
  CPU family:          21
  Model:               2
  Model name:          AMD FX(tm)-8350 Eight-Core Processor
  Stepping:            0
  CPU MHz:             3584.018
  CPU max MHz:         4000.0000
  CPU min MHz:         1400.0000
  BogoMIPS:            8027.22
  Virtualization:      AMD-V
  L1d cache:           16K
  L1i cache:           64K
  L2 cache:            2048K
  L3 cache:            8192K
  NUMA node0 CPU(s):   0-7
  Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca 
cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb 
rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf 
pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 popcnt aes xsave avx f16c 
lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch 
osvw ibs xop skinit wdt lwp fma4 tce nodeid_msr tbm topoext perfctr_core 
perfctr_nb cpb hw_pstate vmmcall bmi1 arat npt lbrv svm_lock nrip_save 
tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold

So this is model-2 bulldozer AMD CPU.

GCC agrees:

  $ echo | gcc -E - -march=native -###
  <...>
   /usr/lib/gcc/x86_64-linux-gnu/7/cc1 -E -quiet -imultiarch x86_64-linux-gnu - 
"-march=bdver2" -mmmx -mno-3dnow -msse -msse2 -msse3 -mssse3 -msse4a -mcx16 
-msahf -mno-movbe -maes -mno-sha -mpclmul -mpopcnt -mabm -mlwp -mfma -mfma4 
-mxop -mbmi -mno-sgx -mno-bmi2 -mtbm -mavx -mno-avx2 -msse4.2 -msse4.1 -mlzcnt 
-mno-rtm -mno-hle -mno-rdrnd -mf16c -mno-fsgsbase -mno-rdseed -mprfchw -mno-adx 
-mfxsr -mxsave -mno-xsaveopt -mno-avx512f -mno-avx512er -mno-avx512cd 
-mno-avx512pf -mno-prefetchwt1 -mno-clflushopt -mno-xsavec -mno-xsaves 
-mno-avx512dq -mno-avx512bw -mno-avx512vl -mno-avx512ifma -mno-avx512vbmi 
-mno-avx5124fmaps -mno-avx5124vnniw -mno-clwb -mno-mwaitx -mno-clzero -mno-pku 
-mno-rdpid --param "l1-cache-size=16" --param "l1-cache-line-size=64" --param 
"l2-cache-size=2048" "-mtune=bdver2"
  <...>

But clang does not: (look for `bdver1`)

  $ echo | clang -E - -march=native -###
  clang version 7.0.0- (trunk)
  Target: x86_64-pc-linux-gnu
  Thread model: posix
  InstalledDir: /usr/local/bin
   "/usr/lib/llvm-7/bin/clang" "-cc1" "-triple" "x86_64-pc-linux-gnu" "-E" 
"-disable-free" "-disable-llvm-verifier" "-discard-value-names" 
"-main-file-name" "-" "-mrelocation-model" "static" "-mthread-model" "posix" 
"-mdisable-fp-elim" "-fmath-errno" "-masm-verbose" "-mconstructor-aliases" 
"-munwind-tables" "-fuse-init-array" "-target-cpu" "bdver1" "-target-feature" 
"+sse2" "-target-feature" "+cx16" "-target-feature" "+sahf" "-target-feature" 
"+tbm" "-target-feature" "-avx512ifma" "-target-feature" "-sha" 
"-target-feature" "-gfni" "-target-feature" "+fma4" "-target-feature" 
"-vpclmulqdq" "-target-feature" "+prfchw" "-target-feature" "-bmi2" 
"-target-feature" "-cldemote" "-target-feature" "-fsgsbase" "-target-feature" 
"-xsavec" "-target-feature" "+popcnt" "-target-feature" "+aes" 
"-target-feature" "-avx512bitalg" "-target-feature" "-xsaves" "-target-feature" 
"-avx512er" "-target-feature" "-avx512vnni" "-target-feature" 
"-avx512vpopcntdq" "-target-feature" "-clwb" "-target-feature" "-avx512f" 
"-target-feature" "-clzero" "-target-feature" "-pku" "-target-feature" "+mmx" 
"-target-feature" "+lwp" "-target-feature" "-rdpid" "-target-feature" "+xop" 
"-target-feature" "-rdseed" "-target-feature" "-waitpkg" "-target-feature" 
"-ibt" "-target-feature" "+sse4a" "-target-feature" "-avx512bw" 
"-target-feature" "-clflushopt" "-target-feature" "+xsave" "-target-feature" 
"-avx512vbmi2" "-target-feature" "-avx512vl" "-target-feature" "-avx512cd" 
"-target-feature" "+avx" "-target-feature" "-vaes" "-target-feature" "-rtm" 
"-target-feature" "+fma" "-target-feature" "+bmi" "-target-feature" "-rdrnd" 
"-target-feature" "-mwaitx" "-target-feature" "+sse4.1" "-target-feature" 
"+sse4.2" "-target-feature" "-avx2" "-target-feature" "-wbnoinvd" 
"-target-feature" "+sse" "-target-feature" "+lzcnt" "-target-feature" "+pclmul" 
"-target-feature" "-prefetchwt1" "-target-feature" "+f16c" "-target-feature" 
"+ssse3" "-target-feature" "-sgx" "-target-feature" "-shstk" "-target-feature" 
"+cmov" "-target-feature" "-avx512vbmi" "-target-feature" "-movbe" 
"-target-feature" "-xsaveopt" "-target-feature" "-avx512dq" "-target-feature" 
"-adx" "-target-feature" "-avx512pf" "-target-feature" "+sse3" 
"-dwarf-column-info" "-debugger-tuning=gdb" "-resource-dir" 
"/usr/lib/llvm-7/lib/clang/7.0.0" "-internal-isystem" "/usr/local/include" 
"-internal-isystem" "/usr/lib/llvm-7/lib/clang/7.0.0/include" 
"-internal-externc-isystem" "/usr/include/x86_64-linux-gnu" 
"-internal-externc-isystem" "/include" "-internal-externc-isystem" 
"/usr/include" "-fdebug-compilation-dir" "/build/llvm-build-Clang-release" 
"-ferror-limit" "19" "-fmessage-length" "271" "-fobjc-runtime=gcc" 
"-fdiagnostics-show-option" "-fcolor-diagnostics" "-o" "-" "-x" "c" "-"

So clang, unlike gcc, considers this to be `bdver1`.

After some digging, i've come across `getAMDProcessorTypeAndSubtype()` in 
`Host.cpp`.
I have added the following debug printf after the call to that function in 
`sys::getHostCPUName()`:

  errs() << "Family " << Family << " Model " << Model << " Type " << Type "\n";

Which produced:

  Family 21 Model 2 Type 5

Which matches the `lscpu` output.

As it was pointed in the review by @craig.topper:

In https://reviews.llvm.org/D46314#1084123, @craig.topper wrote:

> I dont' think this is right. Here is what I found on wikipedia. 
> https://en.wikipedia.org/wiki/List_of_AMD_CPU_microarchitectures.
>
> AMD Bulldozer Family 15h - the successor of 10h/K10. Bulldozer is designed 
> for processors in the 10 to 220W category, implementing XOP, FMA4 and CVT16 
> instruction sets. Orochi was the first design which implemented it. For 
> Bulldozer, CPUID model numbers are 00h and 01h.
>  AMD Piledriver Family 15h (2nd-gen) - successor to Bulldozer. CPUID model 
> numbers are 02h (earliest "Vishera" Piledrivers) and 10h-1Fh.
>  AMD Steamroller Family 15h (3rd-gen) - third-generation Bulldozer derived 
> core. CPUID model numbers are 30h-3Fh.
>  AMD Excavator Family 15h (4th-gen) - fourth-generation Bulldozer derived 
> core. CPUID model numbers are 60h-6Fh, later updated revisions have model 
> numbers 70h-7Fh.
>
> So there's a weird exception where model 2 should go with 0x10-0x1f.


Though It does not help that the code can't be tested at the moment.
With this logical change, the `bdver2` is properly detected.

  $ echo | /build/llvm-build-Clang-release/bin/clang -E - -march=native -###
  clang version 7.0.0 (trunk 331249) (llvm/trunk 331256)
  Target: x86_64-unknown-linux-gnu
  Thread model: posix
  InstalledDir: /build/llvm-build-Clang-release/bin
   "/build/llvm-build-Clang-release/bin/clang-7" "-cc1" "-triple" 
"x86_64-unknown-linux-gnu" "-E" "-disable-free" "-main-file-name" "-" 
"-mrelocation-model" "static" "-mthread-model" "posix" "-mdisable-fp-elim" 
"-fmath-errno" "-masm-verbose" "-mconstructor-aliases" "-munwind-tables" 
"-fuse-init-array" "-target-cpu" "bdver2" "-target-feature" "+sse2" 
"-target-feature" "+cx16" "-target-feature" "+sahf" "-target-feature" "+tbm" 
"-target-feature" "-avx512ifma" "-target-feature" "-sha" "-target-feature" 
"-gfni" "-target-feature" "+fma4" "-target-feature" "-vpclmulqdq" 
"-target-feature" "+prfchw" "-target-feature" "-bmi2" "-target-feature" 
"-cldemote" "-target-feature" "-fsgsbase" "-target-feature" "-xsavec" 
"-target-feature" "+popcnt" "-target-feature" "+aes" "-target-feature" 
"-avx512bitalg" "-target-feature" "-movdiri" "-target-feature" "-xsaves" 
"-target-feature" "-avx512er" "-target-feature" "-avx512vnni" "-target-feature" 
"-avx512vpopcntdq" "-target-feature" "-clwb" "-target-feature" "-avx512f" 
"-target-feature" "-clzero" "-target-feature" "-pku" "-target-feature" "+mmx" 
"-target-feature" "+lwp" "-target-feature" "-rdpid" "-target-feature" "+xop" 
"-target-feature" "-rdseed" "-target-feature" "-waitpkg" "-target-feature" 
"-movdir64b" "-target-feature" "-ibt" "-target-feature" "+sse4a" 
"-target-feature" "-avx512bw" "-target-feature" "-clflushopt" "-target-feature" 
"+xsave" "-target-feature" "-avx512vbmi2" "-target-feature" "-avx512vl" 
"-target-feature" "-avx512cd" "-target-feature" "+avx" "-target-feature" 
"-vaes" "-target-feature" "-rtm" "-target-feature" "+fma" "-target-feature" 
"+bmi" "-target-feature" "-rdrnd" "-target-feature" "-mwaitx" "-target-feature" 
"+sse4.1" "-target-feature" "+sse4.2" "-target-feature" "-avx2" 
"-target-feature" "-wbnoinvd" "-target-feature" "+sse" "-target-feature" 
"+lzcnt" "-target-feature" "+pclmul" "-target-feature" "-prefetchwt1" 
"-target-feature" "+f16c" "-target-feature" "+ssse3" "-target-feature" "-sgx" 
"-target-feature" "-shstk" "-target-feature" "+cmov" "-target-feature" 
"-avx512vbmi" "-target-feature" "-movbe" "-target-feature" "-xsaveopt" 
"-target-feature" "-avx512dq" "-target-feature" "-adx" "-target-feature" 
"-avx512pf" "-target-feature" "+sse3" "-dwarf-column-info" 
"-debugger-tuning=gdb" "-resource-dir" 
"/build/llvm-build-Clang-release/lib/clang/7.0.0" "-internal-isystem" 
"/usr/local/include" "-internal-isystem" 
"/build/llvm-build-Clang-release/lib/clang/7.0.0/include" 
"-internal-externc-isystem" "/usr/include/x86_64-linux-gnu" 
"-internal-externc-isystem" "/include" "-internal-externc-isystem" 
"/usr/include" "-fdebug-compilation-dir" "/build/llvm-build-Clang-release" 
"-ferror-limit" "19" "-fmessage-length" "271" "-fobjc-runtime=gcc" 
"-fdiagnostics-show-option" "-fcolor-diagnostics" "-o" "-" "-x" "c" "-"


Repository:
  rCRT Compiler Runtime

https://reviews.llvm.org/D46323

Files:
  lib/builtins/cpu_model.c


Index: lib/builtins/cpu_model.c
===================================================================
--- lib/builtins/cpu_model.c
+++ lib/builtins/cpu_model.c
@@ -416,7 +416,7 @@
       *Subtype = AMDFAM15H_BDVER3;
       break; // "bdver3"; 30h-3Fh: Steamroller
     }
-    if (Model >= 0x10 && Model <= 0x1f) {
+    if ((Model >= 0x10 && Model <= 0x1f) || Model == 0x02) {
       *Subtype = AMDFAM15H_BDVER2;
       break; // "bdver2"; 10h-1Fh: Piledriver
     }


Index: lib/builtins/cpu_model.c
===================================================================
--- lib/builtins/cpu_model.c
+++ lib/builtins/cpu_model.c
@@ -416,7 +416,7 @@
       *Subtype = AMDFAM15H_BDVER3;
       break; // "bdver3"; 30h-3Fh: Steamroller
     }
-    if (Model >= 0x10 && Model <= 0x1f) {
+    if ((Model >= 0x10 && Model <= 0x1f) || Model == 0x02) {
       *Subtype = AMDFAM15H_BDVER2;
       break; // "bdver2"; 10h-1Fh: Piledriver
     }
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to