[llvm] [JumpThreading] Do not unfold select if block has address taken and used (PR #135106)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 23 06:59:13 PDT 2025
================
@@ -665,6 +665,52 @@ if.end:
ret i32 %v1
}
+; Do not unfold select when parent block address is taken and used
+define i32 @ba_unfold(i1 %cond, i32 %arg) {
+; CHECK-LABEL: @ba_unfold(
+; CHECK: B4:
+; CHECK-NEXT: [[P:%.*]] = phi i1 [ true, [[B1:%.*]] ], [ [[COND_NOT:%.*]], [[LOOPEXIT:%.*]] ]
+; CHECK-NEXT: [[OFFSET:%.*]] = select i1 [[P]], i64 8, i64 16
+; CHECK-NEXT: [[ADDR_I:%.*]] = add i64 [[OFFSET]], ptrtoint (ptr blockaddress(@ba_unfold, %B4) to i64)
+;
+entry:
+ br label %B1
+
+B1:
+ br i1 %cond, label %B2, label %B4
+
+B2:
+ br label %while.body
+
+B3:
+ %new_i = add nuw nsw i32 1, %i
+ %exitcond = icmp eq i32 %new_i, 5
+ br i1 %exitcond, label %loopexit, label %while.body
+
+while.body:
+ %i = phi i32 [ 0, %B2 ], [ %new_i, %B3 ]
+ %xor = xor i32 %i, 16
+ %cmp = icmp eq i32 %xor, %arg
+ br i1 %cmp, label %B3, label %loopexit
+
+loopexit:
+ %cond.not = xor i1 %cmp, true
+ br label %B4
+
+B4:
+ %p = phi i1 [true, %B1], [ %cond.not, %loopexit ]
+ %offset = select i1 %p, i64 8, i64 16
+ %addr_i = add i64 %offset, ptrtoint (ptr blockaddress(@ba_unfold, %B4) to i64)
----------------
nikic wrote:
Do you have a reproducer that is not UB? This is jumping to a block that is not listed in the indirectbr target list.
https://github.com/llvm/llvm-project/pull/135106
More information about the llvm-commits
mailing list