1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 2; RUN: opt -p loop-vectorize -S %s | FileCheck %s 3 4target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" 5target triple = "x86_64-unknown-linux-gnu" 6 7; Test case for https://github.com/llvm/llvm-project/issues/110295. 8define void @predicated_urem_shl_cost(ptr %A, i32 %x, i1 %c) { 9; CHECK-LABEL: define void @predicated_urem_shl_cost( 10; CHECK-SAME: ptr [[A:%.*]], i32 [[X:%.*]], i1 [[C:%.*]]) { 11; CHECK-NEXT: [[ENTRY:.*]]: 12; CHECK-NEXT: br label %[[LOOP_HEADER:.*]] 13; CHECK: [[LOOP_HEADER]]: 14; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 1, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ] 15; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[IV]] 16; CHECK-NEXT: [[L:%.*]] = load i32, ptr [[GEP]], align 4 17; CHECK-NEXT: br i1 [[C]], label %[[THEN:.*]], label %[[LOOP_LATCH]] 18; CHECK: [[THEN]]: 19; CHECK-NEXT: [[REM:%.*]] = urem i32 2, [[X]] 20; CHECK-NEXT: [[SHL:%.*]] = shl i32 [[L]], [[REM]] 21; CHECK-NEXT: br label %[[LOOP_LATCH]] 22; CHECK: [[LOOP_LATCH]]: 23; CHECK-NEXT: [[P:%.*]] = phi i32 [ 0, %[[LOOP_HEADER]] ], [ [[SHL]], %[[THEN]] ] 24; CHECK-NEXT: store i32 [[P]], ptr [[GEP]], align 4 25; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1 26; CHECK-NEXT: [[EC:%.*]] = icmp eq i32 [[IV]], 0 27; CHECK-NEXT: br i1 [[EC]], label %[[EXIT:.*]], label %[[LOOP_HEADER]] 28; CHECK: [[EXIT]]: 29; CHECK-NEXT: ret void 30; 31entry: 32 br label %loop.header 33 34loop.header: 35 %iv = phi i32 [ 1, %entry ], [ %iv.next, %loop.latch ] 36 %gep = getelementptr inbounds i32, ptr %A, i32 %iv 37 %l = load i32, ptr %gep 38 br i1 %c, label %then, label %loop.latch 39 40then: 41 %rem = urem i32 2, %x 42 %shl = shl i32 %l, %rem 43 br label %loop.latch 44 45loop.latch: 46 %p = phi i32 [ 0, %loop.header ], [ %shl, %then ] 47 store i32 %p, ptr %gep 48 %iv.next = add i32 %iv, 1 49 %ec = icmp eq i32 %iv, 0 50 br i1 %ec, label %exit, label %loop.header 51 52exit: 53 ret void 54} 55 56; Test case for https://github.com/llvm/llvm-project/issues/108697. 57define void @test_wide_shift_uses_predicated_invariant_instruction(i32 %d, i1 %c, ptr %dst) { 58; CHECK-LABEL: define void @test_wide_shift_uses_predicated_invariant_instruction( 59; CHECK-SAME: i32 [[D:%.*]], i1 [[C:%.*]], ptr [[DST:%.*]]) { 60; CHECK-NEXT: [[ENTRY:.*]]: 61; CHECK-NEXT: br label %[[LOOP_HEADER:.*]] 62; CHECK: [[LOOP_HEADER]]: 63; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ] 64; CHECK-NEXT: br i1 [[C]], label %[[LOOP_LATCH]], label %[[ELSE:.*]] 65; CHECK: [[ELSE]]: 66; CHECK-NEXT: [[REM:%.*]] = urem i32 100, [[D]] 67; CHECK-NEXT: [[SEXT:%.*]] = shl i32 [[REM]], 12 68; CHECK-NEXT: [[SHL_I:%.*]] = shl i32 999, [[SEXT]] 69; CHECK-NEXT: br label %[[LOOP_LATCH]] 70; CHECK: [[LOOP_LATCH]]: 71; CHECK-NEXT: [[P:%.*]] = phi i32 [ [[SHL_I]], %[[ELSE]] ], [ 0, %[[LOOP_HEADER]] ] 72; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i32, ptr [[DST]], i32 [[IV]] 73; CHECK-NEXT: store i32 [[P]], ptr [[GEP]], align 4 74; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1 75; CHECK-NEXT: [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], 100 76; CHECK-NEXT: br i1 [[EC]], label %[[EXIT:.*]], label %[[LOOP_HEADER]] 77; CHECK: [[EXIT]]: 78; CHECK-NEXT: ret void 79; 80entry: 81 br label %loop.header 82 83loop.header: 84 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ] 85 br i1 %c, label %loop.latch, label %else 86 87else: 88 %rem = urem i32 100, %d 89 %sext = shl i32 %rem, 12 90 %shl.i = shl i32 999, %sext 91 br label %loop.latch 92 93loop.latch: 94 %p = phi i32 [ %shl.i, %else ], [ 0, %loop.header ] 95 %gep = getelementptr inbounds i32, ptr %dst, i32 %iv 96 store i32 %p, ptr %gep 97 %iv.next = add i32 %iv, 1 98 %ec = icmp eq i32 %iv.next, 100 99 br i1 %ec, label %exit, label %loop.header 100 101exit: 102 ret void 103} 104