[llvm-branch-commits] [InstCombine] Don't look at ConstantData users (PR #103302)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Aug 13 08:59:24 PDT 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-transforms

Author: Alexis Engelke (aengelke)

<details>
<summary>Changes</summary>

When looking at PHI operand for combining, only look at instructions and
arguments. The loop later iteraters over Arg's users, which is not
useful if Arg is a constant -- it's users are not meaningful and might
be in different functions, which causes problems for the dominates()
query.


---

Patch is 22.42 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/103302.diff


2 Files Affected:

- (modified) llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp (+4) 
- (added) llvm/test/Transforms/InstCombine/phi-int-users.ll (+576) 


``````````diff
diff --git a/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp b/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp
index 86411320ab2487..bcff9a72b65724 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp
@@ -143,6 +143,10 @@ bool InstCombinerImpl::foldIntegerTypedPHI(PHINode &PN) {
     BasicBlock *BB = std::get<0>(Incoming);
     Value *Arg = std::get<1>(Incoming);
 
+    // Arg could be a constant, constant expr, etc., which we don't cover here.
+    if (!isa<Instruction>(Arg) && !isa<Argument>(Arg))
+      return false;
+
     // First look backward:
     if (auto *PI = dyn_cast<PtrToIntInst>(Arg)) {
       AvailablePtrVals.emplace_back(PI->getOperand(0));
diff --git a/llvm/test/Transforms/InstCombine/phi-int-users.ll b/llvm/test/Transforms/InstCombine/phi-int-users.ll
new file mode 100644
index 00000000000000..ce81c5d7e36267
--- /dev/null
+++ b/llvm/test/Transforms/InstCombine/phi-int-users.ll
@@ -0,0 +1,576 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt -mtriple=arm64 -passes='inline,function(sroa<modify-cfg>,jump-threading,instcombine)' -S < %s | FileCheck %s
+
+; Verify that instcombine doesn't look at users of Constant in different
+; functions for dominates() queries.
+
+%struct.widget = type { %struct.baz, i8, [7 x i8] }
+%struct.baz = type { %struct.snork }
+%struct.snork = type { [8 x i8] }
+
+define void @spam(ptr %arg) {
+; CHECK-LABEL: define void @spam(
+; CHECK-SAME: ptr [[ARG:%.*]]) personality ptr null {
+; CHECK-NEXT:  [[BB:.*:]]
+; CHECK-NEXT:    [[LOAD_I:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD_I]], label %[[BB2_I:.*]], label %[[BB3_I:.*]]
+; CHECK:       [[BB2_I]]:
+; CHECK-NEXT:    store i64 1, ptr [[ARG]], align 8
+; CHECK-NEXT:    br label %[[BARNEY_EXIT:.*]]
+; CHECK:       [[BB3_I]]:
+; CHECK-NEXT:    [[LOAD_I_I:%.*]] = load volatile i32, ptr null, align 4
+; CHECK-NEXT:    [[ICMP_I_I:%.*]] = icmp eq i32 [[LOAD_I_I]], 0
+; CHECK-NEXT:    br i1 [[ICMP_I_I]], label %[[BB2_I_I:.*]], label %[[BB3_I_I:.*]]
+; CHECK:       [[BB2_I_I]]:
+; CHECK-NEXT:    br label %[[BB1_I:.*]]
+; CHECK:       [[BB1_I]]:
+; CHECK-NEXT:    [[LOAD_I_I_I:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD_I_I_I]], label %[[SPAM_EXIT_I:.*]], label %[[BB3_I_I_I:.*]]
+; CHECK:       [[BB3_I_I_I]]:
+; CHECK-NEXT:    call void @zot.4()
+; CHECK-NEXT:    br label %[[SPAM_EXIT_I]]
+; CHECK:       [[SPAM_EXIT_I]]:
+; CHECK-NEXT:    [[ALLOCA_SROA_0_1_I:%.*]] = phi i64 [ 0, %[[BB3_I_I_I]] ], [ 1, %[[BB1_I]] ]
+; CHECK-NEXT:    [[TMP0:%.*]] = inttoptr i64 [[ALLOCA_SROA_0_1_I]] to ptr
+; CHECK-NEXT:    store i32 0, ptr [[TMP0]], align 4
+; CHECK-NEXT:    br label %[[BB1_I]]
+; CHECK:       [[EGGS_EXIT:.*:]]
+; CHECK-NEXT:    br label %[[BARNEY_EXIT]]
+; CHECK:       [[BB3_I_I]]:
+; CHECK-NEXT:    [[LOAD_I_I1:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD_I_I1]], label %[[QUUX_EXIT:.*]], label %[[BB3_I_I2:.*]]
+; CHECK:       [[BB3_I_I2]]:
+; CHECK-NEXT:    call void @snork()
+; CHECK-NEXT:    unreachable
+; CHECK:       [[QUUX_EXIT]]:
+; CHECK-NEXT:    store ptr poison, ptr null, align 8
+; CHECK-NEXT:    br label %[[BARNEY_EXIT]]
+; CHECK:       [[BARNEY_EXIT]]:
+; CHECK-NEXT:    ret void
+;
+bb:
+  call void @barney(ptr %arg)
+  ret void
+}
+
+define ptr @zot(ptr %arg) {
+; CHECK-LABEL: define ptr @zot(
+; CHECK-SAME: ptr [[ARG:%.*]]) personality ptr null {
+; CHECK-NEXT:  [[BB:.*:]]
+; CHECK-NEXT:    [[LOAD_I_I_I_I:%.*]] = load ptr, ptr [[ARG]], align 8
+; CHECK-NEXT:    store ptr null, ptr [[ARG]], align 8
+; CHECK-NEXT:    store i32 0, ptr [[LOAD_I_I_I_I]], align 4
+; CHECK-NEXT:    ret ptr null
+;
+bb:
+  %call = call ptr @ham.8(ptr %arg)
+  ret ptr null
+}
+
+define void @wombat() personality ptr null {
+; CHECK-LABEL: define void @wombat() personality ptr null {
+; CHECK-NEXT:  [[BB:.*:]]
+; CHECK-NEXT:    call void @snork()
+; CHECK-NEXT:    unreachable
+;
+bb:
+  call void @snork()
+  unreachable
+}
+
+define ptr @wombat.1(ptr %arg) {
+; CHECK-LABEL: define ptr @wombat.1(
+; CHECK-SAME: ptr [[ARG:%.*]]) {
+; CHECK-NEXT:  [[BB:.*:]]
+; CHECK-NEXT:    store i64 1, ptr [[ARG]], align 8
+; CHECK-NEXT:    ret ptr null
+;
+bb:
+  %call = call ptr @foo.9(ptr %arg)
+  ret ptr null
+}
+
+define void @quux() personality ptr null {
+; CHECK-LABEL: define void @quux() personality ptr null {
+; CHECK-NEXT:  [[BB:.*:]]
+; CHECK-NEXT:    [[LOAD_I:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD_I]], label %[[WIBBLE_EXIT:.*]], label %[[BB3_I:.*]]
+; CHECK:       [[BB3_I]]:
+; CHECK-NEXT:    call void @snork()
+; CHECK-NEXT:    unreachable
+; CHECK:       [[WIBBLE_EXIT]]:
+; CHECK-NEXT:    store ptr poison, ptr null, align 8
+; CHECK-NEXT:    ret void
+;
+bb:
+  call void @wobble()
+  ret void
+}
+
+define void @wobble() personality ptr null {
+; CHECK-LABEL: define void @wobble() personality ptr null {
+; CHECK-NEXT:  [[BB:.*:]]
+; CHECK-NEXT:    [[LOAD_I_I:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD_I_I]], label %[[WOBBLE_2_EXIT:.*]], label %[[BB3_I_I:.*]]
+; CHECK:       [[BB3_I_I]]:
+; CHECK-NEXT:    call void @snork()
+; CHECK-NEXT:    unreachable
+; CHECK:       [[WOBBLE_2_EXIT]]:
+; CHECK-NEXT:    store ptr poison, ptr null, align 8
+; CHECK-NEXT:    ret void
+;
+bb:
+  call void @quux.3()
+  ret void
+}
+
+define void @eggs() personality ptr null {
+; CHECK-LABEL: define void @eggs() personality ptr null {
+; CHECK-NEXT:  [[BB:.*:]]
+; CHECK-NEXT:    br label %[[BB1:.*]]
+; CHECK:       [[BB1]]:
+; CHECK-NEXT:    [[LOAD_I_I:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD_I_I]], label %[[SPAM_EXIT:.*]], label %[[BB3_I_I:.*]]
+; CHECK:       [[BB3_I_I]]:
+; CHECK-NEXT:    call void @zot.4()
+; CHECK-NEXT:    br label %[[SPAM_EXIT]]
+; CHECK:       [[SPAM_EXIT]]:
+; CHECK-NEXT:    [[ALLOCA_SROA_0_1:%.*]] = phi i64 [ 0, %[[BB3_I_I]] ], [ 1, %[[BB1]] ]
+; CHECK-NEXT:    [[TMP0:%.*]] = inttoptr i64 [[ALLOCA_SROA_0_1]] to ptr
+; CHECK-NEXT:    store i32 0, ptr [[TMP0]], align 4
+; CHECK-NEXT:    br label %[[BB1]]
+;
+bb:
+  %alloca = alloca %struct.widget, align 8
+  br label %bb1
+
+bb1:                                              ; preds = %bb1, %bb
+  call void @spam(ptr %alloca)
+  %call = call ptr @zot(ptr %alloca)
+  br label %bb1
+}
+
+define void @wobble.2() personality ptr null {
+; CHECK-LABEL: define void @wobble.2() personality ptr null {
+; CHECK-NEXT:  [[BB:.*:]]
+; CHECK-NEXT:    [[LOAD_I:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD_I]], label %[[BB2_I:.*]], label %[[BB3_I:.*]]
+; CHECK:       [[BB2_I]]:
+; CHECK-NEXT:    store ptr poison, ptr null, align 8
+; CHECK-NEXT:    br label %[[WIBBLE_EXIT:.*]]
+; CHECK:       [[BB3_I]]:
+; CHECK-NEXT:    call void @snork()
+; CHECK-NEXT:    unreachable
+; CHECK:       [[FOO_EXIT:.*:]]
+; CHECK-NEXT:    br label %[[WIBBLE_EXIT]]
+; CHECK:       [[WIBBLE_EXIT]]:
+; CHECK-NEXT:    ret void
+;
+bb:
+  call void @wibble(ptr null)
+  ret void
+}
+
+define void @quux.3() personality ptr null {
+; CHECK-LABEL: define void @quux.3() personality ptr null {
+; CHECK-NEXT:  [[BB:.*:]]
+; CHECK-NEXT:    [[LOAD_I:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD_I]], label %[[BB2_I:.*]], label %[[BB3_I:.*]]
+; CHECK:       [[BB2_I]]:
+; CHECK-NEXT:    store ptr poison, ptr null, align 8
+; CHECK-NEXT:    br label %[[WIBBLE_EXIT:.*]]
+; CHECK:       [[BB3_I]]:
+; CHECK-NEXT:    call void @snork()
+; CHECK-NEXT:    unreachable
+; CHECK:       [[WOMBAT_EXIT:.*:]]
+; CHECK-NEXT:    br label %[[WIBBLE_EXIT]]
+; CHECK:       [[WIBBLE_EXIT]]:
+; CHECK-NEXT:    ret void
+;
+bb:
+  call void @wobble.2()
+  ret void
+}
+
+define void @zot.4() personality ptr null {
+; CHECK-LABEL: define void @zot.4() personality ptr null {
+; CHECK-NEXT:  [[BB:.*:]]
+; CHECK-NEXT:    [[LOAD_I:%.*]] = load volatile i32, ptr null, align 4
+; CHECK-NEXT:    [[ICMP_I:%.*]] = icmp eq i32 [[LOAD_I]], 0
+; CHECK-NEXT:    br i1 [[ICMP_I]], label %[[BB2_I:.*]], label %[[BB3_I:.*]]
+; CHECK:       [[BB2_I]]:
+; CHECK-NEXT:    br label %[[BB1_I:.*]]
+; CHECK:       [[BB1_I]]:
+; CHECK-NEXT:    [[LOAD_I_I_I:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD_I_I_I]], label %[[SPAM_EXIT_I:.*]], label %[[BB3_I_I_I:.*]]
+; CHECK:       [[BB3_I_I_I]]:
+; CHECK-NEXT:    call void @zot.4()
+; CHECK-NEXT:    br label %[[SPAM_EXIT_I]]
+; CHECK:       [[SPAM_EXIT_I]]:
+; CHECK-NEXT:    [[ALLOCA_I_SROA_0_1:%.*]] = phi i64 [ 0, %[[BB3_I_I_I]] ], [ 1, %[[BB1_I]] ]
+; CHECK-NEXT:    [[TMP0:%.*]] = inttoptr i64 [[ALLOCA_I_SROA_0_1]] to ptr
+; CHECK-NEXT:    store i32 0, ptr [[TMP0]], align 4
+; CHECK-NEXT:    br label %[[BB1_I]]
+; CHECK:       [[EGGS_EXIT:.*:]]
+; CHECK-NEXT:    br label %[[BLAM_EXIT:.*]]
+; CHECK:       [[BB3_I]]:
+; CHECK-NEXT:    [[LOAD_I_I:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD_I_I]], label %[[BB2_I_I:.*]], label %[[BB3_I_I:.*]]
+; CHECK:       [[BB2_I_I]]:
+; CHECK-NEXT:    store ptr poison, ptr null, align 8
+; CHECK-NEXT:    br label %[[BLAM_EXIT]]
+; CHECK:       [[BB3_I_I]]:
+; CHECK-NEXT:    call void @snork()
+; CHECK-NEXT:    unreachable
+; CHECK:       [[WOMBAT_EXIT:.*:]]
+; CHECK-NEXT:    br label %[[BLAM_EXIT]]
+; CHECK:       [[BLAM_EXIT]]:
+; CHECK-NEXT:    ret void
+;
+bb:
+  call void @blam()
+  ret void
+}
+
+define void @blam() {
+; CHECK-LABEL: define void @blam() personality ptr null {
+; CHECK-NEXT:  [[BB:.*:]]
+; CHECK-NEXT:    [[LOAD:%.*]] = load volatile i32, ptr null, align 4
+; CHECK-NEXT:    [[ICMP:%.*]] = icmp eq i32 [[LOAD]], 0
+; CHECK-NEXT:    br i1 [[ICMP]], label %[[BB2:.*]], label %[[BB3:.*]]
+; CHECK:       [[BB1:.*]]:
+; CHECK-NEXT:    ret void
+; CHECK:       [[BB2]]:
+; CHECK-NEXT:    br label %[[BB1_I:.*]]
+; CHECK:       [[BB1_I]]:
+; CHECK-NEXT:    [[LOAD_I_I:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD_I_I]], label %[[SPAM_EXIT:.*]], label %[[BB3_I_I:.*]]
+; CHECK:       [[BB3_I_I]]:
+; CHECK-NEXT:    [[LOAD_I_I_I:%.*]] = load volatile i32, ptr null, align 4
+; CHECK-NEXT:    [[ICMP_I_I_I:%.*]] = icmp eq i32 [[LOAD_I_I_I]], 0
+; CHECK-NEXT:    br i1 [[ICMP_I_I_I]], label %[[BB2_I_I_I:.*]], label %[[BB3_I_I_I:.*]]
+; CHECK:       [[BB2_I_I_I]]:
+; CHECK-NEXT:    br label %[[BB1_I1:.*]]
+; CHECK:       [[BB1_I1]]:
+; CHECK-NEXT:    [[LOAD_I_I_I2:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD_I_I_I2]], label %[[SPAM_EXIT_I:.*]], label %[[BB3_I_I_I3:.*]]
+; CHECK:       [[BB3_I_I_I3]]:
+; CHECK-NEXT:    call void @zot.4()
+; CHECK-NEXT:    br label %[[SPAM_EXIT_I]]
+; CHECK:       [[SPAM_EXIT_I]]:
+; CHECK-NEXT:    [[ALLOCA_SROA_0_1_I:%.*]] = phi i64 [ 0, %[[BB3_I_I_I3]] ], [ 1, %[[BB1_I1]] ]
+; CHECK-NEXT:    [[TMP0:%.*]] = inttoptr i64 [[ALLOCA_SROA_0_1_I]] to ptr
+; CHECK-NEXT:    store i32 0, ptr [[TMP0]], align 4
+; CHECK-NEXT:    br label %[[BB1_I1]]
+; CHECK:       [[EGGS_EXIT4:.*]]:
+; CHECK-NEXT:    br label %[[SPAM_EXIT]]
+; CHECK:       [[BB3_I_I_I]]:
+; CHECK-NEXT:    [[LOAD_I_I5:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD_I_I5]], label %[[QUUX_EXIT:.*]], label %[[BB3_I_I6:.*]]
+; CHECK:       [[BB3_I_I6]]:
+; CHECK-NEXT:    call void @snork()
+; CHECK-NEXT:    unreachable
+; CHECK:       [[QUUX_EXIT]]:
+; CHECK-NEXT:    store ptr poison, ptr null, align 8
+; CHECK-NEXT:    br label %[[SPAM_EXIT]]
+; CHECK:       [[SPAM_EXIT]]:
+; CHECK-NEXT:    [[ALLOCA_I_SROA_0_1:%.*]] = phi i64 [ 1, %[[BB1_I]] ], [ 0, %[[QUUX_EXIT]] ], [ 0, %[[EGGS_EXIT4]] ]
+; CHECK-NEXT:    [[TMP1:%.*]] = inttoptr i64 [[ALLOCA_I_SROA_0_1]] to ptr
+; CHECK-NEXT:    store i32 0, ptr [[TMP1]], align 4
+; CHECK-NEXT:    br label %[[BB1_I]]
+; CHECK:       [[EGGS_EXIT:.*:]]
+; CHECK-NEXT:    br label %[[BB1]]
+; CHECK:       [[BB3]]:
+; CHECK-NEXT:    [[LOAD_I_I7:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD_I_I7]], label %[[WOBBLE_2_EXIT:.*]], label %[[BB3_I_I8:.*]]
+; CHECK:       [[BB3_I_I8]]:
+; CHECK-NEXT:    call void @snork()
+; CHECK-NEXT:    unreachable
+; CHECK:       [[WOBBLE_2_EXIT]]:
+; CHECK-NEXT:    store ptr poison, ptr null, align 8
+; CHECK-NEXT:    br label %[[BB1]]
+;
+bb:
+  %load = load volatile i32, ptr null, align 4
+  %icmp = icmp eq i32 %load, 0
+  br i1 %icmp, label %bb2, label %bb3
+
+bb1:                                              ; preds = %bb3, %bb2
+  ret void
+
+bb2:                                              ; preds = %bb
+  call void @eggs()
+  br label %bb1
+
+bb3:                                              ; preds = %bb
+  call void @quux()
+  br label %bb1
+}
+
+define void @barney(ptr %arg) personality ptr null {
+; CHECK-LABEL: define void @barney(
+; CHECK-SAME: ptr [[ARG:%.*]]) personality ptr null {
+; CHECK-NEXT:  [[BB:.*:]]
+; CHECK-NEXT:    [[LOAD:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD]], label %[[BB2:.*]], label %[[BB3:.*]]
+; CHECK:       [[BB1:.*]]:
+; CHECK-NEXT:    ret void
+; CHECK:       [[BB2]]:
+; CHECK-NEXT:    store i64 1, ptr [[ARG]], align 8
+; CHECK-NEXT:    br label %[[BB1]]
+; CHECK:       [[BB3]]:
+; CHECK-NEXT:    [[LOAD_I:%.*]] = load volatile i32, ptr null, align 4
+; CHECK-NEXT:    [[ICMP_I:%.*]] = icmp eq i32 [[LOAD_I]], 0
+; CHECK-NEXT:    br i1 [[ICMP_I]], label %[[BB2_I:.*]], label %[[BB3_I:.*]]
+; CHECK:       [[BB2_I]]:
+; CHECK-NEXT:    br label %[[BB1_I_I:.*]]
+; CHECK:       [[BB1_I_I]]:
+; CHECK-NEXT:    [[LOAD_I_I_I:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD_I_I_I]], label %[[SPAM_EXIT_I:.*]], label %[[BB3_I_I_I:.*]]
+; CHECK:       [[BB3_I_I_I]]:
+; CHECK-NEXT:    [[LOAD_I_I_I_I:%.*]] = load volatile i32, ptr null, align 4
+; CHECK-NEXT:    [[ICMP_I_I_I_I:%.*]] = icmp eq i32 [[LOAD_I_I_I_I]], 0
+; CHECK-NEXT:    br i1 [[ICMP_I_I_I_I]], label %[[BB2_I_I_I_I:.*]], label %[[BB3_I_I_I_I:.*]]
+; CHECK:       [[BB2_I_I_I_I]]:
+; CHECK-NEXT:    br label %[[BB1_I1_I:.*]]
+; CHECK:       [[BB1_I1_I]]:
+; CHECK-NEXT:    [[LOAD_I_I_I2_I:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD_I_I_I2_I]], label %[[SPAM_EXIT_I_I:.*]], label %[[BB3_I_I_I3_I:.*]]
+; CHECK:       [[BB3_I_I_I3_I]]:
+; CHECK-NEXT:    call void @zot.4()
+; CHECK-NEXT:    br label %[[SPAM_EXIT_I_I]]
+; CHECK:       [[SPAM_EXIT_I_I]]:
+; CHECK-NEXT:    [[ALLOCA_SROA_0_1_I_I:%.*]] = phi i64 [ 0, %[[BB3_I_I_I3_I]] ], [ 1, %[[BB1_I1_I]] ]
+; CHECK-NEXT:    [[TMP0:%.*]] = inttoptr i64 [[ALLOCA_SROA_0_1_I_I]] to ptr
+; CHECK-NEXT:    store i32 0, ptr [[TMP0]], align 4
+; CHECK-NEXT:    br label %[[BB1_I1_I]]
+; CHECK:       [[BB3_I_I_I_I]]:
+; CHECK-NEXT:    [[LOAD_I_I5_I:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD_I_I5_I]], label %[[QUUX_EXIT_I:.*]], label %[[BB3_I_I6_I:.*]]
+; CHECK:       [[BB3_I_I6_I]]:
+; CHECK-NEXT:    call void @snork()
+; CHECK-NEXT:    unreachable
+; CHECK:       [[QUUX_EXIT_I]]:
+; CHECK-NEXT:    store ptr poison, ptr null, align 8
+; CHECK-NEXT:    br label %[[SPAM_EXIT_I]]
+; CHECK:       [[SPAM_EXIT_I]]:
+; CHECK-NEXT:    [[ALLOCA_I_SROA_0_1_I:%.*]] = phi i64 [ 1, %[[BB1_I_I]] ], [ 0, %[[QUUX_EXIT_I]] ]
+; CHECK-NEXT:    [[TMP1:%.*]] = inttoptr i64 [[ALLOCA_I_SROA_0_1_I]] to ptr
+; CHECK-NEXT:    store i32 0, ptr [[TMP1]], align 4
+; CHECK-NEXT:    br label %[[BB1_I_I]]
+; CHECK:       [[BB3_I]]:
+; CHECK-NEXT:    [[LOAD_I_I7_I:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD_I_I7_I]], label %[[BLAM_EXIT:.*]], label %[[BB3_I_I8_I:.*]]
+; CHECK:       [[BB3_I_I8_I]]:
+; CHECK-NEXT:    call void @snork()
+; CHECK-NEXT:    unreachable
+; CHECK:       [[BLAM_EXIT]]:
+; CHECK-NEXT:    store ptr poison, ptr null, align 8
+; CHECK-NEXT:    br label %[[BB1]]
+;
+bb:
+  %load = load volatile i1, ptr null, align 1
+  br i1 %load, label %bb2, label %bb3
+
+bb1:                                              ; preds = %bb3, %bb2
+  ret void
+
+bb2:                                              ; preds = %bb
+  %call = call ptr @wombat.1(ptr %arg)
+  br label %bb1
+
+bb3:                                              ; preds = %bb
+  call void @zot.4()
+  br label %bb1
+}
+
+define void @snork() personality ptr null {
+; CHECK-LABEL: define void @snork() personality ptr null {
+; CHECK-NEXT:  [[BB:.*:]]
+; CHECK-NEXT:    [[LOAD_I:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD_I]], label %[[BARNEY_EXIT:.*]], label %[[BB3_I:.*]]
+; CHECK:       [[BB3_I]]:
+; CHECK-NEXT:    [[LOAD_I1:%.*]] = load volatile i32, ptr null, align 4
+; CHECK-NEXT:    [[ICMP_I:%.*]] = icmp eq i32 [[LOAD_I1]], 0
+; CHECK-NEXT:    br i1 [[ICMP_I]], label %[[BB2_I3:.*]], label %[[BLAM_EXIT:.*]]
+; CHECK:       [[BB2_I3]]:
+; CHECK-NEXT:    br label %[[BB1_I_I:.*]]
+; CHECK:       [[BB1_I_I]]:
+; CHECK-NEXT:    [[LOAD_I_I_I:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD_I_I_I]], label %[[SPAM_EXIT_I:.*]], label %[[BB3_I_I_I:.*]]
+; CHECK:       [[BB3_I_I_I]]:
+; CHECK-NEXT:    [[LOAD_I_I_I_I:%.*]] = load volatile i32, ptr null, align 4
+; CHECK-NEXT:    [[ICMP_I_I_I_I:%.*]] = icmp eq i32 [[LOAD_I_I_I_I]], 0
+; CHECK-NEXT:    br i1 [[ICMP_I_I_I_I]], label %[[BB2_I_I_I_I:.*]], label %[[BB3_I_I_I_I:.*]]
+; CHECK:       [[BB2_I_I_I_I]]:
+; CHECK-NEXT:    br label %[[BB1_I:.*]]
+; CHECK:       [[BB1_I]]:
+; CHECK-NEXT:    [[LOAD_I_I_I6:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD_I_I_I6]], label %[[SPAM_EXIT_I8:.*]], label %[[BB3_I_I_I7:.*]]
+; CHECK:       [[BB3_I_I_I7]]:
+; CHECK-NEXT:    call void @zot.4()
+; CHECK-NEXT:    br label %[[SPAM_EXIT_I8]]
+; CHECK:       [[SPAM_EXIT_I8]]:
+; CHECK-NEXT:    [[ALLOCA_I_SROA_0_1:%.*]] = phi i64 [ 0, %[[BB3_I_I_I7]] ], [ 1, %[[BB1_I]] ]
+; CHECK-NEXT:    [[TMP0:%.*]] = inttoptr i64 [[ALLOCA_I_SROA_0_1]] to ptr
+; CHECK-NEXT:    store i32 0, ptr [[TMP0]], align 4
+; CHECK-NEXT:    br label %[[BB1_I]]
+; CHECK:       [[EGGS_EXIT:.*]]:
+; CHECK-NEXT:    br label %[[SPAM_EXIT_I]]
+; CHECK:       [[BB3_I_I_I_I]]:
+; CHECK-NEXT:    [[LOAD_I_I4:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD_I_I4]], label %[[QUUX_EXIT:.*]], label %[[BB3_I_I5:.*]]
+; CHECK:       [[BB3_I_I5]]:
+; CHECK-NEXT:    call void @snork()
+; CHECK-NEXT:    unreachable
+; CHECK:       [[QUUX_EXIT]]:
+; CHECK-NEXT:    store ptr poison, ptr null, align 8
+; CHECK-NEXT:    br label %[[SPAM_EXIT_I]]
+; CHECK:       [[SPAM_EXIT_I]]:
+; CHECK-NEXT:    [[ALLOCA_I_I_SROA_0_1:%.*]] = phi i64 [ 1, %[[BB1_I_I]] ], [ 0, %[[QUUX_EXIT]] ], [ 0, %[[EGGS_EXIT]] ]
+; CHECK-NEXT:    [[TMP1:%.*]] = inttoptr i64 [[ALLOCA_I_I_SROA_0_1]] to ptr
+; CHECK-NEXT:    store i32 0, ptr [[TMP1]], align 4
+; CHECK-NEXT:    br label %[[BB1_I_I]]
+; CHECK:       [[BLAM_EXIT]]:
+; CHECK-NEXT:    [[LOAD_I_I:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD_I_I]], label %[[BARNEY_EXIT]], label %[[BB3_I_I:.*]]
+; CHECK:       [[BB3_I_I]]:
+; CHECK-NEXT:    call void @snork()
+; CHECK-NEXT:    unreachable
+; CHECK:       [[BARNEY_EXIT]]:
+; CHECK-NEXT:    store ptr poison, ptr null, align 8
+; CHECK-NEXT:    ret void
+;
+bb:
+  call void @barney(ptr null)
+  ret void
+}
+
+define void @wibble(ptr %arg) personality ptr null {
+; CHECK-LABEL: define void @wibble(
+; CHECK-SAME: ptr [[ARG:%.*]]) personality ptr null {
+; CHECK-NEXT:  [[BB:.*:]]
+; CHECK-NEXT:    [[LOAD:%.*]] = load volatile i1, ptr null, align 1
+; CHECK-NEXT:    br i1 [[LOAD]], label %[[BB2:.*]], label %[[BB3:.*]]
+; CHECK:       [[BB1:.*]]:
+; CHECK-NEXT:    ret void
+; CHECK:       [[BB2]]:
+; CHECK-NEXT:    store ptr null, ptr [[ARG]], align 8
+; CHECK-NEXT:    br label %[[BB1]]
+; CHECK:       [[BB3]]:
+; CHECK-NEXT:    call void @snork()
+; CHECK-NEXT:    unreachable
+; CHECK:       [[WOMBAT_EXIT:.*:]]
+; CHECK-NEXT:    br label %[[BB1]]
+;
+bb:
+  %load = load volatile i1, ptr null, align 1
+  br i1 %load, label %bb2, label %bb3
+
+bb1:                                              ; preds = %bb3, %bb2
+  ret void
+
+bb2:                                              ; preds = %bb
+  %call = call i64 @zot.5(i64 0)
+  %inttoptr = inttoptr i64 %call to ptr
+  store ptr %inttoptr, ptr %arg, align 8
+  br label %bb1
+
+bb3:                                              ; preds = %bb
+  %call4 = call i64 @foo()
+ ...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/103302


More information about the llvm-branch-commits mailing list