1; RUN: llvm-reduce --abort-on-invalid-reduction --delta-passes=instruction-flags --test FileCheck --test-arg --check-prefixes=INTERESTING,CHECK --test-arg %s --test-arg --input-file %s -o %t 2; RUN: FileCheck -check-prefixes=RESULT,CHECK %s < %t 3 4; CHECK-LABEL: @add_nuw_nsw_none( 5; INTERESTING: = add 6; RESULT: add i32 7define i32 @add_nuw_nsw_none(i32 %a, i32 %b) { 8 %op = add nuw nsw i32 %a, %b 9 ret i32 %op 10} 11 12; CHECK-LABEL: @add_nuw_nsw_keep_nuw( 13; INTERESTING: nuw 14; RESULT: add nuw i32 15define i32 @add_nuw_nsw_keep_nuw(i32 %a, i32 %b) { 16 %op = add nuw nsw i32 %a, %b 17 ret i32 %op 18} 19 20; CHECK-LABEL: @add_nuw_nsw_keep_nsw( 21; INTERESTING: nuw 22; RESULT: add nuw i32 23define i32 @add_nuw_nsw_keep_nsw(i32 %a, i32 %b) { 24 %op = add nuw nsw i32 %a, %b 25 ret i32 %op 26} 27 28; CHECK-LABEL: @add_nuw_keep_nuw( 29; INTERESTING: nuw 30; RESULT: add nuw i32 31define i32 @add_nuw_keep_nuw(i32 %a, i32 %b) { 32 %op = add nuw i32 %a, %b 33 ret i32 %op 34} 35 36; CHECK-LABEL: @add_nsw_keep_nsw( 37; INTERESTING: nsw 38; RESULT: add nsw i32 39define i32 @add_nsw_keep_nsw(i32 %a, i32 %b) { 40 %op = add nsw i32 %a, %b 41 ret i32 %op 42} 43 44; CHECK-LABEL: @ashr_exact_drop( 45; INTERESTING: = ashr 46; RESULT: ashr i32 47define i32 @ashr_exact_drop(i32 %a, i32 %b) { 48 %op = ashr exact i32 %a, %b 49 ret i32 %op 50} 51 52; CHECK-LABEL: @ashr_exact_keep( 53; INTERESTING: exact 54; RESULT: ashr exact i32 55define i32 @ashr_exact_keep(i32 %a, i32 %b) { 56 %op = ashr exact i32 %a, %b 57 ret i32 %op 58} 59 60; CHECK-LABEL: @getelementptr_inbounds_nuw_drop_both( 61; INTERESTING: getelementptr 62; RESULT: getelementptr i32, ptr %a, i64 %b 63define ptr @getelementptr_inbounds_nuw_drop_both(ptr %a, i64 %b) { 64 %op = getelementptr inbounds nuw i32, ptr %a, i64 %b 65 ret ptr %op 66} 67 68; CHECK-LABEL: @getelementptr_inbounds_keep_only_inbounds( 69; INTERESTING: inbounds 70; RESULT: getelementptr inbounds i32, ptr %a, i64 %b 71define ptr @getelementptr_inbounds_keep_only_inbounds(ptr %a, i64 %b) { 72 %op = getelementptr inbounds nuw i32, ptr %a, i64 %b 73 ret ptr %op 74} 75 76; CHECK-LABEL: @getelementptr_inbounds_relax_to_nusw( 77; INTERESTING: getelementptr {{inbounds|nusw}} 78; RESULT: getelementptr nusw i32, ptr %a, i64 %b 79define ptr @getelementptr_inbounds_relax_to_nusw(ptr %a, i64 %b) { 80 %op = getelementptr inbounds i32, ptr %a, i64 %b 81 ret ptr %op 82} 83 84; CHECK-LABEL: @fadd_reassoc_none( 85; INTERESTING: = fadd 86; RESULT: fadd float 87define float @fadd_reassoc_none(float %a, float %b) { 88 %op = fadd reassoc float %a, %b 89 ret float %op 90} 91 92; CHECK-LABEL: @fadd_reassoc_keep( 93; INTERESTING: fadd reassoc 94; RESULT: fadd reassoc float 95define float @fadd_reassoc_keep(float %a, float %b) { 96 %op = fadd reassoc float %a, %b 97 ret float %op 98} 99 100; CHECK-LABEL: @fadd_nnan_none( 101; INTERESTING: = fadd 102; RESULT: fadd float 103define float @fadd_nnan_none(float %a, float %b) { 104 %op = fadd nnan float %a, %b 105 ret float %op 106} 107 108; CHECK-LABEL: @fadd_nnan_keep( 109; INTERESTING: fadd nnan 110; RESULT: fadd nnan float 111define float @fadd_nnan_keep(float %a, float %b) { 112 %op = fadd nnan float %a, %b 113 ret float %op 114} 115 116; CHECK-LABEL: @fadd_ninf_none( 117; INTERESTING: = fadd 118; RESULT: fadd float 119define float @fadd_ninf_none(float %a, float %b) { 120 %op = fadd ninf float %a, %b 121 ret float %op 122} 123 124; CHECK-LABEL: @fadd_ninf_keep( 125; INTERESTING: fadd ninf 126; RESULT: fadd ninf float 127define float @fadd_ninf_keep(float %a, float %b) { 128 %op = fadd ninf float %a, %b 129 ret float %op 130} 131 132; CHECK-LABEL: @fadd_nsz_none( 133; INTERESTING: = fadd 134; RESULT: fadd float 135define float @fadd_nsz_none(float %a, float %b) { 136 %op = fadd nsz float %a, %b 137 ret float %op 138} 139 140; CHECK-LABEL: @fadd_nsz_keep( 141; INTERESTING: fadd nsz 142; RESULT: fadd nsz float 143define float @fadd_nsz_keep(float %a, float %b) { 144 %op = fadd nsz float %a, %b 145 ret float %op 146} 147 148; CHECK-LABEL: @fadd_arcp_none( 149; INTERESTING: = fadd 150; RESULT: fadd float 151define float @fadd_arcp_none(float %a, float %b) { 152 %op = fadd arcp float %a, %b 153 ret float %op 154} 155 156; CHECK-LABEL: @fadd_arcp_keep( 157; INTERESTING: fadd arcp 158; RESULT: fadd arcp float 159define float @fadd_arcp_keep(float %a, float %b) { 160 %op = fadd arcp float %a, %b 161 ret float %op 162} 163 164; CHECK-LABEL: @fadd_contract_none( 165; INTERESTING: = fadd 166; RESULT: fadd float 167define float @fadd_contract_none(float %a, float %b) { 168 %op = fadd contract float %a, %b 169 ret float %op 170} 171 172; CHECK-LABEL: @fadd_contract_keep( 173; INTERESTING: fadd contract 174; RESULT: fadd contract float 175define float @fadd_contract_keep(float %a, float %b) { 176 %op = fadd contract float %a, %b 177 ret float %op 178} 179 180; CHECK-LABEL: @fadd_afn_none( 181; INTERESTING: = fadd 182; RESULT: fadd float 183define float @fadd_afn_none(float %a, float %b) { 184 %op = fadd afn float %a, %b 185 ret float %op 186} 187 188; CHECK-LABEL: @fadd_afn_keep( 189; INTERESTING: fadd afn 190; RESULT: fadd afn float 191define float @fadd_afn_keep(float %a, float %b) { 192 %op = fadd afn float %a, %b 193 ret float %op 194} 195 196; CHECK-LABEL: @fadd_fast_none( 197; INTERESTING: = fadd 198; RESULT: fadd float 199define float @fadd_fast_none(float %a, float %b) { 200 %op = fadd fast float %a, %b 201 ret float %op 202} 203 204; CHECK-LABEL: @fadd_nnan_ninf_keep_nnan( 205; INTERESTING: nnan 206; RESULT: fadd nnan float 207define float @fadd_nnan_ninf_keep_nnan(float %a, float %b) { 208 %op = fadd nnan ninf float %a, %b 209 ret float %op 210} 211 212; CHECK-LABEL: @zext_nneg_drop( 213; INTERESTING: = zext 214; RESULT: zext i32 215define i64 @zext_nneg_drop(i32 %a) { 216 %op = zext nneg i32 %a to i64 217 ret i64 %op 218} 219 220; CHECK-LABEL: @zext_nneg_keep( 221; INTERESTING: = zext nneg 222; RESULT: zext nneg i32 223define i64 @zext_nneg_keep(i32 %a) { 224 %op = zext nneg i32 %a to i64 225 ret i64 %op 226} 227 228; CHECK-LABEL: @or_disjoint_drop( 229; INTERESTING: = or 230; RESULT: or i32 231define i32 @or_disjoint_drop(i32 %a, i32 %b) { 232 %op = or disjoint i32 %a, %b 233 ret i32 %op 234} 235 236; CHECK-LABEL: @or_disjoint_keep( 237; INTERESTING: = or disjoint 238; RESULT: or disjoint i32 239define i32 @or_disjoint_keep(i32 %a, i32 %b) { 240 %op = or disjoint i32 %a, %b 241 ret i32 %op 242} 243 244; CHECK-LABEL: @trunc_nuw_drop( 245; INTERESTING: = trunc 246; RESULT: trunc i64 247define i32 @trunc_nuw_drop(i64 %a) { 248 %op = trunc nuw i64 %a to i32 249 ret i32 %op 250} 251 252; CHECK-LABEL: @trunc_nuw_keep( 253; INTERESTING: = trunc nuw 254; RESULT: trunc nuw i64 255define i32 @trunc_nuw_keep(i64 %a) { 256 %op = trunc nuw i64 %a to i32 257 ret i32 %op 258} 259 260; CHECK-LABEL: @trunc_nsw_drop( 261; INTERESTING: = trunc 262; RESULT: trunc i64 263define i32 @trunc_nsw_drop(i64 %a) { 264 %op = trunc nsw i64 %a to i32 265 ret i32 %op 266} 267 268; CHECK-LABEL: @trunc_nsw_keep( 269; INTERESTING: = trunc nsw 270; RESULT: trunc nsw i64 271define i32 @trunc_nsw_keep(i64 %a) { 272 %op = trunc nsw i64 %a to i32 273 ret i32 %op 274} 275 276; CHECK-LABEL: @icmp_samesign_drop( 277; INTERESTING: = icmp 278; RESULT: icmp ult i32 279define i1 @icmp_samesign_drop(i32 %a) { 280 %op = icmp samesign ult i32 %a, 10 281 ret i1 %op 282} 283 284; CHECK-LABEL: @icmp_samesign_keep( 285; INTERESTING: = icmp samesign 286; RESULT: icmp samesign ult i32 287define i1 @icmp_samesign_keep(i32 %a) { 288 %op = icmp samesign ult i32 %a, 10 289 ret i1 %op 290} 291