|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 |
1 | 2 | ; RUN: opt -passes=instcombine -S < %s | FileCheck %s
|
2 | 3 |
|
3 | 4 | ; Check that code corresponding to the following C function is
|
|
7 | 8 | ; return a < 0 ? -(-a - 1 >> b) - 1 : a >> b;
|
8 | 9 | ; }
|
9 | 10 | ;
|
| 11 | + |
10 | 12 | define i32 @test_asr(i32 %a, i32 %b) {
|
| 13 | +; CHECK-LABEL: define i32 @test_asr( |
| 14 | +; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) { |
| 15 | +; CHECK-NEXT: entry: |
| 16 | +; CHECK-NEXT: [[C:%.*]] = icmp slt i32 [[A]], 0 |
| 17 | +; CHECK-NEXT: br i1 [[C]], label [[BB2:%.*]], label [[BB3:%.*]] |
| 18 | +; CHECK: bb2: |
| 19 | +; CHECK-NEXT: br label [[BB4:%.*]] |
| 20 | +; CHECK: bb3: |
| 21 | +; CHECK-NEXT: br label [[BB4]] |
| 22 | +; CHECK: bb4: |
| 23 | +; CHECK-NEXT: [[F:%.*]] = ashr i32 [[A]], [[B]] |
| 24 | +; CHECK-NEXT: ret i32 [[F]] |
| 25 | +; |
11 | 26 | entry:
|
12 |
| - %c = icmp slt i32 %a, 0 |
13 |
| - br i1 %c, label %bb2, label %bb3 |
| 27 | + %c = icmp slt i32 %a, 0 |
| 28 | + br i1 %c, label %bb2, label %bb3 |
14 | 29 |
|
15 | 30 | bb2:
|
16 |
| - %t1 = sub i32 0, %a |
17 |
| - %not = sub i32 %t1, 1 |
18 |
| - %d = ashr i32 %not, %b |
19 |
| - %t2 = sub i32 0, %d |
20 |
| - %not2 = sub i32 %t2, 1 |
21 |
| - br label %bb4 |
| 31 | + %t1 = sub i32 0, %a |
| 32 | + %not = sub i32 %t1, 1 |
| 33 | + %d = ashr i32 %not, %b |
| 34 | + %t2 = sub i32 0, %d |
| 35 | + %not2 = sub i32 %t2, 1 |
| 36 | + br label %bb4 |
22 | 37 | bb3:
|
23 |
| - %e = ashr i32 %a, %b |
24 |
| - br label %bb4 |
| 38 | + %e = ashr i32 %a, %b |
| 39 | + br label %bb4 |
25 | 40 | bb4:
|
26 |
| - %f = phi i32 [ %not2, %bb2 ], [ %e, %bb3 ] |
27 |
| - ret i32 %f |
28 |
| -; CHECK-LABEL: @test_asr( |
29 |
| -; CHECK: bb4: |
30 |
| -; CHECK: %f = ashr i32 %a, %b |
31 |
| -; CHECK: ret i32 %f |
| 41 | + %f = phi i32 [ %not2, %bb2 ], [ %e, %bb3 ] |
| 42 | + ret i32 %f |
32 | 43 | }
|
0 commit comments