[llvm] [SeparateConstOffsetFromGEP] Decompose constant xor operand if possible (PR #135788)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Thu May 22 03:00:29 PDT 2025
================
@@ -0,0 +1,154 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt -mtriple=amdgcn-amd-amdhsa -passes=separate-const-offset-from-gep \
+; RUN: -S < %s | FileCheck %s
+
+
+; Test a simple case of xor to or disjoint transformation
+define void @test_basic_transformation(ptr %ptr, i64 %input) {
+; CHECK-LABEL: define void @test_basic_transformation(
+; CHECK-SAME: ptr [[PTR:%.*]], i64 [[INPUT:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[BASE:%.*]] = and i64 [[INPUT]], -8192
+; CHECK-NEXT: [[ADDR1:%.*]] = xor i64 [[BASE]], 32
+; CHECK-NEXT: [[ADDR2_OR_DISJOINT:%.*]] = or disjoint i64 [[ADDR1]], 2048
+; CHECK-NEXT: [[ADDR3_OR_DISJOINT:%.*]] = or disjoint i64 [[ADDR1]], 4096
+; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i8, ptr [[PTR]], i64 [[ADDR1]]
+; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i8, ptr [[PTR]], i64 [[ADDR2_OR_DISJOINT]]
+; CHECK-NEXT: [[GEP3:%.*]] = getelementptr i8, ptr [[PTR]], i64 [[ADDR3_OR_DISJOINT]]
+; CHECK-NEXT: [[VAL1:%.*]] = load half, ptr [[GEP1]], align 2
+; CHECK-NEXT: [[VAL2:%.*]] = load half, ptr [[GEP2]], align 2
+; CHECK-NEXT: [[VAL3:%.*]] = load half, ptr [[GEP3]], align 2
+; CHECK-NEXT: ret void
+;
+entry:
+ %base = and i64 %input, -8192 ; Clear low bits
+ %addr1 = xor i64 %base, 32
+ %addr2 = xor i64 %base, 2080
+ %addr3 = xor i64 %base, 4128
+ %gep1 = getelementptr i8, ptr %ptr, i64 %addr1
+ %gep2 = getelementptr i8, ptr %ptr, i64 %addr2
+ %gep3 = getelementptr i8, ptr %ptr, i64 %addr3
+ %val1 = load half, ptr %gep1
+ %val2 = load half, ptr %gep2
+ %val3 = load half, ptr %gep3
+ ret void
----------------
arsenm wrote:
Fix this to not be dead code
https://github.com/llvm/llvm-project/pull/135788
More information about the llvm-commits
mailing list