Skip to content

Commit cdd3635

Browse files
committed
Move additional register names to their own lookup, separate from
register aliases. Fixes unnecessary renames of clobbers. Fixes part of rdar://9425559 llvm-svn: 133485
1 parent d155c0b commit cdd3635

File tree

4 files changed

+56
-15
lines changed

4 files changed

+56
-15
lines changed

clang/include/clang/Basic/TargetInfo.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,11 @@ class TargetInfo : public llvm::RefCountedBase<TargetInfo> {
396396
const char * const Register;
397397
};
398398

399+
struct AddlRegName {
400+
const char * const Names[5];
401+
const unsigned RegNum;
402+
};
403+
399404
virtual bool useGlobalsForAutomaticVariables() const { return false; }
400405

401406
/// getCFStringSection - Return the section to use for CFString
@@ -566,6 +571,11 @@ class TargetInfo : public llvm::RefCountedBase<TargetInfo> {
566571
unsigned &NumNames) const = 0;
567572
virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
568573
unsigned &NumAliases) const = 0;
574+
virtual void getGCCAddlRegNames(const AddlRegName *&Addl,
575+
unsigned &NumAddl) const {
576+
Addl = 0;
577+
NumAddl = 0;
578+
}
569579
virtual bool validateAsmConstraint(const char *&Name,
570580
TargetInfo::ConstraintInfo &info) const= 0;
571581
};

clang/lib/Basic/TargetInfo.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,20 @@ bool TargetInfo::isValidGCCRegisterName(llvm::StringRef Name) const {
212212
return true;
213213
}
214214

215+
// Check any additional names that we have.
216+
const AddlRegName *AddlNames;
217+
unsigned NumAddlNames;
218+
getGCCAddlRegNames(AddlNames, NumAddlNames);
219+
for (unsigned i = 0; i < NumAddlNames; i++)
220+
for (unsigned j = 0; j < llvm::array_lengthof(AddlNames[i].Names); j++) {
221+
if (!AddlNames[i].Names[j])
222+
break;
223+
// Make sure the register that the additional name is for is within
224+
// the bounds of the register names from above.
225+
if (AddlNames[i].Names[j] == Name && AddlNames[i].RegNum < NumNames)
226+
return true;
227+
}
228+
215229
// Now check aliases.
216230
const GCCRegAlias *Aliases;
217231
unsigned NumAliases;
@@ -251,6 +265,20 @@ TargetInfo::getNormalizedGCCRegisterName(llvm::StringRef Name) const {
251265
}
252266
}
253267

268+
// Check any additional names that we have.
269+
const AddlRegName *AddlNames;
270+
unsigned NumAddlNames;
271+
getGCCAddlRegNames(AddlNames, NumAddlNames);
272+
for (unsigned i = 0; i < NumAddlNames; i++)
273+
for (unsigned j = 0; j < llvm::array_lengthof(AddlNames[i].Names); j++) {
274+
if (!AddlNames[i].Names[j])
275+
break;
276+
// Make sure the register that the additional name is for is within
277+
// the bounds of the register names from above.
278+
if (AddlNames[i].Names[j] == Name && AddlNames[i].RegNum < NumNames)
279+
return Name;
280+
}
281+
254282
// Now check aliases.
255283
const GCCRegAlias *Aliases;
256284
unsigned NumAliases;

clang/lib/Basic/Targets.cpp

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,6 @@ class PPCTargetInfo : public TargetInfo {
526526
static const Builtin::Info BuiltinInfo[];
527527
static const char * const GCCRegNames[];
528528
static const TargetInfo::GCCRegAlias GCCRegAliases[];
529-
530529
public:
531530
PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
532531

@@ -1085,18 +1084,18 @@ static const char* const GCCRegNames[] = {
10851084
"xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
10861085
"mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
10871086
"r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1088-
"xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
1087+
"xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
10891088
};
10901089

1091-
const TargetInfo::GCCRegAlias GCCRegAliases[] = {
1092-
{ { "al", "ah", "eax", "rax" }, "ax" },
1093-
{ { "bl", "bh", "ebx", "rbx" }, "bx" },
1094-
{ { "cl", "ch", "ecx", "rcx" }, "cx" },
1095-
{ { "dl", "dh", "edx", "rdx" }, "dx" },
1096-
{ { "esi", "rsi" }, "si" },
1097-
{ { "edi", "rdi" }, "di" },
1098-
{ { "esp", "rsp" }, "sp" },
1099-
{ { "ebp", "rbp" }, "bp" },
1090+
const TargetInfo::AddlRegName AddlRegNames[] = {
1091+
{ { "al", "ah", "eax", "rax" }, 0 },
1092+
{ { "bl", "bh", "ebx", "rbx" }, 3 },
1093+
{ { "cl", "ch", "ecx", "rcx" }, 2 },
1094+
{ { "dl", "dh", "edx", "rdx" }, 1 },
1095+
{ { "esi", "rsi" }, 4 },
1096+
{ { "edi", "rdi" }, 5 },
1097+
{ { "esp", "rsp" }, 7 },
1098+
{ { "ebp", "rbp" }, 6 },
11001099
};
11011100

11021101
// X86 target abstract base class; x86-32 and x86-64 are very close, so
@@ -1130,8 +1129,13 @@ class X86TargetInfo : public TargetInfo {
11301129
}
11311130
virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
11321131
unsigned &NumAliases) const {
1133-
Aliases = GCCRegAliases;
1134-
NumAliases = llvm::array_lengthof(GCCRegAliases);
1132+
Aliases = 0;
1133+
NumAliases = 0;
1134+
}
1135+
virtual void getGCCAddlRegNames(const AddlRegName *&Names,
1136+
unsigned &NumNames) const {
1137+
Names = AddlRegNames;
1138+
NumNames = llvm::array_lengthof(AddlRegNames);
11351139
}
11361140
virtual bool validateAsmConstraint(const char *&Name,
11371141
TargetInfo::ConstraintInfo &info) const;

clang/test/CodeGen/asm-inout.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ void test2() {
2121
// PR7338
2222
void test3(int *vout, int vin)
2323
{
24-
// CHECK: call void asm "opr $0,$1", "=*r|m|r,r|m|r,~{di},~{dirflag},~{fpsr},~{flags}"
24+
// CHECK: call void asm "opr $0,$1", "=*r|m|r,r|m|r,~{edi},~{dirflag},~{fpsr},~{flags}"
2525
asm(
2626
"opr %[vout],%[vin]"
2727
: [vout] "=r,=m,=r" (*vout)
@@ -37,4 +37,3 @@ int test4(volatile int *addr) {
3737
return (int)oldval;
3838
// CHECK: call i8 asm "frob $0", "=r,0{{.*}}"(i8 -1)
3939
}
40-

0 commit comments

Comments
 (0)