summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/SeparateConstOffsetFromGEP
diff options
context:
space:
mode:
authorJingyue Wu <jingyue@google.com>2014-05-27 18:00:00 +0000
committerJingyue Wu <jingyue@google.com>2014-05-27 18:00:00 +0000
commit80a738dc621e59d96ca7ffe11754afde700156f9 (patch)
tree4dcaeca76882a1e37bd4f18297ce3ba5e1c89e48 /llvm/test/Transforms/SeparateConstOffsetFromGEP
parent66c30774700bbfb1ea2bfd546494a90a1894c601 (diff)
downloadbcm5719-llvm-80a738dc621e59d96ca7ffe11754afde700156f9.tar.gz
bcm5719-llvm-80a738dc621e59d96ca7ffe11754afde700156f9.zip
Distribute sext/zext to the operands of and/or/xor
This is an enhancement to SeparateConstOffsetFromGEP. With this patch, we can extract a constant offset from "s/zext and/or/xor A, B". Added a new test @ext_or to verify this enhancement. Refactoring the code, I also extracted some common logic to function Distributable. llvm-svn: 209670
Diffstat (limited to 'llvm/test/Transforms/SeparateConstOffsetFromGEP')
-rw-r--r--llvm/test/Transforms/SeparateConstOffsetFromGEP/NVPTX/split-gep.ll19
1 files changed, 19 insertions, 0 deletions
diff --git a/llvm/test/Transforms/SeparateConstOffsetFromGEP/NVPTX/split-gep.ll b/llvm/test/Transforms/SeparateConstOffsetFromGEP/NVPTX/split-gep.ll
index 320af5fd613..42136d2b657 100644
--- a/llvm/test/Transforms/SeparateConstOffsetFromGEP/NVPTX/split-gep.ll
+++ b/llvm/test/Transforms/SeparateConstOffsetFromGEP/NVPTX/split-gep.ll
@@ -57,6 +57,25 @@ define float* @ext_add_no_overflow(i64 %a, i32 %b, i64 %c, i32 %d) {
; CHECK: [[BASE_PTR:%[0-9]+]] = getelementptr [32 x [32 x float]]* @float_2d_array, i64 0, i64 %{{[0-9]+}}, i64 %{{[0-9]+}}
; CHECK: getelementptr float* [[BASE_PTR]], i64 33
+; Similar to @ext_add_no_overflow, we should be able to trace into sext/zext if
+; its operand is an "or" instruction.
+define float* @ext_or(i64 %a, i32 %b) {
+entry:
+ %b1 = shl i32 %b, 2
+ %b2 = or i32 %b1, 1
+ %b3 = or i32 %b1, 2
+ %b2.ext = sext i32 %b2 to i64
+ %b3.ext = sext i32 %b3 to i64
+ %i = add i64 %a, %b2.ext
+ %j = add i64 %a, %b3.ext
+ %p = getelementptr inbounds [32 x [32 x float]]* @float_2d_array, i64 0, i64 %i, i64 %j
+ ret float* %p
+}
+; CHECK-LABEL: @ext_or
+; CHECK: [[BASE_PTR:%[0-9]+]] = getelementptr [32 x [32 x float]]* @float_2d_array, i64 0, i64 %{{[0-9]+}}, i64 %{{[0-9]+}}
+; CHECK: [[BASE_INT:%[0-9]+]] = ptrtoint float* [[BASE_PTR]] to i64
+; CHECK: add i64 [[BASE_INT]], 136
+
; We should treat "or" with no common bits (%k) as "add", and leave "or" with
; potentially common bits (%l) as is.
define float* @or(i64 %i) {
OpenPOWER on IntegriCloud