[llvm] 26b79f8 - [FunctionAttrs] Add tests for deducing attr `cold` on functions; NFC

Noah Goldstein via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 20 15:29:33 PDT 2024


Author: Noah Goldstein
Date: 2024-08-20T15:29:24-07:00
New Revision: 26b79f87079091ecd805f6dfb624df7ba6d702d1

URL: https://github.com/llvm/llvm-project/commit/26b79f87079091ecd805f6dfb624df7ba6d702d1
DIFF: https://github.com/llvm/llvm-project/commit/26b79f87079091ecd805f6dfb624df7ba6d702d1.diff

LOG: [FunctionAttrs] Add tests for deducing attr `cold` on functions; NFC

Added: 
    llvm/test/Transforms/FunctionAttrs/cold.ll

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/FunctionAttrs/cold.ll b/llvm/test/Transforms/FunctionAttrs/cold.ll
new file mode 100644
index 00000000000000..1fa8ae06797943
--- /dev/null
+++ b/llvm/test/Transforms/FunctionAttrs/cold.ll
@@ -0,0 +1,694 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes --check-globals --version 2
+; RUN: opt -passes=function-attrs -S < %s | FileCheck --check-prefixes=COMMON,FNATTRS %s
+; RUN: opt -passes=attributor-light -S < %s | FileCheck --check-prefixes=COMMON,ATTRIBUTOR %s
+
+declare i32 @get_val()
+
+declare void @cold0() cold
+declare void @cold1() cold
+declare void @cold_at_cb()
+
+declare void @not_cold0()
+declare void @not_cold1()
+declare void @not_cold2()
+
+define void @test_no_exit_fail() {
+; COMMON: Function Attrs: nofree norecurse noreturn nosync nounwind memory(none)
+; COMMON-LABEL: define void @test_no_exit_fail
+; COMMON-SAME: () #[[ATTR1:[0-9]+]] {
+; COMMON-NEXT:  entry:
+; COMMON-NEXT:    br label [[WHILE_BODY:%.*]]
+; COMMON:       while.body:
+; COMMON-NEXT:    br label [[WHILE_BODY]]
+;
+entry:
+  br label %while.body
+
+while.body:
+  br label %while.body
+}
+
+define void @test_no_exit_fail2() {
+; COMMON: Function Attrs: noreturn
+; COMMON-LABEL: define void @test_no_exit_fail2
+; COMMON-SAME: () #[[ATTR2:[0-9]+]] {
+; COMMON-NEXT:  entry:
+; COMMON-NEXT:    br label [[WHILE_BODY:%.*]]
+; COMMON:       while.body:
+; COMMON-NEXT:    call void @not_cold0()
+; COMMON-NEXT:    br label [[WHILE_BODY2:%.*]]
+; COMMON:       while.body2:
+; COMMON-NEXT:    call void @not_cold1()
+; COMMON-NEXT:    br label [[WHILE_BODY]]
+;
+entry:
+  br label %while.body
+
+while.body:
+  call void @not_cold0()
+  br label %while.body2
+
+while.body2:
+  call void @not_cold1()
+  br label %while.body
+}
+
+define void @test_no_exit() {
+; COMMON: Function Attrs: noreturn
+; COMMON-LABEL: define void @test_no_exit
+; COMMON-SAME: () #[[ATTR2]] {
+; COMMON-NEXT:  entry:
+; COMMON-NEXT:    br label [[WHILE_BODY:%.*]]
+; COMMON:       while.body:
+; COMMON-NEXT:    call void @cold0()
+; COMMON-NEXT:    br label [[WHILE_BODY]]
+;
+entry:
+  br label %while.body
+
+while.body:
+  call void @cold0()
+  br label %while.body
+}
+
+define void @test_no_exit2() {
+; COMMON: Function Attrs: noreturn
+; COMMON-LABEL: define void @test_no_exit2
+; COMMON-SAME: () #[[ATTR2]] {
+; COMMON-NEXT:  entry:
+; COMMON-NEXT:    br label [[WHILE_BODY:%.*]]
+; COMMON:       while.body:
+; COMMON-NEXT:    call void @not_cold0()
+; COMMON-NEXT:    br label [[WHILE_BODY2:%.*]]
+; COMMON:       while.body2:
+; COMMON-NEXT:    call void @cold1()
+; COMMON-NEXT:    br label [[WHILE_BODY]]
+;
+entry:
+  br label %while.body
+
+while.body:
+  call void @not_cold0()
+  br label %while.body2
+
+while.body2:
+  call void @cold1()
+  br label %while.body
+}
+
+define dso_local void @test_entry(i32 noundef %x) {
+; COMMON-LABEL: define dso_local void @test_entry
+; COMMON-SAME: (i32 noundef [[X:%.*]]) {
+; COMMON-NEXT:  entry:
+; COMMON-NEXT:    tail call void @cold0()
+; COMMON-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[X]], 0
+; COMMON-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
+; COMMON:       if.then:
+; COMMON-NEXT:    tail call void @not_cold0()
+; COMMON-NEXT:    br label [[IF_END]]
+; COMMON:       if.end:
+; COMMON-NEXT:    tail call void @not_cold1()
+; COMMON-NEXT:    ret void
+;
+entry:
+  tail call void @cold0()
+  %tobool.not = icmp eq i32 %x, 0
+  br i1 %tobool.not, label %if.end, label %if.then
+
+if.then:
+  tail call void @not_cold0()
+  br label %if.end
+
+if.end:
+  tail call void @not_cold1()
+  ret void
+}
+
+define dso_local void @test_hot_fail(i32 noundef %x) hot {
+; COMMON: Function Attrs: hot
+; COMMON-LABEL: define dso_local void @test_hot_fail
+; COMMON-SAME: (i32 noundef [[X:%.*]]) #[[ATTR3:[0-9]+]] {
+; COMMON-NEXT:  entry:
+; COMMON-NEXT:    tail call void @cold0()
+; COMMON-NEXT:    ret void
+;
+entry:
+  tail call void @cold0()
+  ret void
+}
+
+define dso_local void @test_br2(i32 noundef %x) {
+; COMMON-LABEL: define dso_local void @test_br2
+; COMMON-SAME: (i32 noundef [[X:%.*]]) {
+; COMMON-NEXT:  entry:
+; COMMON-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[X]], 0
+; COMMON-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
+; COMMON:       if.then:
+; COMMON-NEXT:    tail call void @cold0()
+; COMMON-NEXT:    br label [[IF_END:%.*]]
+; COMMON:       if.else:
+; COMMON-NEXT:    tail call void @cold1()
+; COMMON-NEXT:    br label [[IF_END]]
+; COMMON:       if.end:
+; COMMON-NEXT:    ret void
+;
+entry:
+  %tobool.not = icmp eq i32 %x, 0
+  br i1 %tobool.not, label %if.else, label %if.then
+
+if.then:
+  tail call void @cold0()
+  br label %if.end
+
+if.else:
+  tail call void @cold1()
+  br label %if.end
+
+if.end:
+  ret void
+}
+
+define dso_local void @test_exit(i32 noundef %x) {
+; COMMON-LABEL: define dso_local void @test_exit
+; COMMON-SAME: (i32 noundef [[X:%.*]]) {
+; COMMON-NEXT:  entry:
+; COMMON-NEXT:    tail call void @not_cold0()
+; COMMON-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[X]], 0
+; COMMON-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
+; COMMON:       if.then:
+; COMMON-NEXT:    tail call void @not_cold1()
+; COMMON-NEXT:    br label [[IF_END:%.*]]
+; COMMON:       if.else:
+; COMMON-NEXT:    tail call void @not_cold2()
+; COMMON-NEXT:    br label [[IF_END]]
+; COMMON:       if.end:
+; COMMON-NEXT:    tail call void @cold0()
+; COMMON-NEXT:    ret void
+;
+entry:
+  tail call void @not_cold0()
+  %tobool.not = icmp eq i32 %x, 0
+  br i1 %tobool.not, label %if.else, label %if.then
+
+if.then:
+  tail call void @not_cold1()
+  br label %if.end
+
+if.else:
+  tail call void @not_cold2()
+  br label %if.end
+
+if.end:
+  tail call void @cold0()
+  ret void
+}
+
+define dso_local void @test_complex(i32 noundef %x) {
+; COMMON-LABEL: define dso_local void @test_complex
+; COMMON-SAME: (i32 noundef [[X:%.*]]) {
+; COMMON-NEXT:  entry:
+; COMMON-NEXT:    tail call void @not_cold0()
+; COMMON-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[X]], 0
+; COMMON-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_ELSE11:%.*]], label [[IF_THEN:%.*]]
+; COMMON:       if.then:
+; COMMON-NEXT:    [[CALL:%.*]] = tail call i32 @get_val()
+; COMMON-NEXT:    [[TOBOOL1_NOT:%.*]] = icmp eq i32 [[CALL]], 0
+; COMMON-NEXT:    br i1 [[TOBOOL1_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN2:%.*]]
+; COMMON:       if.then2:
+; COMMON-NEXT:    tail call void @cold1()
+; COMMON-NEXT:    br label [[IF_END12:%.*]]
+; COMMON:       if.else:
+; COMMON-NEXT:    [[CALL3:%.*]] = tail call i32 @get_val()
+; COMMON-NEXT:    [[TOBOOL4_NOT:%.*]] = icmp eq i32 [[CALL3]], 0
+; COMMON-NEXT:    br i1 [[TOBOOL4_NOT]], label [[IF_ELSE6:%.*]], label [[IF_THEN5:%.*]]
+; COMMON:       if.then5:
+; COMMON-NEXT:    tail call void @cold0()
+; COMMON-NEXT:    br label [[IF_END12]]
+; COMMON:       if.else6:
+; COMMON-NEXT:    tail call void @not_cold0()
+; COMMON-NEXT:    [[CALL7:%.*]] = tail call i32 @get_val()
+; COMMON-NEXT:    switch i32 [[CALL7]], label [[SW_DEFAULT:%.*]] [
+; COMMON-NEXT:      i32 0, label [[SW_BB:%.*]]
+; COMMON-NEXT:      i32 1, label [[SW_BB8:%.*]]
+; COMMON-NEXT:      i32 2, label [[SW_BB9:%.*]]
+; COMMON-NEXT:    ]
+; COMMON:       sw.bb:
+; COMMON-NEXT:    tail call void @not_cold0()
+; COMMON-NEXT:    br label [[CALL_COLD:%.*]]
+; COMMON:       sw.bb8:
+; COMMON-NEXT:    tail call void @not_cold1()
+; COMMON-NEXT:    br label [[CALL_COLD]]
+; COMMON:       sw.bb9:
+; COMMON-NEXT:    tail call void @not_cold2()
+; COMMON-NEXT:    br label [[CALL_COLD]]
+; COMMON:       sw.default:
+; COMMON-NEXT:    tail call void @cold0()
+; COMMON-NEXT:    br label [[IF_END12]]
+; COMMON:       call_cold:
+; COMMON-NEXT:    tail call void @cold_at_cb() #[[ATTR0:[0-9]+]]
+; COMMON-NEXT:    br label [[IF_END12]]
+; COMMON:       if.else11:
+; COMMON-NEXT:    tail call void @cold0()
+; COMMON-NEXT:    br label [[IF_END12]]
+; COMMON:       if.end12:
+; COMMON-NEXT:    ret void
+;
+entry:
+  tail call void @not_cold0()
+  %tobool.not = icmp eq i32 %x, 0
+  br i1 %tobool.not, label %if.else11, label %if.then
+
+if.then:
+  %call = tail call i32 @get_val()
+  %tobool1.not = icmp eq i32 %call, 0
+  br i1 %tobool1.not, label %if.else, label %if.then2
+
+if.then2:
+  tail call void @cold1()
+  br label %if.end12
+
+if.else:
+  %call3 = tail call i32 @get_val()
+  %tobool4.not = icmp eq i32 %call3, 0
+  br i1 %tobool4.not, label %if.else6, label %if.then5
+
+if.then5:
+  tail call void @cold0()
+  br label %if.end12
+
+if.else6:
+  tail call void @not_cold0()
+  %call7 = tail call i32 @get_val()
+  switch i32 %call7, label %sw.default [
+  i32 0, label %sw.bb
+  i32 1, label %sw.bb8
+  i32 2, label %sw.bb9
+  ]
+
+sw.bb:
+  tail call void @not_cold0()
+  br label %call_cold
+
+sw.bb8:
+  tail call void @not_cold1()
+  br label %call_cold
+
+sw.bb9:
+  tail call void @not_cold2()
+  br label %call_cold
+
+sw.default:
+  tail call void @cold0()
+  br label %if.end12
+
+call_cold:
+  tail call void @cold_at_cb() cold
+  br label %if.end12
+
+if.else11:
+  tail call void @cold0()
+  br label %if.end12
+
+if.end12:
+  ret void
+}
+
+define dso_local void @test_complex2(i32 noundef %x) {
+; COMMON-LABEL: define dso_local void @test_complex2
+; COMMON-SAME: (i32 noundef [[X:%.*]]) {
+; COMMON-NEXT:  entry:
+; COMMON-NEXT:    tail call void @not_cold0()
+; COMMON-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[X]], 0
+; COMMON-NEXT:    [[CALL12:%.*]] = tail call i32 @get_val()
+; COMMON-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_ELSE11:%.*]], label [[IF_THEN:%.*]]
+; COMMON:       if.then:
+; COMMON-NEXT:    [[TOBOOL1_NOT:%.*]] = icmp eq i32 [[CALL12]], 0
+; COMMON-NEXT:    br i1 [[TOBOOL1_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN2:%.*]]
+; COMMON:       if.then2:
+; COMMON-NEXT:    tail call void @cold1()
+; COMMON-NEXT:    br label [[IF_END16:%.*]]
+; COMMON:       if.else:
+; COMMON-NEXT:    [[CALL3:%.*]] = tail call i32 @get_val()
+; COMMON-NEXT:    [[TOBOOL4_NOT:%.*]] = icmp eq i32 [[CALL3]], 0
+; COMMON-NEXT:    br i1 [[TOBOOL4_NOT]], label [[IF_ELSE6:%.*]], label [[IF_THEN5:%.*]]
+; COMMON:       if.then5:
+; COMMON-NEXT:    tail call void @cold0()
+; COMMON-NEXT:    br label [[IF_END16]]
+; COMMON:       if.else6:
+; COMMON-NEXT:    tail call void @not_cold0()
+; COMMON-NEXT:    [[CALL7:%.*]] = tail call i32 @get_val()
+; COMMON-NEXT:    switch i32 [[CALL7]], label [[SW_DEFAULT:%.*]] [
+; COMMON-NEXT:      i32 0, label [[SW_BB:%.*]]
+; COMMON-NEXT:      i32 1, label [[SW_BB8:%.*]]
+; COMMON-NEXT:      i32 2, label [[SW_BB9:%.*]]
+; COMMON-NEXT:    ]
+; COMMON:       sw.bb:
+; COMMON-NEXT:    tail call void @not_cold0()
+; COMMON-NEXT:    br label [[CALL_COLD:%.*]]
+; COMMON:       sw.bb8:
+; COMMON-NEXT:    tail call void @not_cold1()
+; COMMON-NEXT:    br label [[CALL_COLD]]
+; COMMON:       sw.bb9:
+; COMMON-NEXT:    tail call void @not_cold2()
+; COMMON-NEXT:    br label [[CALL_COLD]]
+; COMMON:       sw.default:
+; COMMON-NEXT:    tail call void @cold0()
+; COMMON-NEXT:    br label [[IF_END16]]
+; COMMON:       call_cold:
+; COMMON-NEXT:    tail call void @cold_at_cb() #[[ATTR0]]
+; COMMON-NEXT:    br label [[IF_END16]]
+; COMMON:       if.else11:
+; COMMON-NEXT:    [[CMP:%.*]] = icmp slt i32 [[CALL12]], 1
+; COMMON-NEXT:    br i1 [[CMP]], label [[IF_END14:%.*]], label [[FOR_BODY:%.*]]
+; COMMON:       if.end14:
+; COMMON-NEXT:    tail call void @cold1()
+; COMMON-NEXT:    br label [[IF_END16]]
+; COMMON:       for.body:
+; COMMON-NEXT:    [[I_021:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 0, [[IF_ELSE11]] ]
+; COMMON-NEXT:    tail call void @cold0()
+; COMMON-NEXT:    [[INC]] = add nuw nsw i32 [[I_021]], 1
+; COMMON-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[CALL12]]
+; COMMON-NEXT:    br i1 [[EXITCOND_NOT]], label [[IF_END16]], label [[FOR_BODY]]
+; COMMON:       if.end16:
+; COMMON-NEXT:    ret void
+;
+entry:
+  tail call void @not_cold0()
+  %tobool.not = icmp eq i32 %x, 0
+  %call12 = tail call i32 @get_val()
+  br i1 %tobool.not, label %if.else11, label %if.then
+
+if.then:
+  %tobool1.not = icmp eq i32 %call12, 0
+  br i1 %tobool1.not, label %if.else, label %if.then2
+
+if.then2:
+  tail call void @cold1()
+  br label %if.end16
+
+if.else:
+  %call3 = tail call i32 @get_val()
+  %tobool4.not = icmp eq i32 %call3, 0
+  br i1 %tobool4.not, label %if.else6, label %if.then5
+
+if.then5:
+  tail call void @cold0()
+  br label %if.end16
+
+if.else6:
+  tail call void @not_cold0()
+  %call7 = tail call i32 @get_val()
+  switch i32 %call7, label %sw.default [
+  i32 0, label %sw.bb
+  i32 1, label %sw.bb8
+  i32 2, label %sw.bb9
+  ]
+
+sw.bb:
+  tail call void @not_cold0()
+  br label %call_cold
+
+sw.bb8:
+  tail call void @not_cold1()
+  br label %call_cold
+
+sw.bb9:
+  tail call void @not_cold2()
+  br label %call_cold
+
+sw.default:
+  tail call void @cold0()
+  br label %if.end16
+
+call_cold:
+  tail call void @cold_at_cb() cold
+  br label %if.end16
+
+if.else11:
+  %cmp = icmp slt i32 %call12, 1
+  br i1 %cmp, label %if.end14, label %for.body
+
+if.end14:
+  tail call void @cold1()
+  br label %if.end16
+
+for.body:
+  %i.021 = phi i32 [ %inc, %for.body ], [ 0, %if.else11 ]
+  tail call void @cold0()
+  %inc = add nuw nsw i32 %i.021, 1
+  %exitcond.not = icmp eq i32 %inc, %call12
+  br i1 %exitcond.not, label %if.end16, label %for.body
+
+if.end16:
+  ret void
+}
+
+define dso_local void @test_complex_fail(i32 noundef %x) {
+; COMMON-LABEL: define dso_local void @test_complex_fail
+; COMMON-SAME: (i32 noundef [[X:%.*]]) {
+; COMMON-NEXT:  entry:
+; COMMON-NEXT:    tail call void @not_cold0()
+; COMMON-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[X]], 0
+; COMMON-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_ELSE11:%.*]], label [[IF_THEN:%.*]]
+; COMMON:       if.then:
+; COMMON-NEXT:    [[CALL:%.*]] = tail call i32 @get_val()
+; COMMON-NEXT:    [[TOBOOL1_NOT:%.*]] = icmp eq i32 [[CALL]], 0
+; COMMON-NEXT:    br i1 [[TOBOOL1_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN2:%.*]]
+; COMMON:       if.then2:
+; COMMON-NEXT:    tail call void @cold1()
+; COMMON-NEXT:    br label [[IF_END12:%.*]]
+; COMMON:       if.else:
+; COMMON-NEXT:    [[CALL3:%.*]] = tail call i32 @get_val()
+; COMMON-NEXT:    [[TOBOOL4_NOT:%.*]] = icmp eq i32 [[CALL3]], 0
+; COMMON-NEXT:    br i1 [[TOBOOL4_NOT]], label [[IF_ELSE6:%.*]], label [[IF_THEN5:%.*]]
+; COMMON:       if.then5:
+; COMMON-NEXT:    tail call void @cold0()
+; COMMON-NEXT:    br label [[IF_END12]]
+; COMMON:       if.else6:
+; COMMON-NEXT:    tail call void @not_cold0()
+; COMMON-NEXT:    [[CALL7:%.*]] = tail call i32 @get_val()
+; COMMON-NEXT:    switch i32 [[CALL7]], label [[SW_DEFAULT:%.*]] [
+; COMMON-NEXT:      i32 0, label [[SW_BB:%.*]]
+; COMMON-NEXT:      i32 1, label [[SW_BB8:%.*]]
+; COMMON-NEXT:      i32 2, label [[SW_BB9:%.*]]
+; COMMON-NEXT:    ]
+; COMMON:       sw.bb:
+; COMMON-NEXT:    tail call void @not_cold0()
+; COMMON-NEXT:    br label [[CALL_COLD:%.*]]
+; COMMON:       sw.bb8:
+; COMMON-NEXT:    tail call void @not_cold1()
+; COMMON-NEXT:    br label [[CALL_COLD]]
+; COMMON:       sw.bb9:
+; COMMON-NEXT:    tail call void @not_cold2()
+; COMMON-NEXT:    br label [[IF_END12]]
+; COMMON:       sw.default:
+; COMMON-NEXT:    tail call void @cold0()
+; COMMON-NEXT:    br label [[IF_END12]]
+; COMMON:       call_cold:
+; COMMON-NEXT:    tail call void @cold_at_cb() #[[ATTR0]]
+; COMMON-NEXT:    br label [[IF_END12]]
+; COMMON:       if.else11:
+; COMMON-NEXT:    tail call void @cold0()
+; COMMON-NEXT:    br label [[IF_END12]]
+; COMMON:       if.end12:
+; COMMON-NEXT:    ret void
+;
+entry:
+  tail call void @not_cold0()
+  %tobool.not = icmp eq i32 %x, 0
+  br i1 %tobool.not, label %if.else11, label %if.then
+
+if.then:
+  %call = tail call i32 @get_val()
+  %tobool1.not = icmp eq i32 %call, 0
+  br i1 %tobool1.not, label %if.else, label %if.then2
+
+if.then2:
+  tail call void @cold1()
+  br label %if.end12
+
+if.else:
+  %call3 = tail call i32 @get_val()
+  %tobool4.not = icmp eq i32 %call3, 0
+  br i1 %tobool4.not, label %if.else6, label %if.then5
+
+if.then5:
+  tail call void @cold0()
+  br label %if.end12
+
+if.else6:
+  tail call void @not_cold0()
+  %call7 = tail call i32 @get_val()
+  switch i32 %call7, label %sw.default [
+  i32 0, label %sw.bb
+  i32 1, label %sw.bb8
+  i32 2, label %sw.bb9
+  ]
+
+sw.bb:
+  tail call void @not_cold0()
+  br label %call_cold
+
+sw.bb8:
+  tail call void @not_cold1()
+  br label %call_cold
+
+sw.bb9:
+  tail call void @not_cold2()
+  br label %if.end12
+
+sw.default:
+  tail call void @cold0()
+  br label %if.end12
+
+call_cold:
+  tail call void @cold_at_cb() cold
+  br label %if.end12
+
+if.else11:
+  tail call void @cold0()
+  br label %if.end12
+
+if.end12:
+  ret void
+}
+
+define dso_local void @test_complex2_fail(i32 noundef %x) {
+; COMMON-LABEL: define dso_local void @test_complex2_fail
+; COMMON-SAME: (i32 noundef [[X:%.*]]) {
+; COMMON-NEXT:  entry:
+; COMMON-NEXT:    tail call void @not_cold0()
+; COMMON-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[X]], 0
+; COMMON-NEXT:    [[CALL12:%.*]] = tail call i32 @get_val()
+; COMMON-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_ELSE11:%.*]], label [[IF_THEN:%.*]]
+; COMMON:       if.then:
+; COMMON-NEXT:    [[TOBOOL1_NOT:%.*]] = icmp eq i32 [[CALL12]], 0
+; COMMON-NEXT:    br i1 [[TOBOOL1_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN2:%.*]]
+; COMMON:       if.then2:
+; COMMON-NEXT:    tail call void @cold1()
+; COMMON-NEXT:    br label [[IF_END16:%.*]]
+; COMMON:       if.else:
+; COMMON-NEXT:    [[CALL3:%.*]] = tail call i32 @get_val()
+; COMMON-NEXT:    [[TOBOOL4_NOT:%.*]] = icmp eq i32 [[CALL3]], 0
+; COMMON-NEXT:    br i1 [[TOBOOL4_NOT]], label [[IF_ELSE6:%.*]], label [[IF_THEN5:%.*]]
+; COMMON:       if.then5:
+; COMMON-NEXT:    tail call void @cold0()
+; COMMON-NEXT:    br label [[IF_END16]]
+; COMMON:       if.else6:
+; COMMON-NEXT:    tail call void @not_cold0()
+; COMMON-NEXT:    [[CALL7:%.*]] = tail call i32 @get_val()
+; COMMON-NEXT:    switch i32 [[CALL7]], label [[SW_DEFAULT:%.*]] [
+; COMMON-NEXT:      i32 0, label [[SW_BB:%.*]]
+; COMMON-NEXT:      i32 1, label [[SW_BB8:%.*]]
+; COMMON-NEXT:      i32 2, label [[SW_BB9:%.*]]
+; COMMON-NEXT:    ]
+; COMMON:       sw.bb:
+; COMMON-NEXT:    tail call void @not_cold0()
+; COMMON-NEXT:    br label [[CALL_COLD:%.*]]
+; COMMON:       sw.bb8:
+; COMMON-NEXT:    tail call void @not_cold1()
+; COMMON-NEXT:    br label [[CALL_COLD]]
+; COMMON:       sw.bb9:
+; COMMON-NEXT:    tail call void @not_cold2()
+; COMMON-NEXT:    br label [[CALL_COLD]]
+; COMMON:       sw.default:
+; COMMON-NEXT:    tail call void @cold0()
+; COMMON-NEXT:    br label [[IF_END16]]
+; COMMON:       call_cold:
+; COMMON-NEXT:    tail call void @cold_at_cb() #[[ATTR0]]
+; COMMON-NEXT:    br label [[IF_END16]]
+; COMMON:       if.else11:
+; COMMON-NEXT:    [[CMP:%.*]] = icmp slt i32 [[CALL12]], 1
+; COMMON-NEXT:    br i1 [[CMP]], label [[IF_END14:%.*]], label [[FOR_BODY:%.*]]
+; COMMON:       if.end14:
+; COMMON-NEXT:    tail call void @not_cold1()
+; COMMON-NEXT:    br label [[IF_END16]]
+; COMMON:       for.body:
+; COMMON-NEXT:    [[I_021:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY]] ], [ 0, [[IF_ELSE11]] ]
+; COMMON-NEXT:    tail call void @cold0()
+; COMMON-NEXT:    [[INC]] = add nuw nsw i32 [[I_021]], 1
+; COMMON-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[CALL12]]
+; COMMON-NEXT:    br i1 [[EXITCOND_NOT]], label [[IF_END16]], label [[FOR_BODY]]
+; COMMON:       if.end16:
+; COMMON-NEXT:    ret void
+;
+entry:
+  tail call void @not_cold0()
+  %tobool.not = icmp eq i32 %x, 0
+  %call12 = tail call i32 @get_val()
+  br i1 %tobool.not, label %if.else11, label %if.then
+
+if.then:
+  %tobool1.not = icmp eq i32 %call12, 0
+  br i1 %tobool1.not, label %if.else, label %if.then2
+
+if.then2:
+  tail call void @cold1()
+  br label %if.end16
+
+if.else:
+  %call3 = tail call i32 @get_val()
+  %tobool4.not = icmp eq i32 %call3, 0
+  br i1 %tobool4.not, label %if.else6, label %if.then5
+
+if.then5:
+  tail call void @cold0()
+  br label %if.end16
+
+if.else6:
+  tail call void @not_cold0()
+  %call7 = tail call i32 @get_val()
+  switch i32 %call7, label %sw.default [
+  i32 0, label %sw.bb
+  i32 1, label %sw.bb8
+  i32 2, label %sw.bb9
+  ]
+
+sw.bb:
+  tail call void @not_cold0()
+  br label %call_cold
+
+sw.bb8:
+  tail call void @not_cold1()
+  br label %call_cold
+
+sw.bb9:
+  tail call void @not_cold2()
+  br label %call_cold
+
+sw.default:
+  tail call void @cold0()
+  br label %if.end16
+
+call_cold:
+  tail call void @cold_at_cb() cold
+  br label %if.end16
+
+if.else11:
+  %cmp = icmp slt i32 %call12, 1
+  br i1 %cmp, label %if.end14, label %for.body
+
+if.end14:
+  tail call void @not_cold1()
+  br label %if.end16
+
+for.body:
+  %i.021 = phi i32 [ %inc, %for.body ], [ 0, %if.else11 ]
+  tail call void @cold0()
+  %inc = add nuw nsw i32 %i.021, 1
+  %exitcond.not = icmp eq i32 %inc, %call12
+  br i1 %exitcond.not, label %if.end16, label %for.body
+
+if.end16:
+  ret void
+}
+
+;.
+; COMMON: attributes #[[ATTR0]] = { cold }
+; COMMON: attributes #[[ATTR1]] = { nofree norecurse noreturn nosync nounwind memory(none) }
+; COMMON: attributes #[[ATTR2]] = { noreturn }
+; COMMON: attributes #[[ATTR3]] = { hot }
+;.
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; ATTRIBUTOR: {{.*}}
+; FNATTRS: {{.*}}


        


More information about the llvm-commits mailing list