aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp
diff options
context:
space:
mode:
authorAlex Bradbury <asb@lowrisc.org>2018-12-01 05:00:00 +0000
committerAlex Bradbury <asb@lowrisc.org>2018-12-01 05:00:00 +0000
commit757d296222ae1fa1baa9ca4a0379fab6ace2a612 (patch)
tree06ef8b3dfeb5f40915e5ee6ec2059ea38c1d7511 /llvm/lib/Analysis/ModuleSummaryAnalysis.cpp
parent23b123f6759a6907c59e4a129c7dba12e622bd4e (diff)
downloadllvm-757d296222ae1fa1baa9ca4a0379fab6ace2a612.zip
llvm-757d296222ae1fa1baa9ca4a0379fab6ace2a612.tar.gz
llvm-757d296222ae1fa1baa9ca4a0379fab6ace2a612.tar.bz2
[RISCV] Remove RV64I SLLW/SRLW/SRAW patterns and add new test cases
As noted by Eli Friedman <https://reviews.llvm.org/D52977?id=168629#1315291>, the RV64I shift patterns for SLLW/SRLW/SRAW make some incorrect assumptions. SRAW assumed that (sext_inreg foo, i32) could only be produced when sign-extended an i32. However, it can be produced by input such as: define i64 @tricky_ashr(i64 %a, i64 %b) { %1 = shl i64 %a, 32 %2 = ashr i64 %1, 32 %3 = ashr i64 %2, %b ret i64 %3 } It's important not to select sraw in the above case, because sraw only uses bits lower 5 bits from the shift, while a shift of 32-63 would be valid. Similarly, the patterns for srlw assumed (and foo, 0xffffffff) would only be produced when zero-extending a value that was originally i32 in LLVM IR. This is obviously incorrect. This patch removes the SLLW/SRLW/SRAW shift patterns for the time being and adds test cases that would demonstrate a miscompile if the incorrect patterns were re-added. llvm-svn: 348067
Diffstat (limited to 'llvm/lib/Analysis/ModuleSummaryAnalysis.cpp')
0 files changed, 0 insertions, 0 deletions