[llvm] [SimplifyCFG] Allow merging invoke's with different attrs (PR #111713)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 9 09:52:21 PDT 2024
https://github.com/goldsteinn created https://github.com/llvm/llvm-project/pull/111713
Same logic as other callsites, if the attributes are intersectable, we merge.
>From 3f7f81281ba4c13b97c71f4a2833c321ba6ee5c8 Mon Sep 17 00:00:00 2001
From: Noah Goldstein <goldstein.w.n at gmail.com>
Date: Wed, 9 Oct 2024 11:26:59 -0500
Subject: [PATCH 1/2] [SimplifyCFG] Add/update tests for merging invokes with
different attrs; NFC
---
.../merge-compatible-invokes-of-landingpad.ll | 292 ++++++++++++++----
1 file changed, 237 insertions(+), 55 deletions(-)
diff --git a/llvm/test/Transforms/SimplifyCFG/X86/merge-compatible-invokes-of-landingpad.ll b/llvm/test/Transforms/SimplifyCFG/X86/merge-compatible-invokes-of-landingpad.ll
index f7f65ecac896a2..24e4a41ec824b6 100644
--- a/llvm/test/Transforms/SimplifyCFG/X86/merge-compatible-invokes-of-landingpad.ll
+++ b/llvm/test/Transforms/SimplifyCFG/X86/merge-compatible-invokes-of-landingpad.ll
@@ -1,4 +1,4 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes --check-globals
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals
; RUN: opt < %s -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -sink-common-insts -S | FileCheck %s
; RUN: opt < %s -passes='simplifycfg<sink-common-insts>' -S | FileCheck %s
@@ -7,7 +7,7 @@ target triple = "x86_64-unknown-linux-gnu"
; Simple test, nothing interesting happens here.
define void @t0_noop() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t0_noop(
+; CHECK-LABEL: define {{[^@]+}}@t0_noop() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
@@ -47,7 +47,7 @@ if.end:
; More interesting test, here we can merge the invokes.
define void @t1_mergeable_invoke() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t1_mergeable_invoke(
+; CHECK-LABEL: define {{[^@]+}}@t1_mergeable_invoke() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE:%.*]]
@@ -100,7 +100,7 @@ if.end:
; normal block is shared, but it is unreachable, so we are fine.
define void @t2_shared_normal_dest() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t2_shared_normal_dest(
+; CHECK-LABEL: define {{[^@]+}}@t2_shared_normal_dest() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE:%.*]]
@@ -150,7 +150,7 @@ if.end:
; shared normal destination is not unreachable.
define void @t3_shared_identical_normal_dest() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t3_shared_identical_normal_dest(
+; CHECK-LABEL: define {{[^@]+}}@t3_shared_identical_normal_dest() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE:%.*]]
@@ -202,7 +202,7 @@ if.end:
; normal destinations are not unreachable and not shared and can not be merged.
define void @t4_normal_dests() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t4_normal_dests(
+; CHECK-LABEL: define {{[^@]+}}@t4_normal_dests() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN0:%.*]], label [[IF_ELSE:%.*]]
@@ -264,7 +264,7 @@ if.end:
; Invokes lead to different landing pads.
define void @t5_different_landingpads() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t5_different_landingpads(
+; CHECK-LABEL: define {{[^@]+}}@t5_different_landingpads() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN0:%.*]], label [[IF_ELSE:%.*]]
@@ -335,7 +335,7 @@ if.end:
; The invoked functions are different
define void @t6_different_invokes() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t6_different_invokes(
+; CHECK-LABEL: define {{[^@]+}}@t6_different_invokes() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN0:%.*]], label [[IF_ELSE:%.*]]
@@ -393,7 +393,7 @@ if.end:
; Merging of this invoke is disallowed
define void @t7_nomerge0() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t7_nomerge0(
+; CHECK-LABEL: define {{[^@]+}}@t7_nomerge0() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN0:%.*]], label [[IF_ELSE:%.*]]
@@ -449,7 +449,7 @@ if.end:
ret void
}
define void @t8_nomerge1() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t8_nomerge1(
+; CHECK-LABEL: define {{[^@]+}}@t8_nomerge1() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN0:%.*]], label [[IF_ELSE:%.*]]
@@ -505,7 +505,7 @@ if.end:
ret void
}
define void @t9_nomerge2() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t9_nomerge2(
+; CHECK-LABEL: define {{[^@]+}}@t9_nomerge2() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN0:%.*]], label [[IF_ELSE:%.*]]
@@ -563,7 +563,7 @@ if.end:
; Just don't deal with inlineasm.
define void @t10_inlineasm() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t10_inlineasm(
+; CHECK-LABEL: define {{[^@]+}}@t10_inlineasm() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN0:%.*]], label [[IF_ELSE:%.*]]
@@ -621,7 +621,7 @@ if.end:
; landingpad has PHI nodes, and the incoming values are incompatible.
define void @t11_phi_in_landingpad_incompatible_incoming_values() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t11_phi_in_landingpad_incompatible_incoming_values(
+; CHECK-LABEL: define {{[^@]+}}@t11_phi_in_landingpad_incompatible_incoming_values() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN0:%.*]], label [[IF_ELSE:%.*]]
@@ -683,7 +683,7 @@ if.end:
; It is okay for the invoke to take arguments
define void @t12_arguments_are_fine() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t12_arguments_are_fine(
+; CHECK-LABEL: define {{[^@]+}}@t12_arguments_are_fine() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE:%.*]]
@@ -736,7 +736,7 @@ if.end:
; It is okay for the invoke to take different arguments
define void @t13_different_arguments_are_fine() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t13_different_arguments_are_fine(
+; CHECK-LABEL: define {{[^@]+}}@t13_different_arguments_are_fine() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE:%.*]]
@@ -790,7 +790,7 @@ if.end:
; There can be more than two invokes in a set
define void @t14_three_invokes() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t14_three_invokes(
+; CHECK-LABEL: define {{[^@]+}}@t14_three_invokes() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN2_INVOKE:%.*]], label [[IF_ELSE0:%.*]]
@@ -856,7 +856,7 @@ if.end:
; If not all invokes of landingpad are compatible then we still merge compatible ones.
define void @t15_three_invokes_only_two_compatible() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t15_three_invokes_only_two_compatible(
+; CHECK-LABEL: define {{[^@]+}}@t15_three_invokes_only_two_compatible() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE0:%.*]]
@@ -927,7 +927,7 @@ if.end:
; We succeed in merging invokes into two sets
define void @t16_four_invokes_forming_two_sets() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t16_four_invokes_forming_two_sets(
+; CHECK-LABEL: define {{[^@]+}}@t16_four_invokes_forming_two_sets() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE0:%.*]]
@@ -1009,9 +1009,8 @@ if.end:
ret void
}
-; Attributes must match
-define void @t17_mismatched_attrs_prevent_merge() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t17_mismatched_attrs_prevent_merge(
+define void @t17_mismatched_attrs_okay_merge() personality ptr @__gxx_personality_v0 {
+; CHECK-LABEL: define {{[^@]+}}@t17_mismatched_attrs_okay_merge() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN0:%.*]], label [[IF_ELSE:%.*]]
@@ -1067,9 +1066,182 @@ if.end:
ret void
}
+define void @t17_mismatched_attrs_okay_merge_intersect() personality ptr @__gxx_personality_v0 {
+; CHECK-LABEL: define {{[^@]+}}@t17_mismatched_attrs_okay_merge_intersect() personality ptr @__gxx_personality_v0 {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
+; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN0:%.*]], label [[IF_ELSE:%.*]]
+; CHECK: if.then0:
+; CHECK-NEXT: invoke void @simple_throw() #[[ATTR3:[0-9]+]]
+; CHECK-NEXT: to label [[INVOKE_CONT0:%.*]] unwind label [[LPAD:%.*]]
+; CHECK: invoke.cont0:
+; CHECK-NEXT: unreachable
+; CHECK: lpad:
+; CHECK-NEXT: [[EH:%.*]] = landingpad { ptr, i32 }
+; CHECK-NEXT: cleanup
+; CHECK-NEXT: call void @destructor()
+; CHECK-NEXT: resume { ptr, i32 } [[EH]]
+; CHECK: if.else:
+; CHECK-NEXT: [[C1:%.*]] = call i1 @cond()
+; CHECK-NEXT: br i1 [[C1]], label [[IF_THEN1:%.*]], label [[IF_END:%.*]]
+; CHECK: if.then1:
+; CHECK-NEXT: invoke void @simple_throw() #[[ATTR2]]
+; CHECK-NEXT: to label [[INVOKE_CONT2:%.*]] unwind label [[LPAD]]
+; CHECK: invoke.cont2:
+; CHECK-NEXT: unreachable
+; CHECK: if.end:
+; CHECK-NEXT: call void @sideeffect()
+; CHECK-NEXT: ret void
+;
+entry:
+ %c0 = call i1 @cond()
+ br i1 %c0, label %if.then0, label %if.else
+
+if.then0:
+ invoke void @simple_throw() readnone cold to label %invoke.cont0 unwind label %lpad
+
+invoke.cont0:
+ unreachable
+
+lpad:
+ %eh = landingpad { ptr, i32 } cleanup
+ call void @destructor()
+ resume { ptr, i32 } %eh
+
+if.else:
+ %c1 = call i1 @cond()
+ br i1 %c1, label %if.then1, label %if.end
+
+if.then1:
+ invoke void @simple_throw() readnone to label %invoke.cont2 unwind label %lpad
+
+invoke.cont2:
+ unreachable
+
+if.end:
+ call void @sideeffect()
+ ret void
+}
+
+define void @t17_mismatched_attrs_okay_merge_intersect2() personality ptr @__gxx_personality_v0 {
+; CHECK-LABEL: define {{[^@]+}}@t17_mismatched_attrs_okay_merge_intersect2() personality ptr @__gxx_personality_v0 {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
+; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN0:%.*]], label [[IF_ELSE:%.*]]
+; CHECK: if.then0:
+; CHECK-NEXT: invoke void @simple_throw() #[[ATTR2]]
+; CHECK-NEXT: to label [[INVOKE_CONT0:%.*]] unwind label [[LPAD:%.*]]
+; CHECK: invoke.cont0:
+; CHECK-NEXT: unreachable
+; CHECK: lpad:
+; CHECK-NEXT: [[EH:%.*]] = landingpad { ptr, i32 }
+; CHECK-NEXT: cleanup
+; CHECK-NEXT: call void @destructor()
+; CHECK-NEXT: resume { ptr, i32 } [[EH]]
+; CHECK: if.else:
+; CHECK-NEXT: [[C1:%.*]] = call i1 @cond()
+; CHECK-NEXT: br i1 [[C1]], label [[IF_THEN1:%.*]], label [[IF_END:%.*]]
+; CHECK: if.then1:
+; CHECK-NEXT: invoke void @simple_throw() #[[ATTR3]]
+; CHECK-NEXT: to label [[INVOKE_CONT2:%.*]] unwind label [[LPAD]]
+; CHECK: invoke.cont2:
+; CHECK-NEXT: unreachable
+; CHECK: if.end:
+; CHECK-NEXT: call void @sideeffect()
+; CHECK-NEXT: ret void
+;
+entry:
+ %c0 = call i1 @cond()
+ br i1 %c0, label %if.then0, label %if.else
+
+if.then0:
+ invoke void @simple_throw() readnone to label %invoke.cont0 unwind label %lpad
+
+invoke.cont0:
+ unreachable
+
+lpad:
+ %eh = landingpad { ptr, i32 } cleanup
+ call void @destructor()
+ resume { ptr, i32 } %eh
+
+if.else:
+ %c1 = call i1 @cond()
+ br i1 %c1, label %if.then1, label %if.end
+
+if.then1:
+ invoke void @simple_throw() readnone cold to label %invoke.cont2 unwind label %lpad
+
+invoke.cont2:
+ unreachable
+
+if.end:
+ call void @sideeffect()
+ ret void
+}
+
+
+define void @t17_mismatched_attrs_prevent_merge() personality ptr @__gxx_personality_v0 {
+; CHECK-LABEL: define {{[^@]+}}@t17_mismatched_attrs_prevent_merge() personality ptr @__gxx_personality_v0 {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
+; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN0:%.*]], label [[IF_ELSE:%.*]]
+; CHECK: if.then0:
+; CHECK-NEXT: invoke void @simple_throw() #[[ATTR4:[0-9]+]]
+; CHECK-NEXT: to label [[INVOKE_CONT0:%.*]] unwind label [[LPAD:%.*]]
+; CHECK: invoke.cont0:
+; CHECK-NEXT: unreachable
+; CHECK: lpad:
+; CHECK-NEXT: [[EH:%.*]] = landingpad { ptr, i32 }
+; CHECK-NEXT: cleanup
+; CHECK-NEXT: call void @destructor()
+; CHECK-NEXT: resume { ptr, i32 } [[EH]]
+; CHECK: if.else:
+; CHECK-NEXT: [[C1:%.*]] = call i1 @cond()
+; CHECK-NEXT: br i1 [[C1]], label [[IF_THEN1:%.*]], label [[IF_END:%.*]]
+; CHECK: if.then1:
+; CHECK-NEXT: invoke void @simple_throw()
+; CHECK-NEXT: to label [[INVOKE_CONT2:%.*]] unwind label [[LPAD]]
+; CHECK: invoke.cont2:
+; CHECK-NEXT: unreachable
+; CHECK: if.end:
+; CHECK-NEXT: call void @sideeffect()
+; CHECK-NEXT: ret void
+;
+entry:
+ %c0 = call i1 @cond()
+ br i1 %c0, label %if.then0, label %if.else
+
+if.then0:
+ invoke void @simple_throw() strictfp to label %invoke.cont0 unwind label %lpad
+
+invoke.cont0:
+ unreachable
+
+lpad:
+ %eh = landingpad { ptr, i32 } cleanup
+ call void @destructor()
+ resume { ptr, i32 } %eh
+
+if.else:
+ %c1 = call i1 @cond()
+ br i1 %c1, label %if.then1, label %if.end
+
+if.then1:
+ invoke void @simple_throw() to label %invoke.cont2 unwind label %lpad
+
+invoke.cont2:
+ unreachable
+
+if.end:
+ call void @sideeffect()
+ ret void
+}
+
+
; Common attributes are preserved
define void @t18_attributes_are_preserved() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t18_attributes_are_preserved(
+; CHECK-LABEL: define {{[^@]+}}@t18_attributes_are_preserved() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE:%.*]]
@@ -1122,7 +1294,7 @@ if.end:
; Fully identical operand bundles are good.
define void @t19_compatible_operand_bundle() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t19_compatible_operand_bundle(
+; CHECK-LABEL: define {{[^@]+}}@t19_compatible_operand_bundle() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE:%.*]]
@@ -1175,7 +1347,7 @@ if.end:
; Operand bundles must be compatible, else we can't merge.
define void @t20_incompatible_operand_bundle() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t20_incompatible_operand_bundle(
+; CHECK-LABEL: define {{[^@]+}}@t20_incompatible_operand_bundle() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN0:%.*]], label [[IF_ELSE:%.*]]
@@ -1233,7 +1405,8 @@ if.end:
; We need to PHI together the arguments of the operand bundles.
define void @t21_semicompatible_operand_bundle(i32 %a, i32 %b) personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t21_semicompatible_operand_bundle(
+; CHECK-LABEL: define {{[^@]+}}@t21_semicompatible_operand_bundle
+; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE:%.*]]
@@ -1246,7 +1419,7 @@ define void @t21_semicompatible_operand_bundle(i32 %a, i32 %b) personality ptr @
; CHECK-NEXT: [[C1:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C1]], label [[IF_THEN1_INVOKE]], label [[IF_END:%.*]]
; CHECK: if.then1.invoke:
-; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ [[B:%.*]], [[IF_ELSE]] ], [ [[A:%.*]], [[ENTRY:%.*]] ]
+; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ [[B]], [[IF_ELSE]] ], [ [[A]], [[ENTRY:%.*]] ]
; CHECK-NEXT: invoke void @simple_throw() [ "abc"(i32 [[TMP0]]) ]
; CHECK-NEXT: to label [[IF_THEN1_CONT:%.*]] unwind label [[LPAD:%.*]]
; CHECK: if.then1.cont:
@@ -1288,7 +1461,7 @@ if.end:
; Even though the normal destinations are unreachable,
; they may have (dead) PHI nodes, so we must cleanup them.
define void @t22_dead_phi_in_normal_dest() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t22_dead_phi_in_normal_dest(
+; CHECK-LABEL: define {{[^@]+}}@t22_dead_phi_in_normal_dest() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE:%.*]]
@@ -1343,7 +1516,7 @@ if.end:
; landingpad has PHI nodes, and out of three invokes, only two have compatible incoming values.
define void @t23_phi_in_landingpad_compatible_incoming_values() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t23_phi_in_landingpad_compatible_incoming_values(
+; CHECK-LABEL: define {{[^@]+}}@t23_phi_in_landingpad_compatible_incoming_values() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE0:%.*]]
@@ -1419,7 +1592,7 @@ if.end:
; landingpad has two PHI nodes, but depending on which PHI you look,
; the invoke sets would be different, so we can't merge invokes here.
define void @t24_phi_in_landingpad_semi_compatible_incoming_values() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t24_phi_in_landingpad_semi_compatible_incoming_values(
+; CHECK-LABEL: define {{[^@]+}}@t24_phi_in_landingpad_semi_compatible_incoming_values() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN0:%.*]], label [[IF_ELSE0:%.*]]
@@ -1503,7 +1676,7 @@ if.end:
; The normal destinations are shared, but the incoming values are incompatible.
define void @t25_incompatible_phis_in_normal_destination() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t25_incompatible_phis_in_normal_destination(
+; CHECK-LABEL: define {{[^@]+}}@t25_incompatible_phis_in_normal_destination() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN0:%.*]], label [[IF_ELSE:%.*]]
@@ -1562,7 +1735,7 @@ if.end:
; shared normal destination has PHI nodes, and out of three invokes, only two have compatible incoming values.
define void @t26_phi_in_normal_dest_compatible_incoming_values() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t26_phi_in_normal_dest_compatible_incoming_values(
+; CHECK-LABEL: define {{[^@]+}}@t26_phi_in_normal_dest_compatible_incoming_values() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE0:%.*]]
@@ -1631,7 +1804,7 @@ if.end:
; Invokes return values, but they are unused.
define void @t27_invoke_ret_value_is_used() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t27_invoke_ret_value_is_used(
+; CHECK-LABEL: define {{[^@]+}}@t27_invoke_ret_value_is_used() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE:%.*]]
@@ -1683,7 +1856,7 @@ if.end:
; Invokes return values, and they are used in a phi node, making the incoming values incompatible.
define void @t28_invoke_ret_value_is_used_in_phi_node() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t28_invoke_ret_value_is_used_in_phi_node(
+; CHECK-LABEL: define {{[^@]+}}@t28_invoke_ret_value_is_used_in_phi_node() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE:%.*]]
@@ -1738,7 +1911,7 @@ if.end:
; out of three invokes, two share normal destination and another one has unreachable destination
define void @t29_common_normal_destination_and_unreachable_normal_destination() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t29_common_normal_destination_and_unreachable_normal_destination(
+; CHECK-LABEL: define {{[^@]+}}@t29_common_normal_destination_and_unreachable_normal_destination() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE0:%.*]]
@@ -1808,7 +1981,7 @@ if.end:
; normal destinations are not unreachable and different but could be merged
define void @t30_completely_different_normal_dests() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t30_completely_different_normal_dests(
+; CHECK-LABEL: define {{[^@]+}}@t30_completely_different_normal_dests() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN0:%.*]], label [[IF_ELSE:%.*]]
@@ -1872,7 +2045,7 @@ if.end:
; they may have (dead) PHI nodes with incompatible incoming values,
; so we must cleanup them.
define void @t31_incompatible_dead_phi_in_normal_dest() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t31_incompatible_dead_phi_in_normal_dest(
+; CHECK-LABEL: define {{[^@]+}}@t31_incompatible_dead_phi_in_normal_dest() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE:%.*]]
@@ -1924,7 +2097,7 @@ if.end:
; Invokes return values, and they are used in a phi node, making the incoming values incompatible,
; second phi has compatible incoming values
define void @t32_invoke_ret_value_is_used_in_phi_node_other_phi_is_fine() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t32_invoke_ret_value_is_used_in_phi_node_other_phi_is_fine(
+; CHECK-LABEL: define {{[^@]+}}@t32_invoke_ret_value_is_used_in_phi_node_other_phi_is_fine() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE:%.*]]
@@ -1983,7 +2156,7 @@ if.end:
; Invokes return values, and they are used in a phi node, making the incoming values incompatible,
; second phi has incompatible incoming values.
define void @t33_invoke_ret_value_is_used_in_phi_node_other_phi_is_bad() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t33_invoke_ret_value_is_used_in_phi_node_other_phi_is_bad(
+; CHECK-LABEL: define {{[^@]+}}@t33_invoke_ret_value_is_used_in_phi_node_other_phi_is_bad() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN0:%.*]], label [[IF_ELSE:%.*]]
@@ -2047,7 +2220,7 @@ if.end:
; Invokes return values, and they are used in a phi node, but when coming from different invokes,
; the incoming value isn't always the invoke, which is not okay.
define void @t34_invoke_ret_value_maybe_incompatibly_used_in_phi_node() personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t34_invoke_ret_value_maybe_incompatibly_used_in_phi_node(
+; CHECK-LABEL: define {{[^@]+}}@t34_invoke_ret_value_maybe_incompatibly_used_in_phi_node() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN0:%.*]], label [[IF_ELSE:%.*]]
@@ -2110,7 +2283,8 @@ if.end:
; Two mergeable indirect calls, with identical callees.
define void @t35_identical_indirect_callees(ptr %callee) personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t35_identical_indirect_callees(
+; CHECK-LABEL: define {{[^@]+}}@t35_identical_indirect_callees
+; CHECK-SAME: (ptr [[CALLEE:%.*]]) personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE:%.*]]
@@ -2123,7 +2297,7 @@ define void @t35_identical_indirect_callees(ptr %callee) personality ptr @__gxx_
; CHECK-NEXT: [[C1:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C1]], label [[IF_THEN1_INVOKE]], label [[IF_END:%.*]]
; CHECK: if.then1.invoke:
-; CHECK-NEXT: invoke void [[CALLEE:%.*]]()
+; CHECK-NEXT: invoke void [[CALLEE]]()
; CHECK-NEXT: to label [[IF_THEN1_CONT:%.*]] unwind label [[LPAD:%.*]]
; CHECK: if.then1.cont:
; CHECK-NEXT: unreachable
@@ -2163,7 +2337,8 @@ if.end:
; Two mergeable indirect calls, with different callees.
define void @t36_different_indirect_callees(ptr %callee0, ptr %callee1) personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t36_different_indirect_callees(
+; CHECK-LABEL: define {{[^@]+}}@t36_different_indirect_callees
+; CHECK-SAME: (ptr [[CALLEE0:%.*]], ptr [[CALLEE1:%.*]]) personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE:%.*]]
@@ -2176,7 +2351,7 @@ define void @t36_different_indirect_callees(ptr %callee0, ptr %callee1) personal
; CHECK-NEXT: [[C1:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C1]], label [[IF_THEN1_INVOKE]], label [[IF_END:%.*]]
; CHECK: if.then1.invoke:
-; CHECK-NEXT: [[TMP0:%.*]] = phi ptr [ [[CALLEE1:%.*]], [[IF_ELSE]] ], [ [[CALLEE0:%.*]], [[ENTRY:%.*]] ]
+; CHECK-NEXT: [[TMP0:%.*]] = phi ptr [ [[CALLEE1]], [[IF_ELSE]] ], [ [[CALLEE0]], [[ENTRY:%.*]] ]
; CHECK-NEXT: invoke void [[TMP0]]()
; CHECK-NEXT: to label [[IF_THEN1_CONT:%.*]] unwind label [[LPAD:%.*]]
; CHECK: if.then1.cont:
@@ -2217,7 +2392,8 @@ if.end:
; Don't merge direct invoke with indirect ones.
define void @t37_three_invokes_two_indirect_one_direct(ptr %callee) personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t37_three_invokes_two_indirect_one_direct(
+; CHECK-LABEL: define {{[^@]+}}@t37_three_invokes_two_indirect_one_direct
+; CHECK-SAME: (ptr [[CALLEE:%.*]]) personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE0:%.*]]
@@ -2230,7 +2406,7 @@ define void @t37_three_invokes_two_indirect_one_direct(ptr %callee) personality
; CHECK-NEXT: [[C1:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C1]], label [[IF_THEN1_INVOKE]], label [[IF_ELSE1:%.*]]
; CHECK: if.then1.invoke:
-; CHECK-NEXT: invoke void [[CALLEE:%.*]]()
+; CHECK-NEXT: invoke void [[CALLEE]]()
; CHECK-NEXT: to label [[IF_THEN1_CONT:%.*]] unwind label [[LPAD:%.*]]
; CHECK: if.then1.cont:
; CHECK-NEXT: unreachable
@@ -2288,7 +2464,8 @@ if.end:
; For indirect invokes, different arguments are fine.
define void @t38_different_arguments_and_operand_bundes_are_fine(ptr %callee0, ptr %callee1) personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t38_different_arguments_and_operand_bundes_are_fine(
+; CHECK-LABEL: define {{[^@]+}}@t38_different_arguments_and_operand_bundes_are_fine
+; CHECK-SAME: (ptr [[CALLEE0:%.*]], ptr [[CALLEE1:%.*]]) personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE:%.*]]
@@ -2302,7 +2479,7 @@ define void @t38_different_arguments_and_operand_bundes_are_fine(ptr %callee0, p
; CHECK-NEXT: br i1 [[C1]], label [[IF_THEN1_INVOKE]], label [[IF_END:%.*]]
; CHECK: if.then1.invoke:
; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ 42, [[IF_ELSE]] ], [ 0, [[ENTRY:%.*]] ]
-; CHECK-NEXT: [[TMP1:%.*]] = phi ptr [ [[CALLEE1:%.*]], [[IF_ELSE]] ], [ [[CALLEE0:%.*]], [[ENTRY]] ]
+; CHECK-NEXT: [[TMP1:%.*]] = phi ptr [ [[CALLEE1]], [[IF_ELSE]] ], [ [[CALLEE0]], [[ENTRY]] ]
; CHECK-NEXT: invoke void [[TMP1]](i32 [[TMP0]])
; CHECK-NEXT: to label [[IF_THEN1_CONT:%.*]] unwind label [[LPAD:%.*]]
; CHECK: if.then1.cont:
@@ -2343,7 +2520,8 @@ if.end:
; For indirect invokes, different operand bundle arguments are fine.
define void @t39_different_arguments_and_operand_bundes_are_fine(ptr %callee0, ptr %callee1, i32 %a, i32 %b) personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t39_different_arguments_and_operand_bundes_are_fine(
+; CHECK-LABEL: define {{[^@]+}}@t39_different_arguments_and_operand_bundes_are_fine
+; CHECK-SAME: (ptr [[CALLEE0:%.*]], ptr [[CALLEE1:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE:%.*]]
@@ -2356,8 +2534,8 @@ define void @t39_different_arguments_and_operand_bundes_are_fine(ptr %callee0, p
; CHECK-NEXT: [[C1:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C1]], label [[IF_THEN1_INVOKE]], label [[IF_END:%.*]]
; CHECK: if.then1.invoke:
-; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ [[B:%.*]], [[IF_ELSE]] ], [ [[A:%.*]], [[ENTRY:%.*]] ]
-; CHECK-NEXT: [[TMP1:%.*]] = phi ptr [ [[CALLEE1:%.*]], [[IF_ELSE]] ], [ [[CALLEE0:%.*]], [[ENTRY]] ]
+; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ [[B]], [[IF_ELSE]] ], [ [[A]], [[ENTRY:%.*]] ]
+; CHECK-NEXT: [[TMP1:%.*]] = phi ptr [ [[CALLEE1]], [[IF_ELSE]] ], [ [[CALLEE0]], [[ENTRY]] ]
; CHECK-NEXT: invoke void [[TMP1]]() [ "abc"(i32 [[TMP0]]) ]
; CHECK-NEXT: to label [[IF_THEN1_CONT:%.*]] unwind label [[LPAD:%.*]]
; CHECK: if.then1.cont:
@@ -2398,7 +2576,8 @@ if.end:
; For indirect invokes, both different arguments and operand bundle arguments are fine.
define void @t40_different_arguments_and_operand_bundes_are_fine(ptr %callee0, ptr %callee1, i32 %a, i32 %b) personality ptr @__gxx_personality_v0 {
-; CHECK-LABEL: @t40_different_arguments_and_operand_bundes_are_fine(
+; CHECK-LABEL: define {{[^@]+}}@t40_different_arguments_and_operand_bundes_are_fine
+; CHECK-SAME: (ptr [[CALLEE0:%.*]], ptr [[CALLEE1:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE:%.*]]
@@ -2412,8 +2591,8 @@ define void @t40_different_arguments_and_operand_bundes_are_fine(ptr %callee0, p
; CHECK-NEXT: br i1 [[C1]], label [[IF_THEN1_INVOKE]], label [[IF_END:%.*]]
; CHECK: if.then1.invoke:
; CHECK-NEXT: [[TMP0:%.*]] = phi i32 [ 42, [[IF_ELSE]] ], [ 0, [[ENTRY:%.*]] ]
-; CHECK-NEXT: [[TMP1:%.*]] = phi i32 [ [[B:%.*]], [[IF_ELSE]] ], [ [[A:%.*]], [[ENTRY]] ]
-; CHECK-NEXT: [[TMP2:%.*]] = phi ptr [ [[CALLEE1:%.*]], [[IF_ELSE]] ], [ [[CALLEE0:%.*]], [[ENTRY]] ]
+; CHECK-NEXT: [[TMP1:%.*]] = phi i32 [ [[B]], [[IF_ELSE]] ], [ [[A]], [[ENTRY]] ]
+; CHECK-NEXT: [[TMP2:%.*]] = phi ptr [ [[CALLEE1]], [[IF_ELSE]] ], [ [[CALLEE0]], [[ENTRY]] ]
; CHECK-NEXT: invoke void [[TMP2]](i32 [[TMP0]]) [ "abc"(i32 [[TMP1]]) ]
; CHECK-NEXT: to label [[IF_THEN1_CONT:%.*]] unwind label [[LPAD:%.*]]
; CHECK: if.then1.cont:
@@ -2453,8 +2632,9 @@ if.end:
}
define void @dont_merge_different_immargs(i1 %c1) gc "statepoint-example" personality ptr null {
-; CHECK-LABEL: @dont_merge_different_immargs(
-; CHECK-NEXT: br i1 [[C1:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
+; CHECK-LABEL: define {{[^@]+}}@dont_merge_different_immargs
+; CHECK-SAME: (i1 [[C1:%.*]]) gc "statepoint-example" personality ptr null {
+; CHECK-NEXT: br i1 [[C1]], label [[IF:%.*]], label [[ELSE:%.*]]
; CHECK: if:
; CHECK-NEXT: [[T1:%.*]] = invoke token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 1, i32 0, ptr elementtype(void (ptr addrspace(1))) null, i32 1, i32 0, ptr addrspace(1) null, i64 0, i64 0)
; CHECK-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[LPAD:%.*]]
@@ -2513,4 +2693,6 @@ declare dso_local i32 @__gxx_personality_v0(...)
; CHECK: attributes #[[ATTR0:[0-9]+]] = { noreturn }
; CHECK: attributes #[[ATTR1]] = { nomerge }
; CHECK: attributes #[[ATTR2]] = { memory(none) }
+; CHECK: attributes #[[ATTR3]] = { cold memory(none) }
+; CHECK: attributes #[[ATTR4]] = { strictfp }
;.
>From 8105ed2f2602f3973f12701009786b5384542a9d Mon Sep 17 00:00:00 2001
From: Noah Goldstein <goldstein.w.n at gmail.com>
Date: Wed, 9 Oct 2024 11:26:57 -0500
Subject: [PATCH 2/2] [SimplifyCFG] Allow merging invoke's with different attrs
Same logic as other callsites, if the attributes are intersectable, we
merge.
---
llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 6 ++-
.../merge-compatible-invokes-of-landingpad.ll | 54 +++++++------------
2 files changed, 24 insertions(+), 36 deletions(-)
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
index 18d26aaf460662..566ae2cf1936e9 100644
--- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -2779,7 +2779,7 @@ bool CompatibleSets::shouldBelongToSameSet(ArrayRef<InvokeInst *> Invokes) {
// including operand bundles.
const InvokeInst *II0 = Invokes.front();
for (auto *II : Invokes.drop_front())
- if (!II->isSameOperationAs(II0))
+ if (!II->isSameOperationAs(II0, Instruction::CompareUsingIntersectedAttrs))
return false;
// Can we theoretically form the data operands for the merged `invoke`?
@@ -2918,6 +2918,10 @@ static void mergeCompatibleInvokesImpl(ArrayRef<InvokeInst *> Invokes,
for (BasicBlock *OrigSuccBB : successors(II->getParent()))
OrigSuccBB->removePredecessor(II->getParent());
BranchInst::Create(MergedInvoke->getParent(), II->getParent());
+ bool Success = MergedInvoke->tryIntersectAttributes(II);
+ assert(Success && "Merged invokes with incompatible attributes");
+ // For NDEBUG Compile
+ (void)Success;
II->replaceAllUsesWith(MergedInvoke);
II->eraseFromParent();
++NumInvokesMerged;
diff --git a/llvm/test/Transforms/SimplifyCFG/X86/merge-compatible-invokes-of-landingpad.ll b/llvm/test/Transforms/SimplifyCFG/X86/merge-compatible-invokes-of-landingpad.ll
index 24e4a41ec824b6..3aff1f0f4f3afa 100644
--- a/llvm/test/Transforms/SimplifyCFG/X86/merge-compatible-invokes-of-landingpad.ll
+++ b/llvm/test/Transforms/SimplifyCFG/X86/merge-compatible-invokes-of-landingpad.ll
@@ -1013,12 +1013,7 @@ define void @t17_mismatched_attrs_okay_merge() personality ptr @__gxx_personalit
; CHECK-LABEL: define {{[^@]+}}@t17_mismatched_attrs_okay_merge() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
-; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN0:%.*]], label [[IF_ELSE:%.*]]
-; CHECK: if.then0:
-; CHECK-NEXT: invoke void @simple_throw() #[[ATTR2:[0-9]+]]
-; CHECK-NEXT: to label [[INVOKE_CONT0:%.*]] unwind label [[LPAD:%.*]]
-; CHECK: invoke.cont0:
-; CHECK-NEXT: unreachable
+; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE:%.*]]
; CHECK: lpad:
; CHECK-NEXT: [[EH:%.*]] = landingpad { ptr, i32 }
; CHECK-NEXT: cleanup
@@ -1026,11 +1021,11 @@ define void @t17_mismatched_attrs_okay_merge() personality ptr @__gxx_personalit
; CHECK-NEXT: resume { ptr, i32 } [[EH]]
; CHECK: if.else:
; CHECK-NEXT: [[C1:%.*]] = call i1 @cond()
-; CHECK-NEXT: br i1 [[C1]], label [[IF_THEN1:%.*]], label [[IF_END:%.*]]
-; CHECK: if.then1:
+; CHECK-NEXT: br i1 [[C1]], label [[IF_THEN1_INVOKE]], label [[IF_END:%.*]]
+; CHECK: if.then1.invoke:
; CHECK-NEXT: invoke void @simple_throw()
-; CHECK-NEXT: to label [[INVOKE_CONT2:%.*]] unwind label [[LPAD]]
-; CHECK: invoke.cont2:
+; CHECK-NEXT: to label [[IF_THEN1_CONT:%.*]] unwind label [[LPAD:%.*]]
+; CHECK: if.then1.cont:
; CHECK-NEXT: unreachable
; CHECK: if.end:
; CHECK-NEXT: call void @sideeffect()
@@ -1070,12 +1065,7 @@ define void @t17_mismatched_attrs_okay_merge_intersect() personality ptr @__gxx_
; CHECK-LABEL: define {{[^@]+}}@t17_mismatched_attrs_okay_merge_intersect() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
-; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN0:%.*]], label [[IF_ELSE:%.*]]
-; CHECK: if.then0:
-; CHECK-NEXT: invoke void @simple_throw() #[[ATTR3:[0-9]+]]
-; CHECK-NEXT: to label [[INVOKE_CONT0:%.*]] unwind label [[LPAD:%.*]]
-; CHECK: invoke.cont0:
-; CHECK-NEXT: unreachable
+; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE:%.*]]
; CHECK: lpad:
; CHECK-NEXT: [[EH:%.*]] = landingpad { ptr, i32 }
; CHECK-NEXT: cleanup
@@ -1083,11 +1073,11 @@ define void @t17_mismatched_attrs_okay_merge_intersect() personality ptr @__gxx_
; CHECK-NEXT: resume { ptr, i32 } [[EH]]
; CHECK: if.else:
; CHECK-NEXT: [[C1:%.*]] = call i1 @cond()
-; CHECK-NEXT: br i1 [[C1]], label [[IF_THEN1:%.*]], label [[IF_END:%.*]]
-; CHECK: if.then1:
-; CHECK-NEXT: invoke void @simple_throw() #[[ATTR2]]
-; CHECK-NEXT: to label [[INVOKE_CONT2:%.*]] unwind label [[LPAD]]
-; CHECK: invoke.cont2:
+; CHECK-NEXT: br i1 [[C1]], label [[IF_THEN1_INVOKE]], label [[IF_END:%.*]]
+; CHECK: if.then1.invoke:
+; CHECK-NEXT: invoke void @simple_throw() #[[ATTR2:[0-9]+]]
+; CHECK-NEXT: to label [[IF_THEN1_CONT:%.*]] unwind label [[LPAD:%.*]]
+; CHECK: if.then1.cont:
; CHECK-NEXT: unreachable
; CHECK: if.end:
; CHECK-NEXT: call void @sideeffect()
@@ -1127,12 +1117,7 @@ define void @t17_mismatched_attrs_okay_merge_intersect2() personality ptr @__gxx
; CHECK-LABEL: define {{[^@]+}}@t17_mismatched_attrs_okay_merge_intersect2() personality ptr @__gxx_personality_v0 {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
-; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN0:%.*]], label [[IF_ELSE:%.*]]
-; CHECK: if.then0:
-; CHECK-NEXT: invoke void @simple_throw() #[[ATTR2]]
-; CHECK-NEXT: to label [[INVOKE_CONT0:%.*]] unwind label [[LPAD:%.*]]
-; CHECK: invoke.cont0:
-; CHECK-NEXT: unreachable
+; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN1_INVOKE:%.*]], label [[IF_ELSE:%.*]]
; CHECK: lpad:
; CHECK-NEXT: [[EH:%.*]] = landingpad { ptr, i32 }
; CHECK-NEXT: cleanup
@@ -1140,11 +1125,11 @@ define void @t17_mismatched_attrs_okay_merge_intersect2() personality ptr @__gxx
; CHECK-NEXT: resume { ptr, i32 } [[EH]]
; CHECK: if.else:
; CHECK-NEXT: [[C1:%.*]] = call i1 @cond()
-; CHECK-NEXT: br i1 [[C1]], label [[IF_THEN1:%.*]], label [[IF_END:%.*]]
-; CHECK: if.then1:
-; CHECK-NEXT: invoke void @simple_throw() #[[ATTR3]]
-; CHECK-NEXT: to label [[INVOKE_CONT2:%.*]] unwind label [[LPAD]]
-; CHECK: invoke.cont2:
+; CHECK-NEXT: br i1 [[C1]], label [[IF_THEN1_INVOKE]], label [[IF_END:%.*]]
+; CHECK: if.then1.invoke:
+; CHECK-NEXT: invoke void @simple_throw() #[[ATTR2]]
+; CHECK-NEXT: to label [[IF_THEN1_CONT:%.*]] unwind label [[LPAD:%.*]]
+; CHECK: if.then1.cont:
; CHECK-NEXT: unreachable
; CHECK: if.end:
; CHECK-NEXT: call void @sideeffect()
@@ -1187,7 +1172,7 @@ define void @t17_mismatched_attrs_prevent_merge() personality ptr @__gxx_persona
; CHECK-NEXT: [[C0:%.*]] = call i1 @cond()
; CHECK-NEXT: br i1 [[C0]], label [[IF_THEN0:%.*]], label [[IF_ELSE:%.*]]
; CHECK: if.then0:
-; CHECK-NEXT: invoke void @simple_throw() #[[ATTR4:[0-9]+]]
+; CHECK-NEXT: invoke void @simple_throw() #[[ATTR3:[0-9]+]]
; CHECK-NEXT: to label [[INVOKE_CONT0:%.*]] unwind label [[LPAD:%.*]]
; CHECK: invoke.cont0:
; CHECK-NEXT: unreachable
@@ -2693,6 +2678,5 @@ declare dso_local i32 @__gxx_personality_v0(...)
; CHECK: attributes #[[ATTR0:[0-9]+]] = { noreturn }
; CHECK: attributes #[[ATTR1]] = { nomerge }
; CHECK: attributes #[[ATTR2]] = { memory(none) }
-; CHECK: attributes #[[ATTR3]] = { cold memory(none) }
-; CHECK: attributes #[[ATTR4]] = { strictfp }
+; CHECK: attributes #[[ATTR3]] = { strictfp }
;.
More information about the llvm-commits
mailing list