227 lines · plain
1;; Tests that extending poison results in poison.2;; Also tests that there are no redundant instructions loading 0 into argument registers for unused arguments.3 4; REQUIRES: asserts5 6; REQUIRES: asserts7 8; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -debug-only=isel \9; RUN: %s -o - 2>&1 | FileCheck --check-prefix=CHECKISEL32 %s10 11; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -debug-only=isel \12; RUN: %s -o - 2>&1 | FileCheck --check-prefix=CHECKISEL64 %s13 14; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -filetype=asm \15; RUN: %s -o - 2>&1 | FileCheck --check-prefix=CHECKASM32 %s16 17; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -filetype=asm \18; RUN: %s -o - 2>&1 | FileCheck --check-prefix=CHECKASM64 %s19 20define void @bar32(i32 zeroext %var1, i32 noundef zeroext %var2) local_unnamed_addr {21entry:22 tail call void @foo32(i32 noundef zeroext %var2)23 ret void24}25 26declare void @foo32(i32 noundef zeroext) local_unnamed_addr27 28define void @test32() local_unnamed_addr {29entry:30 tail call void @bar32(i32 zeroext poison, i32 noundef zeroext 255)31 ret void32}33 34; CHECKISEL32: Initial selection DAG: %bb.0 'test32:entry'35; CHECKISEL32-NEXT: SelectionDAG has 18 nodes:36; CHECKISEL32-NEXT: t1: i32 = GlobalAddress<ptr @bar32> 037; CHECKISEL32-NEXT: t7: i32 = Register $r138; CHECKISEL32-NEXT: t0: ch,glue = EntryToken39; CHECKISEL32-NEXT: t6: ch,glue = callseq_start t0, TargetConstant:i32<56>, TargetConstant:i32<0>40; CHECKISEL32-NEXT: t9: ch,glue = CopyToReg t6, Register:i32 $r3, poison:i3241; CHECKISEL32-NEXT: t11: ch,glue = CopyToReg t9, Register:i32 $r4, Constant:i32<255>, t9:142; CHECKISEL32-NEXT: t15: ch,glue = PPCISD::CALL_NOP t11, MCSymbol:i32, Register:i32 $r3, Register:i32 $r4, Register:i32 $r2, RegisterMask:Untyped, t11:143; CHECKISEL32-NEXT: t16: ch,glue = callseq_end t15, TargetConstant:i32<56>, TargetConstant:i32<0>, t15:144; CHECKISEL32-NEXT: t17: ch = PPCISD::RET_GLUE t1645 46; CHECKASM32: .test32:47; CHECKASM32-NEXT: # %bb.0: # %entry48; CHECKASM32-NEXT: mflr 049; CHECKASM32-NEXT: stwu 1, -64(1)50; CHECKASM32-NEXT: li 4, 25551; CHECKASM32-NEXT: stw 0, 72(1)52; CHECKASM32-NEXT: bl .bar3253; CHECKASM32-NEXT: nop54; CHECKASM32-NEXT: addi 1, 1, 6455; CHECKASM32-NEXT: lwz 0, 8(1)56; CHECKASM32-NEXT: mtlr 057; CHECKASM32-NEXT: blr58 59; CHECKISEL64: Initial selection DAG: %bb.0 'test32:entry'60; CHECKISEL64-NEXT: SelectionDAG has 20 nodes:61; CHECKISEL64-NEXT: t1: i64 = GlobalAddress<ptr @bar32> 062; CHECKISEL64-NEXT: t2: i32 = poison63; CHECKISEL64-NEXT: t3: i32 = Constant<255>64; CHECKISEL64-NEXT: t7: i64 = Register $x165; CHECKISEL64-NEXT: t0: ch,glue = EntryToken66; CHECKISEL64-NEXT: t6: ch,glue = callseq_start t0, TargetConstant:i64<112>, TargetConstant:i64<0>67; CHECKISEL64-NEXT: t11: ch,glue = CopyToReg t6, Register:i64 $x3, poison:i6468; CHECKISEL64-NEXT: t13: ch,glue = CopyToReg t11, Register:i64 $x4, Constant:i64<255>, t11:169; CHECKISEL64-NEXT: t17: ch,glue = PPCISD::CALL_NOP t13, MCSymbol:i64, Register:i64 $x3, Register:i64 $x4, Register:i64 $x2, RegisterMask:Untyped, t13:170; CHECKISEL64-NEXT: t18: ch,glue = callseq_end t17, TargetConstant:i64<112>, TargetConstant:i64<0>, t17:171; CHECKISEL64-NEXT: t19: ch = PPCISD::RET_GLUE t1872 73; CHECKASM64: .test32:74; CHECKASM64-NEXT: # %bb.0: # %entry75; CHECKASM64-NEXT: mflr 076; CHECKASM64-NEXT: stdu 1, -112(1)77; CHECKASM64-NEXT: li 4, 25578; CHECKASM64-NEXT: std 0, 128(1)79; CHECKASM64-NEXT: bl .bar3280; CHECKASM64-NEXT: nop81; CHECKASM64-NEXT: addi 1, 1, 11282; CHECKASM64-NEXT: ld 0, 16(1)83; CHECKASM64-NEXT: mtlr 084; CHECKASM64-NEXT: blr85 86define void @bar8(i8 zeroext %var1, i8 noundef zeroext %var2) local_unnamed_addr {87entry:88 tail call void @foo8(i8 noundef zeroext %var2)89 ret void90}91 92declare void @foo8(i8 noundef zeroext) local_unnamed_addr93 94define void @test8() local_unnamed_addr {95entry:96 tail call void @bar8(i8 zeroext poison, i8 noundef zeroext 255)97 ret void98}99 100; CHECKISEL32: Initial selection DAG: %bb.0 'test8:entry'101; CHECKISEL32-NEXT: SelectionDAG has 20 nodes:102; CHECKISEL32-NEXT: t1: i32 = GlobalAddress<ptr @bar8> 0103; CHECKISEL32-NEXT: t2: i8 = poison104; CHECKISEL32-NEXT: t3: i8 = Constant<-1>105; CHECKISEL32-NEXT: t9: i32 = Register $r1106; CHECKISEL32-NEXT: t0: ch,glue = EntryToken107; CHECKISEL32-NEXT: t8: ch,glue = callseq_start t0, TargetConstant:i32<56>, TargetConstant:i32<0>108; CHECKISEL32-NEXT: t11: ch,glue = CopyToReg t8, Register:i32 $r3, poison:i32109; CHECKISEL32-NEXT: t13: ch,glue = CopyToReg t11, Register:i32 $r4, Constant:i32<255>, t11:1110; CHECKISEL32-NEXT: t17: ch,glue = PPCISD::CALL_NOP t13, MCSymbol:i32, Register:i32 $r3, Register:i32 $r4, Register:i32 $r2, RegisterMask:Untyped, t13:1111; CHECKISEL32-NEXT: t18: ch,glue = callseq_end t17, TargetConstant:i32<56>, TargetConstant:i32<0>, t17:1112; CHECKISEL32-NEXT: t19: ch = PPCISD::RET_GLUE t18113 114; CHECKASM32: .test8:115; CHECKASM32-NEXT: # %bb.0: # %entry116; CHECKASM32-NEXT: mflr 0117; CHECKASM32-NEXT: stwu 1, -64(1)118; CHECKASM32-NEXT: li 4, 255119; CHECKASM32-NEXT: stw 0, 72(1)120; CHECKASM32-NEXT: bl .bar8121; CHECKASM32-NEXT: nop122; CHECKASM32-NEXT: addi 1, 1, 64123; CHECKASM32-NEXT: lwz 0, 8(1)124; CHECKASM32-NEXT: mtlr 0125; CHECKASM32-NEXT: blr126 127; CHECKASM64: .test8:128; CHECKASM64-NEXT: # %bb.0: # %entry129; CHECKASM64-NEXT: mflr 0130; CHECKASM64-NEXT: stdu 1, -112(1)131; CHECKASM64-NEXT: li 4, 255132; CHECKASM64-NEXT: std 0, 128(1)133; CHECKASM64-NEXT: bl .bar8134; CHECKASM64-NEXT: nop135; CHECKASM64-NEXT: addi 1, 1, 112136; CHECKASM64-NEXT: ld 0, 16(1)137; CHECKASM64-NEXT: mtlr 0138; CHECKASM64-NEXT: blr139 140; CHECKISEL64: Initial selection DAG: %bb.0 'test8:entry'141; CHECKISEL64-NEXT: SelectionDAG has 22 nodes:142; CHECKISEL64-NEXT: t1: i64 = GlobalAddress<ptr @bar8> 0143; CHECKISEL64-NEXT: t2: i8 = poison144; CHECKISEL64-NEXT: t3: i8 = Constant<-1>145; CHECKISEL64-NEXT: t4: i32 = poison146; CHECKISEL64-NEXT: t5: i32 = Constant<255>147; CHECKISEL64-NEXT: t9: i64 = Register $x1148; CHECKISEL64-NEXT: t0: ch,glue = EntryToken149; CHECKISEL64-NEXT: t8: ch,glue = callseq_start t0, TargetConstant:i64<112>, TargetConstant:i64<0>150; CHECKISEL64-NEXT: t13: ch,glue = CopyToReg t8, Register:i64 $x3, poison:i64151; CHECKISEL64-NEXT: t15: ch,glue = CopyToReg t13, Register:i64 $x4, Constant:i64<255>, t13:1152; CHECKISEL64-NEXT: t19: ch,glue = PPCISD::CALL_NOP t15, MCSymbol:i64, Register:i64 $x3, Register:i64 $x4, Register:i64 $x2, RegisterMask:Untyped, t15:1153; CHECKISEL64-NEXT: t20: ch,glue = callseq_end t19, TargetConstant:i64<112>, TargetConstant:i64<0>, t19:1154; CHECKISEL64-NEXT: t21: ch = PPCISD::RET_GLUE t20155 156 157define void @bar64(i64 zeroext %var1, i64 noundef zeroext %var2) local_unnamed_addr {158entry:159 tail call void @foo64(i64 noundef zeroext %var2)160 ret void161}162 163declare void @foo64(i64 noundef zeroext) local_unnamed_addr164 165; Function Attrs: noinline nounwind166define void @test64() local_unnamed_addr {167entry:168 tail call void @bar64(i64 zeroext poison, i64 noundef zeroext 255)169 ret void170}171 172; CHECKISEL32: Initial selection DAG: %bb.0 'test64:entry'173; CHECKISEL32-NEXT: SelectionDAG has 27 nodes:174; CHECKISEL32-NEXT: t1: i32 = GlobalAddress<ptr @bar64> 0175; CHECKISEL32-NEXT: t3: i64 = Constant<255>176; CHECKISEL32-NEXT: t12: i32 = Register $r1177; CHECKISEL32-NEXT: t0: ch,glue = EntryToken178; CHECKISEL32-NEXT: t11: ch,glue = callseq_start t0, TargetConstant:i32<56>, TargetConstant:i32<0>179; CHECKISEL32-NEXT: t5: i32 = extract_element poison:i64, Constant:i32<1>180; CHECKISEL32-NEXT: t14: ch,glue = CopyToReg t11, Register:i32 $r3, t5181; CHECKISEL32-NEXT: t7: i32 = extract_element poison:i64, Constant:i32<0>182; CHECKISEL32-NEXT: t16: ch,glue = CopyToReg t14, Register:i32 $r4, t7, t14:1183; CHECKISEL32-NEXT: t18: ch,glue = CopyToReg t16, Register:i32 $r5, Constant:i32<0>, t16:1184; CHECKISEL32-NEXT: t20: ch,glue = CopyToReg t18, Register:i32 $r6, Constant:i32<255>, t18:1185; CHECKISEL32-NEXT: t24: ch,glue = PPCISD::CALL_NOP t20, MCSymbol:i32, Register:i32 $r3, Register:i32 $r4, Register:i32 $r5, Register:i32 $r6, Register:i32 $r2, RegisterMask:Untyped, t20:1186; CHECKISEL32-NEXT: t25: ch,glue = callseq_end t24, TargetConstant:i32<56>, TargetConstant:i32<0>, t24:1187; CHECKISEL32-NEXT: t26: ch = PPCISD::RET_GLUE t25188 189; CHECKASM32: .test64:190; CHECKASM32-NEXT: # %bb.0: # %entry191; CHECKASM32-NEXT: mflr 0192; CHECKASM32-NEXT: stwu 1, -64(1)193; CHECKASM32-NEXT: li 5, 0194; CHECKASM32-NEXT: li 6, 255195; CHECKASM32-NEXT: stw 0, 72(1)196; CHECKASM32-NEXT: bl .bar64197; CHECKASM32-NEXT: nop198; CHECKASM32-NEXT: addi 1, 1, 64199; CHECKASM32-NEXT: lwz 0, 8(1)200; CHECKASM32-NEXT: mtlr 0201; CHECKASM32-NEXT: blr202 203; CHECKISEL64: Initial selection DAG: %bb.0 'test64:entry'204; CHECKISEL64-NEXT: SelectionDAG has 18 nodes:205; CHECKISEL64-NEXT: t1: i64 = GlobalAddress<ptr @bar64> 0206; CHECKISEL64-NEXT: t7: i64 = Register $x1207; CHECKISEL64-NEXT: t0: ch,glue = EntryToken208; CHECKISEL64-NEXT: t6: ch,glue = callseq_start t0, TargetConstant:i64<112>, TargetConstant:i64<0>209; CHECKISEL64-NEXT: t9: ch,glue = CopyToReg t6, Register:i64 $x3, poison:i64210; CHECKISEL64-NEXT: t11: ch,glue = CopyToReg t9, Register:i64 $x4, Constant:i64<255>, t9:1211; CHECKISEL64-NEXT: t15: ch,glue = PPCISD::CALL_NOP t11, MCSymbol:i64, Register:i64 $x3, Register:i64 $x4, Register:i64 $x2, RegisterMask:Untyped, t11:1212; CHECKISEL64-NEXT: t16: ch,glue = callseq_end t15, TargetConstant:i64<112>, TargetConstant:i64<0>, t15:1213; CHECKISEL64-NEXT: t17: ch = PPCISD::RET_GLUE t16214 215; CHECKASM64: .test64:216; CHECKASM64-NEXT: # %bb.0: # %entry217; CHECKASM64-NEXT: mflr 0218; CHECKASM64-NEXT: stdu 1, -112(1)219; CHECKASM64-NEXT: li 4, 255220; CHECKASM64-NEXT: std 0, 128(1)221; CHECKASM64-NEXT: bl .bar64222; CHECKASM64-NEXT: nop223; CHECKASM64-NEXT: addi 1, 1, 112224; CHECKASM64-NEXT: ld 0, 16(1)225; CHECKASM64-NEXT: mtlr 0226; CHECKASM64-NEXT: blr227