| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 | |
| ; RUN: llc -verify-machineinstrs < %s -O3 -mcpu=ppc -mtriple powerpc-ibm-aix \ | |
| ; RUN: -ppc-asm-full-reg-names | FileCheck %s | |
| define i32 @foo(i32 noundef signext %x) { | |
| ; CHECK-LABEL: foo: | |
| ; CHECK: # %bb.0: # %entry | |
| ; CHECK-NEXT: mflr r0 | |
| ; CHECK-NEXT: stwu r1, -64(r1) | |
| ; CHECK-NEXT: stw r0, 72(r1) | |
| ; CHECK-NEXT: cmpwi r3, 8 | |
| ; CHECK-NEXT: stw r31, 60(r1) # 4-byte Folded Spill | |
| ; CHECK-NEXT: mr r31, r3 | |
| ; CHECK-NEXT: li r3, 0 | |
| ; CHECK-NEXT: ble cr0, L..BB0_4 | |
| ; CHECK-NEXT: # %bb.1: # %entry | |
| ; CHECK-NEXT: cmpwi r31, 11 | |
| ; CHECK-NEXT: bge cr0, L..BB0_7 | |
| ; CHECK-NEXT: # %bb.2: # %entry | |
| ; CHECK-NEXT: cmplwi r31, 9 | |
| ; CHECK-NEXT: beq cr0, L..BB0_9 | |
| ; CHECK-NEXT: # %bb.3: # %entry | |
| ; CHECK-NEXT: cmplwi r31, 10 | |
| ; CHECK-NEXT: beq cr0, L..BB0_11 | |
| ; CHECK-NEXT: b L..BB0_13 | |
| ; CHECK-NEXT: L..BB0_4: # %entry | |
| ; CHECK-NEXT: cmplwi r31, 4 | |
| ; CHECK-NEXT: beq cr0, L..BB0_12 | |
| ; CHECK-NEXT: # %bb.5: # %entry | |
| ; CHECK-NEXT: cmplwi r31, 7 | |
| ; CHECK-NEXT: beq cr0, L..BB0_11 | |
| ; CHECK-NEXT: # %bb.6: # %entry | |
| ; CHECK-NEXT: cmplwi r31, 8 | |
| ; CHECK-NEXT: beq cr0, L..BB0_10 | |
| ; CHECK-NEXT: b L..BB0_13 | |
| ; CHECK-NEXT: L..BB0_7: # %entry | |
| ; CHECK-NEXT: beq cr0, L..BB0_10 | |
| ; CHECK-NEXT: # %bb.8: # %entry | |
| ; CHECK-NEXT: cmplwi r31, 12 | |
| ; CHECK-NEXT: bne cr0, L..BB0_13 | |
| ; CHECK-NEXT: L..BB0_9: # %sw.bb2 | |
| ; CHECK-NEXT: mr r3, r31 | |
| ; CHECK-NEXT: bl .foo3[PR] | |
| ; CHECK-NEXT: nop | |
| ; CHECK-NEXT: mr r3, r31 | |
| ; CHECK-NEXT: b L..BB0_13 | |
| ; CHECK-NEXT: L..BB0_10: # %sw.bb1 | |
| ; CHECK-NEXT: mr r3, r31 | |
| ; CHECK-NEXT: bl .foo2[PR] | |
| ; CHECK-NEXT: nop | |
| ; CHECK-NEXT: mr r3, r31 | |
| ; CHECK-NEXT: b L..BB0_13 | |
| ; CHECK-NEXT: L..BB0_11: # %sw.bb | |
| ; CHECK-NEXT: mr r3, r31 | |
| ; CHECK-NEXT: bl .foo1[PR] | |
| ; CHECK-NEXT: nop | |
| ; CHECK-NEXT: mr r3, r31 | |
| ; CHECK-NEXT: b L..BB0_13 | |
| ; CHECK-NEXT: L..BB0_12: # %sw.bb3 | |
| ; CHECK-NEXT: li r3, 4 | |
| ; CHECK-NEXT: bl .foo4[PR] | |
| ; CHECK-NEXT: nop | |
| ; CHECK-NEXT: li r3, 4 | |
| ; CHECK-NEXT: L..BB0_13: # %return | |
| ; CHECK-NEXT: lwz r31, 60(r1) # 4-byte Folded Reload | |
| ; CHECK-NEXT: addi r1, r1, 64 | |
| ; CHECK-NEXT: lwz r0, 8(r1) | |
| ; CHECK-NEXT: mtlr r0 | |
| ; CHECK-NEXT: blr | |
| entry: | |
| switch i32 %x, label %return [ | |
| i32 7, label %sw.bb | |
| i32 10, label %sw.bb | |
| i32 8, label %sw.bb1 | |
| i32 11, label %sw.bb1 | |
| i32 9, label %sw.bb2 | |
| i32 12, label %sw.bb2 | |
| i32 4, label %sw.bb3 | |
| ] | |
| sw.bb: ; preds = %entry, %entry | |
| tail call void @foo1(i32 noundef signext %x) | |
| br label %return | |
| sw.bb1: ; preds = %entry, %entry | |
| tail call void @foo2(i32 noundef signext %x) | |
| br label %return | |
| sw.bb2: ; preds = %entry, %entry | |
| tail call void @foo3(i32 noundef signext %x) | |
| br label %return | |
| sw.bb3: ; preds = %entry | |
| tail call void @foo4(i32 noundef signext 4) | |
| br label %return | |
| return: ; preds = %sw.bb, %sw.bb1, %sw.bb2, %sw.bb3, %entry | |
| %retval.0 = phi i32 [ 0, %entry ], [ 4, %sw.bb3 ], [ %x, %sw.bb2 ], [ %x, %sw.bb1 ], [ %x, %sw.bb ] | |
| ret i32 %retval.0 | |
| } | |
| define i32 @goo(i32 noundef signext %x) { | |
| ; CHECK-LABEL: goo: | |
| ; CHECK: # %bb.0: # %entry | |
| ; CHECK-NEXT: mflr r0 | |
| ; CHECK-NEXT: stwu r1, -64(r1) | |
| ; CHECK-NEXT: stw r0, 72(r1) | |
| ; CHECK-NEXT: cmplwi r3, 12 | |
| ; CHECK-NEXT: stw r31, 60(r1) # 4-byte Folded Spill | |
| ; CHECK-NEXT: mr r31, r3 | |
| ; CHECK-NEXT: bgt cr0, L..BB1_7 | |
| ; CHECK-NEXT: # %bb.1: # %entry | |
| ; CHECK-NEXT: li r3, 1 | |
| ; CHECK-NEXT: slw r3, r3, r31 | |
| ; CHECK-NEXT: andi. r4, r3, 5632 | |
| ; CHECK-NEXT: bne cr0, L..BB1_4 | |
| ; CHECK-NEXT: # %bb.2: # %entry | |
| ; CHECK-NEXT: andi. r3, r3, 2304 | |
| ; CHECK-NEXT: beq cr0, L..BB1_5 | |
| ; CHECK-NEXT: # %bb.3: # %sw.bb1 | |
| ; CHECK-NEXT: mr r3, r31 | |
| ; CHECK-NEXT: bl .foo2[PR] | |
| ; CHECK-NEXT: nop | |
| ; CHECK-NEXT: b L..BB1_9 | |
| ; CHECK-NEXT: L..BB1_4: # %sw.bb2 | |
| ; CHECK-NEXT: mr r3, r31 | |
| ; CHECK-NEXT: bl .foo3[PR] | |
| ; CHECK-NEXT: nop | |
| ; CHECK-NEXT: b L..BB1_9 | |
| ; CHECK-NEXT: L..BB1_5: # %entry | |
| ; CHECK-NEXT: cmplwi r31, 7 | |
| ; CHECK-NEXT: bne cr0, L..BB1_7 | |
| ; CHECK-NEXT: # %bb.6: # %sw.bb | |
| ; CHECK-NEXT: li r3, 7 | |
| ; CHECK-NEXT: li r31, 7 | |
| ; CHECK-NEXT: bl .foo1[PR] | |
| ; CHECK-NEXT: nop | |
| ; CHECK-NEXT: b L..BB1_9 | |
| ; CHECK-NEXT: L..BB1_7: # %entry | |
| ; CHECK-NEXT: cmplwi r31, 4 | |
| ; CHECK-NEXT: li r31, 0 | |
| ; CHECK-NEXT: bne cr0, L..BB1_9 | |
| ; CHECK-NEXT: # %bb.8: # %sw.bb3 | |
| ; CHECK-NEXT: li r3, 4 | |
| ; CHECK-NEXT: li r31, 4 | |
| ; CHECK-NEXT: bl .foo4[PR] | |
| ; CHECK-NEXT: nop | |
| ; CHECK-NEXT: L..BB1_9: # %return | |
| ; CHECK-NEXT: mr r3, r31 | |
| ; CHECK-NEXT: lwz r31, 60(r1) # 4-byte Folded Reload | |
| ; CHECK-NEXT: addi r1, r1, 64 | |
| ; CHECK-NEXT: lwz r0, 8(r1) | |
| ; CHECK-NEXT: mtlr r0 | |
| ; CHECK-NEXT: blr | |
| entry: | |
| switch i32 %x, label %return [ | |
| i32 7, label %sw.bb | |
| i32 8, label %sw.bb1 | |
| i32 11, label %sw.bb1 | |
| i32 9, label %sw.bb2 | |
| i32 10, label %sw.bb2 | |
| i32 12, label %sw.bb2 | |
| i32 4, label %sw.bb3 | |
| ] | |
| sw.bb: ; preds = %entry | |
| tail call void @foo1(i32 noundef signext 7) | |
| br label %return | |
| sw.bb1: ; preds = %entry, %entry | |
| tail call void @foo2(i32 noundef signext %x) | |
| br label %return | |
| sw.bb2: ; preds = %entry, %entry, %entry | |
| tail call void @foo3(i32 noundef signext %x) | |
| br label %return | |
| sw.bb3: ; preds = %entry | |
| tail call void @foo4(i32 noundef signext 4) | |
| br label %return | |
| return: ; preds = %sw.bb, %sw.bb1, %sw.bb2, %sw.bb3, %entry | |
| %retval.0 = phi i32 [ 0, %entry ], [ 4, %sw.bb3 ], [ %x, %sw.bb2 ], [ %x, %sw.bb1 ], [ 7, %sw.bb ] | |
| ret i32 %retval.0 | |
| } | |
| declare void @foo1(i32 noundef signext) | |
| declare void @foo2(i32 noundef signext) | |
| declare void @foo3(i32 noundef signext) | |
| declare void @foo4(i32 noundef signext) |