summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/RISCV
diff options
context:
space:
mode:
authorAlex Bradbury <asb@lowrisc.org>2019-01-22 12:11:53 +0000
committerAlex Bradbury <asb@lowrisc.org>2019-01-22 12:11:53 +0000
commitcd26560e46c2a2a50dbc79775b9a8bba03990945 (patch)
tree6e0abce281e4ba6bc1fa626ea49d8f263b19ffc7 /llvm/test/CodeGen/RISCV
parentfeb475f4cf283e78e7e3979a20bb5337bce6d889 (diff)
downloadbcm5719-llvm-cd26560e46c2a2a50dbc79775b9a8bba03990945.tar.gz
bcm5719-llvm-cd26560e46c2a2a50dbc79775b9a8bba03990945.zip
[RISCV] Quick fix for PR40333
Avoid the infinite loop caused by the target DAG combine converting ANYEXT to SIGNEXT and the target-independent DAG combine logic converting back to ANYEXT. Do this by not adding the new node to the worklist. Committing directly as this definitely doesn't make the problem any worse, and I intend to follow-up with a patch that avoids this custom combiner logic altogether and just lowers the i32 operations to a target-specific SelectionDAG node. This should be easier to reason about and improve codegen quality in some cases (though may miss out on some later DAG combines). llvm-svn: 351806
Diffstat (limited to 'llvm/test/CodeGen/RISCV')
-rw-r--r--llvm/test/CodeGen/RISCV/pr40333.ll27
1 files changed, 27 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/RISCV/pr40333.ll b/llvm/test/CodeGen/RISCV/pr40333.ll
new file mode 100644
index 00000000000..3f7ae8da3a2
--- /dev/null
+++ b/llvm/test/CodeGen/RISCV/pr40333.ll
@@ -0,0 +1,27 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
+; RUN: | FileCheck -check-prefix=RV64I %s
+
+; This test case is significantly simplified from the submitted .ll but
+; demonstrates the same issue. At the time of this problem report, an infinite
+; loop would be created in DAGCombine, converting ANY_EXTEND to SIGN_EXTEND
+; and back again.
+
+; TODO: This test case is also an example of where it would be cheaper to
+; select SRLW, but the current lowering strategy fails to do so.
+
+define signext i8 @foo(i32 %a, i32 %b) nounwind {
+; RV64I-LABEL: foo:
+; RV64I: # %bb.0:
+; RV64I-NEXT: slli a1, a1, 32
+; RV64I-NEXT: srli a1, a1, 32
+; RV64I-NEXT: slli a0, a0, 32
+; RV64I-NEXT: srli a0, a0, 32
+; RV64I-NEXT: srl a0, a0, a1
+; RV64I-NEXT: slli a0, a0, 56
+; RV64I-NEXT: srai a0, a0, 56
+; RV64I-NEXT: ret
+ %1 = lshr i32 %a, %b
+ %2 = trunc i32 %1 to i8
+ ret i8 %2
+}
OpenPOWER on IntegriCloud