[llvm] r233987 - ARM: Handle physreg targets in RegPair hints gracefully
Matthias Braun
matze at braunis.de
Thu Apr 2 17:18:38 PDT 2015
Author: matze
Date: Thu Apr 2 19:18:38 2015
New Revision: 233987
URL: http://llvm.org/viewvc/llvm-project?rev=233987&view=rev
Log:
ARM: Handle physreg targets in RegPair hints gracefully
Register coalescing can change the target of a RegPair hint to a
physreg, we should not crash on this. This also slightly improved the
way ARMBaseRegisterInfo::updateRegAllocHint() works.
Added:
llvm/trunk/test/CodeGen/ARM/regpair_hint_phys.ll
Modified:
llvm/trunk/lib/Target/ARM/ARMBaseRegisterInfo.cpp
Modified: llvm/trunk/lib/Target/ARM/ARMBaseRegisterInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMBaseRegisterInfo.cpp?rev=233987&r1=233986&r2=233987&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMBaseRegisterInfo.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMBaseRegisterInfo.cpp Thu Apr 2 19:18:38 2015
@@ -245,11 +245,15 @@ ARMBaseRegisterInfo::getRegAllocationHin
// This register should preferably be even (Odd == 0) or odd (Odd == 1).
// Check if the other part of the pair has already been assigned, and provide
// the paired register as the first hint.
+ unsigned Paired = Hint.second;
+ if (Paired == 0)
+ return;
+
unsigned PairedPhys = 0;
- if (VRM && VRM->hasPhys(Hint.second)) {
- PairedPhys = getPairedGPR(VRM->getPhys(Hint.second), Odd, this);
- if (PairedPhys && MRI.isReserved(PairedPhys))
- PairedPhys = 0;
+ if (TargetRegisterInfo::isPhysicalRegister(Paired)) {
+ PairedPhys = Paired;
+ } else if (VRM && VRM->hasPhys(Paired)) {
+ PairedPhys = getPairedGPR(VRM->getPhys(Paired), Odd, this);
}
// First prefer the paired physreg.
@@ -284,9 +288,14 @@ ARMBaseRegisterInfo::updateRegAllocHint(
// change.
unsigned OtherReg = Hint.second;
Hint = MRI->getRegAllocationHint(OtherReg);
- if (Hint.second == Reg)
- // Make sure the pair has not already divorced.
+ // Make sure the pair has not already divorced.
+ if (Hint.second == Reg) {
MRI->setRegAllocationHint(OtherReg, Hint.first, NewReg);
+ if (TargetRegisterInfo::isVirtualRegister(NewReg))
+ MRI->setRegAllocationHint(NewReg,
+ Hint.first == (unsigned)ARMRI::RegPairOdd ? ARMRI::RegPairEven
+ : ARMRI::RegPairOdd, OtherReg);
+ }
}
}
Added: llvm/trunk/test/CodeGen/ARM/regpair_hint_phys.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/regpair_hint_phys.ll?rev=233987&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/regpair_hint_phys.ll (added)
+++ llvm/trunk/test/CodeGen/ARM/regpair_hint_phys.ll Thu Apr 2 19:18:38 2015
@@ -0,0 +1,22 @@
+; RUN: llc -o - %s
+; ARM target used to fail an assertion if RegPair{Odd|Even} hint pointed to a
+; physreg.
+target datalayout = "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
+target triple = "thumbv7-apple-tvos8.3.0"
+
+declare i8* @llvm.frameaddress(i32) #1
+declare i8* @llvm.returnaddress(i32) #1
+
+ at somevar = global [2 x i32] [i32 0, i32 0]
+
+define void @__ubsan_handle_shift_out_of_bounds() #0 {
+entry:
+ %0 = tail call i8* @llvm.frameaddress(i32 0)
+ %1 = ptrtoint i8* %0 to i32
+ %2 = tail call i8* @llvm.returnaddress(i32 0)
+ %3 = ptrtoint i8* %2 to i32
+ %val0 = insertvalue [2 x i32] [i32 undef, i32 undef], i32 %3, 0
+ %val1 = insertvalue [2 x i32] %val0, i32 %1, 1
+ store [2 x i32] %val1, [2 x i32]* @somevar, align 8
+ ret void
+}
More information about the llvm-commits
mailing list