1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-- -mattr=-macrofusion,-branchfusion -post-RA-scheduler=0 | FileCheck %s --check-prefixes=NOFUSION,NOFUSION_NOPOSTRA 3; RUN: llc < %s -mtriple=x86_64-- -mattr=-macrofusion,+branchfusion -post-RA-scheduler=0 | FileCheck %s --check-prefixes=FUSION,BRANCHFUSIONONLY_NOPOSTRA 4; RUN: llc < %s -mtriple=x86_64-- -mattr=+macrofusion,-branchfusion -post-RA-scheduler=0 | FileCheck %s --check-prefixes=FUSION,MACROFUSION_NOPOSTRA 5; RUN: llc < %s -mtriple=x86_64-- -mattr=-macrofusion,-branchfusion -post-RA-scheduler=1 | FileCheck %s --check-prefixes=NOFUSION,NOFUSION_POSTRA 6; RUN: llc < %s -mtriple=x86_64-- -mattr=-macrofusion,+branchfusion -post-RA-scheduler=1 | FileCheck %s --check-prefixes=FUSION,BRANCHFUSION_POSTRA 7; RUN: llc < %s -mtriple=x86_64-- -mattr=+macrofusion,-branchfusion -post-RA-scheduler=1 | FileCheck %s --check-prefixes=FUSION,BRANCHFUSION_POSTRA 8; RUN: llc < %s -mtriple=x86_64-- -mattr=-macrofusion,-branchfusion -enable-misched=0 -misched-postra=1 -enable-post-misched | FileCheck %s --check-prefixes=NOFUSION,NOFUSION_MISCHEDPOSTRA 9; RUN: llc < %s -mtriple=x86_64-- -mattr=-macrofusion,+branchfusion -enable-misched=0 -misched-postra=1 -enable-post-misched | FileCheck %s --check-prefixes=FUSION,BRANCHFUSION_MISCHEDPOSTRA 10; RUN: llc < %s -mtriple=x86_64-- -mattr=+macrofusion,-branchfusion -enable-misched=0 -misched-postra=1 -enable-post-misched | FileCheck %s --check-prefixes=FUSION,BRANCHFUSION_MISCHEDPOSTRA 11 12 13 14; testb should be scheduled right before je to enable macro-fusion. 15 16define i32 @macrofuse_test_je(i32 %flags, ptr %p) nounwind { 17; NOFUSION-LABEL: macrofuse_test_je: 18; NOFUSION: # %bb.0: # %entry 19; NOFUSION-NEXT: xorl %eax, %eax 20; NOFUSION-NEXT: testl $512, %edi # imm = 0x200 21; NOFUSION-NEXT: movb $1, (%rsi) 22; NOFUSION-NEXT: je .LBB0_2 23; NOFUSION-NEXT: # %bb.1: # %if.then 24; NOFUSION-NEXT: movl $1, %eax 25; NOFUSION-NEXT: .LBB0_2: # %if.end 26; NOFUSION-NEXT: retq 27; 28; FUSION-LABEL: macrofuse_test_je: 29; FUSION: # %bb.0: # %entry 30; FUSION-NEXT: xorl %eax, %eax 31; FUSION-NEXT: movb $1, (%rsi) 32; FUSION-NEXT: testl $512, %edi # imm = 0x200 33; FUSION-NEXT: je .LBB0_2 34; FUSION-NEXT: # %bb.1: # %if.then 35; FUSION-NEXT: movl $1, %eax 36; FUSION-NEXT: .LBB0_2: # %if.end 37; FUSION-NEXT: retq 38entry: 39 %and = and i32 %flags, 512 40 %tobool = icmp eq i32 %and, 0 41 store i8 1, ptr %p 42 br i1 %tobool, label %if.end, label %if.then 43 44if.then: 45 br label %if.end 46 47if.end: 48 %hasflag = phi i32 [ 1, %if.then ], [ 0, %entry ] 49 ret i32 %hasflag 50} 51 52define i32 @macrofuse_cmp_je(i32 %flags, ptr %p) nounwind { 53; NOFUSION-LABEL: macrofuse_cmp_je: 54; NOFUSION: # %bb.0: # %entry 55; NOFUSION-NEXT: cmpl $512, %edi # imm = 0x200 56; NOFUSION-NEXT: movb $1, (%rsi) 57; NOFUSION-NEXT: je .LBB1_1 58; NOFUSION-NEXT: # %bb.2: # %if.then 59; NOFUSION-NEXT: movl $1, %eax 60; NOFUSION-NEXT: retq 61; NOFUSION-NEXT: .LBB1_1: 62; NOFUSION-NEXT: xorl %eax, %eax 63; NOFUSION-NEXT: retq 64; 65; FUSION-LABEL: macrofuse_cmp_je: 66; FUSION: # %bb.0: # %entry 67; FUSION-NEXT: movb $1, (%rsi) 68; FUSION-NEXT: cmpl $512, %edi # imm = 0x200 69; FUSION-NEXT: je .LBB1_1 70; FUSION-NEXT: # %bb.2: # %if.then 71; FUSION-NEXT: movl $1, %eax 72; FUSION-NEXT: retq 73; FUSION-NEXT: .LBB1_1: 74; FUSION-NEXT: xorl %eax, %eax 75; FUSION-NEXT: retq 76entry: 77 %sub = sub i32 %flags, 512 78 %tobool = icmp eq i32 %sub, 0 79 store i8 1, ptr %p 80 br i1 %tobool, label %if.end, label %if.then 81 82if.then: 83 br label %if.end 84 85if.end: 86 %hasflag = phi i32 [ 1, %if.then ], [ 0, %entry ] 87 ret i32 %hasflag 88} 89 90define i32 @macrofuse_alu_je(i32 %flags, ptr %p) nounwind { 91; NOFUSION_NOPOSTRA-LABEL: macrofuse_alu_je: 92; NOFUSION_NOPOSTRA: # %bb.0: # %entry 93; NOFUSION_NOPOSTRA-NEXT: movl %edi, %eax 94; NOFUSION_NOPOSTRA-NEXT: addl $-512, %eax # imm = 0xFE00 95; NOFUSION_NOPOSTRA-NEXT: movb $1, (%rsi) 96; NOFUSION_NOPOSTRA-NEXT: je .LBB2_2 97; NOFUSION_NOPOSTRA-NEXT: # %bb.1: # %if.then 98; NOFUSION_NOPOSTRA-NEXT: movl $1, %eax 99; NOFUSION_NOPOSTRA-NEXT: .LBB2_2: # %if.end 100; NOFUSION_NOPOSTRA-NEXT: retq 101; 102; BRANCHFUSIONONLY_NOPOSTRA-LABEL: macrofuse_alu_je: 103; BRANCHFUSIONONLY_NOPOSTRA: # %bb.0: # %entry 104; BRANCHFUSIONONLY_NOPOSTRA-NEXT: movl %edi, %eax 105; BRANCHFUSIONONLY_NOPOSTRA-NEXT: addl $-512, %eax # imm = 0xFE00 106; BRANCHFUSIONONLY_NOPOSTRA-NEXT: movb $1, (%rsi) 107; BRANCHFUSIONONLY_NOPOSTRA-NEXT: je .LBB2_2 108; BRANCHFUSIONONLY_NOPOSTRA-NEXT: # %bb.1: # %if.then 109; BRANCHFUSIONONLY_NOPOSTRA-NEXT: movl $1, %eax 110; BRANCHFUSIONONLY_NOPOSTRA-NEXT: .LBB2_2: # %if.end 111; BRANCHFUSIONONLY_NOPOSTRA-NEXT: retq 112; 113; MACROFUSION_NOPOSTRA-LABEL: macrofuse_alu_je: 114; MACROFUSION_NOPOSTRA: # %bb.0: # %entry 115; MACROFUSION_NOPOSTRA-NEXT: movl %edi, %eax 116; MACROFUSION_NOPOSTRA-NEXT: movb $1, (%rsi) 117; MACROFUSION_NOPOSTRA-NEXT: addl $-512, %eax # imm = 0xFE00 118; MACROFUSION_NOPOSTRA-NEXT: je .LBB2_2 119; MACROFUSION_NOPOSTRA-NEXT: # %bb.1: # %if.then 120; MACROFUSION_NOPOSTRA-NEXT: movl $1, %eax 121; MACROFUSION_NOPOSTRA-NEXT: .LBB2_2: # %if.end 122; MACROFUSION_NOPOSTRA-NEXT: retq 123; 124; NOFUSION_POSTRA-LABEL: macrofuse_alu_je: 125; NOFUSION_POSTRA: # %bb.0: # %entry 126; NOFUSION_POSTRA-NEXT: movl %edi, %eax 127; NOFUSION_POSTRA-NEXT: movb $1, (%rsi) 128; NOFUSION_POSTRA-NEXT: addl $-512, %eax # imm = 0xFE00 129; NOFUSION_POSTRA-NEXT: je .LBB2_2 130; NOFUSION_POSTRA-NEXT: # %bb.1: # %if.then 131; NOFUSION_POSTRA-NEXT: movl $1, %eax 132; NOFUSION_POSTRA-NEXT: .LBB2_2: # %if.end 133; NOFUSION_POSTRA-NEXT: retq 134; 135; BRANCHFUSION_POSTRA-LABEL: macrofuse_alu_je: 136; BRANCHFUSION_POSTRA: # %bb.0: # %entry 137; BRANCHFUSION_POSTRA-NEXT: movl %edi, %eax 138; BRANCHFUSION_POSTRA-NEXT: movb $1, (%rsi) 139; BRANCHFUSION_POSTRA-NEXT: addl $-512, %eax # imm = 0xFE00 140; BRANCHFUSION_POSTRA-NEXT: je .LBB2_2 141; BRANCHFUSION_POSTRA-NEXT: # %bb.1: # %if.then 142; BRANCHFUSION_POSTRA-NEXT: movl $1, %eax 143; BRANCHFUSION_POSTRA-NEXT: .LBB2_2: # %if.end 144; BRANCHFUSION_POSTRA-NEXT: retq 145; 146; NOFUSION_MISCHEDPOSTRA-LABEL: macrofuse_alu_je: 147; NOFUSION_MISCHEDPOSTRA: # %bb.0: # %entry 148; NOFUSION_MISCHEDPOSTRA-NEXT: movl %edi, %eax 149; NOFUSION_MISCHEDPOSTRA-NEXT: movb $1, (%rsi) 150; NOFUSION_MISCHEDPOSTRA-NEXT: addl $-512, %eax # imm = 0xFE00 151; NOFUSION_MISCHEDPOSTRA-NEXT: je .LBB2_2 152; NOFUSION_MISCHEDPOSTRA-NEXT: # %bb.1: # %if.then 153; NOFUSION_MISCHEDPOSTRA-NEXT: movl $1, %eax 154; NOFUSION_MISCHEDPOSTRA-NEXT: .LBB2_2: # %if.end 155; NOFUSION_MISCHEDPOSTRA-NEXT: retq 156; 157; BRANCHFUSION_MISCHEDPOSTRA-LABEL: macrofuse_alu_je: 158; BRANCHFUSION_MISCHEDPOSTRA: # %bb.0: # %entry 159; BRANCHFUSION_MISCHEDPOSTRA-NEXT: movl %edi, %eax 160; BRANCHFUSION_MISCHEDPOSTRA-NEXT: movb $1, (%rsi) 161; BRANCHFUSION_MISCHEDPOSTRA-NEXT: addl $-512, %eax # imm = 0xFE00 162; BRANCHFUSION_MISCHEDPOSTRA-NEXT: je .LBB2_2 163; BRANCHFUSION_MISCHEDPOSTRA-NEXT: # %bb.1: # %if.then 164; BRANCHFUSION_MISCHEDPOSTRA-NEXT: movl $1, %eax 165; BRANCHFUSION_MISCHEDPOSTRA-NEXT: .LBB2_2: # %if.end 166; BRANCHFUSION_MISCHEDPOSTRA-NEXT: retq 167entry: 168 %sub = sub i32 %flags, 512 169 %tobool = icmp eq i32 %sub, 0 170 store i8 1, ptr %p 171 br i1 %tobool, label %if.end, label %if.then 172 173if.then: 174 br label %if.end 175 176if.end: 177 %hasflag = phi i32 [ 1, %if.then ], [ %sub, %entry ] 178 ret i32 %hasflag 179} 180 181define i32 @macrofuse_dec_je(i32 %flags, ptr %p) nounwind { 182; NOFUSION_NOPOSTRA-LABEL: macrofuse_dec_je: 183; NOFUSION_NOPOSTRA: # %bb.0: # %entry 184; NOFUSION_NOPOSTRA-NEXT: movl %edi, %eax 185; NOFUSION_NOPOSTRA-NEXT: decl %eax 186; NOFUSION_NOPOSTRA-NEXT: movb $1, (%rsi) 187; NOFUSION_NOPOSTRA-NEXT: je .LBB3_2 188; NOFUSION_NOPOSTRA-NEXT: # %bb.1: # %if.then 189; NOFUSION_NOPOSTRA-NEXT: movl $1, %eax 190; NOFUSION_NOPOSTRA-NEXT: .LBB3_2: # %if.end 191; NOFUSION_NOPOSTRA-NEXT: retq 192; 193; BRANCHFUSIONONLY_NOPOSTRA-LABEL: macrofuse_dec_je: 194; BRANCHFUSIONONLY_NOPOSTRA: # %bb.0: # %entry 195; BRANCHFUSIONONLY_NOPOSTRA-NEXT: movl %edi, %eax 196; BRANCHFUSIONONLY_NOPOSTRA-NEXT: decl %eax 197; BRANCHFUSIONONLY_NOPOSTRA-NEXT: movb $1, (%rsi) 198; BRANCHFUSIONONLY_NOPOSTRA-NEXT: je .LBB3_2 199; BRANCHFUSIONONLY_NOPOSTRA-NEXT: # %bb.1: # %if.then 200; BRANCHFUSIONONLY_NOPOSTRA-NEXT: movl $1, %eax 201; BRANCHFUSIONONLY_NOPOSTRA-NEXT: .LBB3_2: # %if.end 202; BRANCHFUSIONONLY_NOPOSTRA-NEXT: retq 203; 204; MACROFUSION_NOPOSTRA-LABEL: macrofuse_dec_je: 205; MACROFUSION_NOPOSTRA: # %bb.0: # %entry 206; MACROFUSION_NOPOSTRA-NEXT: movl %edi, %eax 207; MACROFUSION_NOPOSTRA-NEXT: movb $1, (%rsi) 208; MACROFUSION_NOPOSTRA-NEXT: decl %eax 209; MACROFUSION_NOPOSTRA-NEXT: je .LBB3_2 210; MACROFUSION_NOPOSTRA-NEXT: # %bb.1: # %if.then 211; MACROFUSION_NOPOSTRA-NEXT: movl $1, %eax 212; MACROFUSION_NOPOSTRA-NEXT: .LBB3_2: # %if.end 213; MACROFUSION_NOPOSTRA-NEXT: retq 214; 215; NOFUSION_POSTRA-LABEL: macrofuse_dec_je: 216; NOFUSION_POSTRA: # %bb.0: # %entry 217; NOFUSION_POSTRA-NEXT: movl %edi, %eax 218; NOFUSION_POSTRA-NEXT: movb $1, (%rsi) 219; NOFUSION_POSTRA-NEXT: decl %eax 220; NOFUSION_POSTRA-NEXT: je .LBB3_2 221; NOFUSION_POSTRA-NEXT: # %bb.1: # %if.then 222; NOFUSION_POSTRA-NEXT: movl $1, %eax 223; NOFUSION_POSTRA-NEXT: .LBB3_2: # %if.end 224; NOFUSION_POSTRA-NEXT: retq 225; 226; BRANCHFUSION_POSTRA-LABEL: macrofuse_dec_je: 227; BRANCHFUSION_POSTRA: # %bb.0: # %entry 228; BRANCHFUSION_POSTRA-NEXT: movl %edi, %eax 229; BRANCHFUSION_POSTRA-NEXT: movb $1, (%rsi) 230; BRANCHFUSION_POSTRA-NEXT: decl %eax 231; BRANCHFUSION_POSTRA-NEXT: je .LBB3_2 232; BRANCHFUSION_POSTRA-NEXT: # %bb.1: # %if.then 233; BRANCHFUSION_POSTRA-NEXT: movl $1, %eax 234; BRANCHFUSION_POSTRA-NEXT: .LBB3_2: # %if.end 235; BRANCHFUSION_POSTRA-NEXT: retq 236; 237; NOFUSION_MISCHEDPOSTRA-LABEL: macrofuse_dec_je: 238; NOFUSION_MISCHEDPOSTRA: # %bb.0: # %entry 239; NOFUSION_MISCHEDPOSTRA-NEXT: movl %edi, %eax 240; NOFUSION_MISCHEDPOSTRA-NEXT: movb $1, (%rsi) 241; NOFUSION_MISCHEDPOSTRA-NEXT: decl %eax 242; NOFUSION_MISCHEDPOSTRA-NEXT: je .LBB3_2 243; NOFUSION_MISCHEDPOSTRA-NEXT: # %bb.1: # %if.then 244; NOFUSION_MISCHEDPOSTRA-NEXT: movl $1, %eax 245; NOFUSION_MISCHEDPOSTRA-NEXT: .LBB3_2: # %if.end 246; NOFUSION_MISCHEDPOSTRA-NEXT: retq 247; 248; BRANCHFUSION_MISCHEDPOSTRA-LABEL: macrofuse_dec_je: 249; BRANCHFUSION_MISCHEDPOSTRA: # %bb.0: # %entry 250; BRANCHFUSION_MISCHEDPOSTRA-NEXT: movl %edi, %eax 251; BRANCHFUSION_MISCHEDPOSTRA-NEXT: movb $1, (%rsi) 252; BRANCHFUSION_MISCHEDPOSTRA-NEXT: decl %eax 253; BRANCHFUSION_MISCHEDPOSTRA-NEXT: je .LBB3_2 254; BRANCHFUSION_MISCHEDPOSTRA-NEXT: # %bb.1: # %if.then 255; BRANCHFUSION_MISCHEDPOSTRA-NEXT: movl $1, %eax 256; BRANCHFUSION_MISCHEDPOSTRA-NEXT: .LBB3_2: # %if.end 257; BRANCHFUSION_MISCHEDPOSTRA-NEXT: retq 258entry: 259 %sub = sub i32 %flags, 1 260 %tobool = icmp eq i32 %sub, 0 261 store i8 1, ptr %p 262 br i1 %tobool, label %if.end, label %if.then 263 264if.then: 265 br label %if.end 266 267if.end: 268 %hasflag = phi i32 [ 1, %if.then ], [ %sub, %entry ] 269 ret i32 %hasflag 270} 271