]> granicus.if.org Git - llvm/commitdiff
[Hexagon] Use correct offset when extracting from the high word
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>
Wed, 8 Mar 2017 15:46:28 +0000 (15:46 +0000)
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>
Wed, 8 Mar 2017 15:46:28 +0000 (15:46 +0000)
When extracting a bitfield from the high register in a register pair,
the final offset should be relative to the high register (for 32-bit
extracts).

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

lib/Target/Hexagon/HexagonBitSimplify.cpp
test/CodeGen/Hexagon/bit-extract-off.ll [new file with mode: 0644]

index 5fef6083552b8d30bf2b76f94cbf36e42836e119..41d4f6c17e899d5c3a7e46e01cce3221a29cf2e6 100644 (file)
@@ -2480,6 +2480,7 @@ bool BitSimplification::simplifyExtractLow(MachineInstr *MI,
       continue;
     if (RW != SW)
       SR = (Off/RW == 0) ? Hexagon::isub_lo : Hexagon::isub_hi;
+    Off = Off % RW;
 
     if (!validateReg({R,SR}, ExtOpc, 1))
       continue;
diff --git a/test/CodeGen/Hexagon/bit-extract-off.ll b/test/CodeGen/Hexagon/bit-extract-off.ll
new file mode 100644 (file)
index 0000000..183435a
--- /dev/null
@@ -0,0 +1,23 @@
+; RUN: llc -march=hexagon < %s | FileCheck %s
+; CHECK: extractu(r1,#31,#0)
+
+; In the IR this was an extract of 31 bits starting at position 32 in r1:0.
+; When mapping it to an extract from r1, the offset was not reset to 0, and
+; we had "extractu(r1,#31,#32)".
+
+target triple = "hexagon"
+
+define hidden i32 @fred([101 x double]* %a0, i32 %a1, i32* %a2, i32* %a3) #0 {
+b4:
+  br label %b5
+
+b5:                                               ; preds = %b5, %b4
+  %v6 = call double @fabs(double undef) #1
+  store double %v6, double* undef, align 8
+  br label %b5
+}
+
+declare double @fabs(double) #1
+
+attributes #0 = { nounwind "target-cpu"="hexagonv60" "target-features"="-hvx,-hvx-double,-long-calls" }
+attributes #1 = { nounwind readnone "target-cpu"="hexagonv60" "target-features"="-hvx,-hvx-double,-long-calls" }