From e5d9ab08c39aa674def376dcffead2242a097536 Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek Date: Wed, 19 Oct 2022 14:14:48 -0700 Subject: [PATCH] [Hexagon] Fix insertion point for pointer difference calculation HVC::calculatePointerDifference inserts temporary instructions for simplification, and calulation of known bits. These instructions were inserted at the end of a basic block (after the terminator), which caused BB->getTerminator() to return nullptr. This, in turn, caused a crash when a PHI instruction was examined in computeKnownBits. --- llvm/lib/Target/Hexagon/HexagonVectorCombine.cpp | 2 +- .../Hexagon/autohvx/vector-align-terminator.ll | 33 ++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 llvm/test/CodeGen/Hexagon/autohvx/vector-align-terminator.ll diff --git a/llvm/lib/Target/Hexagon/HexagonVectorCombine.cpp b/llvm/lib/Target/Hexagon/HexagonVectorCombine.cpp index dc954be..5754775 100644 --- a/llvm/lib/Target/Hexagon/HexagonVectorCombine.cpp +++ b/llvm/lib/Target/Hexagon/HexagonVectorCombine.cpp @@ -1930,7 +1930,7 @@ auto HexagonVectorCombine::calculatePointerDifference(Value *Ptr0, Value *Ptr1) const -> std::optional { struct Builder : IRBuilder<> { - Builder(BasicBlock *B) : IRBuilder<>(B) {} + Builder(BasicBlock *B) : IRBuilder<>(B->getTerminator()) {} ~Builder() { for (Instruction *I : llvm::reverse(ToErase)) I->eraseFromParent(); diff --git a/llvm/test/CodeGen/Hexagon/autohvx/vector-align-terminator.ll b/llvm/test/CodeGen/Hexagon/autohvx/vector-align-terminator.ll new file mode 100644 index 0000000..7679346 --- /dev/null +++ b/llvm/test/CodeGen/Hexagon/autohvx/vector-align-terminator.ll @@ -0,0 +1,33 @@ +; RUN: llc -march=hexagon < %s | FileCheck %s + +; Check that this doesn't crash. +; CHECK: jumpr r31 + +target triple = "hexagon" + +define void @f0() #0 { +b0: + br label %b1 + +b1: ; preds = %b0, %b1 + %v0 = phi i32 [ %v9, %b1 ], [ 0, %b0 ] + %v1 = zext i32 %v0 to i64 + %v2 = getelementptr inbounds float, ptr null, i64 %v1 + store float poison, ptr %v2, align 16 + %v3 = or i32 %v0, 3 + %v4 = zext i32 %v3 to i64 + %v5 = getelementptr inbounds float, ptr null, i64 %v4 + store float poison, ptr %v5, align 4 + %v6 = add nuw nsw i32 %v0, 4 + %v7 = icmp ult i32 %v3, 63 + %v8 = select i1 %v7, i1 true, i1 false + %v9 = select i1 %v7, i32 %v6, i32 0 + br i1 %v8, label %b1, label %b2, !prof !0 + +b2: + ret void +} + +attributes #0 = { "target-features"="+hvxv69,+hvx-length128b,+hvx-qfloat,-hvx-ieee-fp" } + +!0 = !{!"branch_weights", i32 -2147481600, i32 2048} -- 2.7.4