public:
static char ID;
- HexagonConstPropagation() : MachineFunctionPass(ID) {
- PassRegistry &Registry = *PassRegistry::getPassRegistry();
- initializeHexagonConstPropagationPass(Registry);
- }
+ HexagonConstPropagation() : MachineFunctionPass(ID) {}
StringRef getPassName() const override {
return "Hexagon Constant Propagation";
char HexagonConstPropagation::ID = 0;
-INITIALIZE_PASS(HexagonConstPropagation, "hcp", "Hexagon Constant Propagation",
- false, false)
+INITIALIZE_PASS(HexagonConstPropagation, "hexagon-constp",
+ "Hexagon Constant Propagation", false, false)
HexagonConstEvaluator::HexagonConstEvaluator(MachineFunction &Fn)
: MachineConstEvaluator(Fn),
case Hexagon::A2_combineii: // combine(#s8Ext, #s8)
case Hexagon::A4_combineii: // combine(#s8, #u6Ext)
{
+ if (!MI.getOperand(1).isImm() || !MI.getOperand(2).isImm())
+ return false;
uint64_t Hi = MI.getOperand(1).getImm();
uint64_t Lo = MI.getOperand(2).getImm();
uint64_t Res = (Hi << 32) | (Lo & 0xFFFFFFFF);
Eval = evaluateANDrr(R1, Register(Src2), Inputs, RC);
break;
case Hexagon::A2_andir: {
+ if (!Src2.isImm())
+ return false;
APInt A(32, Src2.getImm(), true);
Eval = evaluateANDri(R1, A, Inputs, RC);
break;
Eval = evaluateORrr(R1, Register(Src2), Inputs, RC);
break;
case Hexagon::A2_orir: {
+ if (!Src2.isImm())
+ return false;
APInt A(32, Src2.getImm(), true);
Eval = evaluateORri(R1, A, Inputs, RC);
break;
extern char &HexagonExpandCondsetsID;
void initializeHexagonBitSimplifyPass(PassRegistry&);
void initializeHexagonConstExtendersPass(PassRegistry&);
+ void initializeHexagonConstPropagationPass(PassRegistry&);
void initializeHexagonEarlyIfConversionPass(PassRegistry&);
void initializeHexagonExpandCondsetsPass(PassRegistry&);
void initializeHexagonGenMuxPass(PassRegistry&);
PassRegistry &PR = *PassRegistry::getPassRegistry();
initializeHexagonBitSimplifyPass(PR);
initializeHexagonConstExtendersPass(PR);
+ initializeHexagonConstPropagationPass(PR);
initializeHexagonEarlyIfConversionPass(PR);
initializeHexagonGenMuxPass(PR);
initializeHexagonHardwareLoopsPass(PR);
--- /dev/null
+# RUN: llc -march=hexagon -run-pass hexagon-constp %s -o - | FileCheck %s
+
+# Check that this doesn't crash.
+# CHECK: A2_andir killed %{{[0-9]+}}, @g
+
+--- |
+ @g = external global i32, align 4
+ define void @fred() {
+ ret void
+ }
+...
+
+---
+name: fred
+tracksRegLiveness: true
+body: |
+ bb.0:
+ %1:intregs = IMPLICIT_DEF
+ %0:intregs = L2_loadri_io %1, 0
+ %2:intregs = A2_addi killed %0, -1
+ %3:intregs = A2_subri -1, killed %2
+ %4:intregs = A2_andir killed %3, @g
+ %5:intregs = IMPLICIT_DEF
+ S2_storeri_io %5, 0, killed %4
+...