1; RUN: opt < %s -indvars -S | FileCheck %s 2 3define void @test0(i32* %a) { 4; CHECK-LABEL: @test0( 5entry: 6 br label %for.body 7 8for.body: ; preds = %entry, %for.body 9 %i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ] 10 %rem = srem i32 %i.01, 2 11; CHECK-NOT: srem 12; CHECK: urem 13 %idxprom = sext i32 %rem to i64 14 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %idxprom 15 store i32 %i.01, i32* %arrayidx, align 4 16 %inc = add nsw i32 %i.01, 1 17 %cmp = icmp slt i32 %inc, 64 18 br i1 %cmp, label %for.body, label %for.end 19 20for.end: ; preds = %for.body 21 ret void 22} 23 24define void @test2(i32* %a, i32 %d) { 25; CHECK-LABEL: @test2( 26entry: 27 br label %for.body 28 29for.body: ; preds = %entry, %for.body 30 %i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ] 31 %mul = mul nsw i32 %i.01, 64 32 %rem = srem i32 %mul, %d 33; CHECK-NOT: urem 34 %idxprom = sext i32 %rem to i64 35 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %idxprom 36 store i32 %i.01, i32* %arrayidx, align 4 37 %inc = add nsw i32 %i.01, 1 38 %cmp = icmp slt i32 %inc, 64 39 br i1 %cmp, label %for.body, label %for.end 40 41for.end: ; preds = %for.body 42 ret void 43} 44 45define void @test3(i32* %a) { 46; CHECK-LABEL: @test3( 47entry: 48 br label %for.body 49 50for.body: ; preds = %entry, %for.body 51 %i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ] 52 %rem = srem i32 2048, %i.01 53; CHECK: urem 54; CHECK-NOT: srem 55 %idxprom = sext i32 %rem to i64 56 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %idxprom 57 store i32 %i.01, i32* %arrayidx, align 4 58 %inc = add nsw i32 %i.01, 1 59 %cmp = icmp slt i32 %inc, 64 60 br i1 %cmp, label %for.body, label %for.end 61 62for.end: ; preds = %for.body 63 ret void 64} 65 66define void @test4(i32* %a) { 67; CHECK-LABEL: @test4( 68entry: 69 br label %for.body 70 71for.body: ; preds = %entry, %for.body 72 %i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ] 73 %mul = mul nsw i32 %i.01, 64 74 %rem = srem i32 %mul, 7 75; CHECK: urem 76; CHECK-NOT: srem 77 %idxprom = sext i32 %rem to i64 78 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %idxprom 79 store i32 %i.01, i32* %arrayidx, align 4 80 %inc = add nsw i32 %i.01, 1 81 %cmp = icmp slt i32 %inc, 64 82 br i1 %cmp, label %for.body, label %for.end 83 84for.end: ; preds = %for.body 85 ret void 86} 87 88define void @test5(i32* %a) { 89; CHECK-LABEL: @test5( 90entry: 91 br label %for.body 92 93for.body: ; preds = %entry, %for.body 94 %i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ] 95 %mul = mul nsw i32 %i.01, 64 96 %rem = srem i32 %mul, 6 97; CHECK: urem 98; CHECK-NOT: srem 99 %idxprom = sext i32 %rem to i64 100 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %idxprom 101 store i32 %i.01, i32* %arrayidx, align 4 102 %inc = add nsw i32 %i.01, 1 103 %cmp = icmp slt i32 %inc, 64 104 br i1 %cmp, label %for.body, label %for.end 105 106for.end: ; preds = %for.body 107 ret void 108} 109 110