[PowerPC] 'cc' should be an alias only to 'cr0'
authorHal Finkel <hfinkel@anl.gov>
Thu, 4 Dec 2014 00:46:20 +0000 (00:46 +0000)
committerHal Finkel <hfinkel@anl.gov>
Thu, 4 Dec 2014 00:46:20 +0000 (00:46 +0000)
We had mistakenly believed that GCC's 'cc' referred to the entire
condition-code register (cr0 through cr7) -- and implemented this in r205630 to
fix PR19326, but 'cc' is actually an alias only to 'cr0'. This is causing LLVM
to clobber too much with legacy code with inline asm using the 'cc' clobber.

Fixes PR21451.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223328 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PowerPC/PPCRegisterInfo.td
test/CodeGen/PowerPC/cc.ll

index b3d145b2cc49083d52f389184f21f975e0556e8b..e928858388489e4b5aaf6965306ee27cc96d2770 100644 (file)
@@ -188,11 +188,9 @@ def CR6 : CR<6, "cr6", [CR6LT, CR6GT, CR6EQ, CR6UN]>, DwarfRegNum<[74, 74]>;
 def CR7 : CR<7, "cr7", [CR7LT, CR7GT, CR7EQ, CR7UN]>, DwarfRegNum<[75, 75]>;
 }
 
-// The full condition-code register. This is not modeled fully, but defined
-// here primarily, for compatibility with gcc, to allow the inline asm "cc"
-// clobber specification to work.
+// An alias for "cr0" used by GCC.
 def CC : PPCReg<"cc">, DwarfRegAlias<CR0> {
-  let Aliases = [CR0, CR1, CR2, CR3, CR4, CR5, CR6, CR7];
+  let Aliases = [CR0];
 }
 
 // Link register
index f92121bd7202dbd9e47b54bfe9354fe79cbd3521..c23ee7c9f5c804a0a06cd134976c5c2fa9eec379 100644 (file)
@@ -41,7 +41,7 @@ entry:
   br label %foo
 
 foo:
-  call { i64, i64 } asm sideeffect "sc", "={r0},={r3},{r0},~{cc}" (i64 %a)
+  call { i64, i64 } asm sideeffect "sc", "={r0},={r3},{r0},~{cc},~{cr1},~{cr2},~{cr3},~{cr4},~{cr5},~{cr6},~{cr7}" (i64 %a)
   br i1 %c, label %bar, label %end
 
 bar: