| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: opt < %s -passes=infer-alignment -S | FileCheck %s |
| |
| ; Propagates alignment information across blocks |
| ; entry -> if.then: the original alignment in %load2 is better. |
| ; entry -> if.else: the alignment in %load3 is improved. |
| ; if.then -> if.else: the edge doesn't dominate if.else. |
| |
| define void @propagate_across_blocks(ptr %a, i1 %cond) { |
| ; CHECK-LABEL: define void @propagate_across_blocks( |
| ; CHECK-SAME: ptr [[A:%.*]], i1 [[COND:%.*]]) { |
| ; CHECK-NEXT: [[ENTRY:.*:]] |
| ; CHECK-NEXT: [[LOAD1:%.*]] = load i64, ptr [[A]], align 8 |
| ; CHECK-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]] |
| ; CHECK: [[IF_THEN]]: |
| ; CHECK-NEXT: [[LOAD2:%.*]] = load i64, ptr [[A]], align 16 |
| ; CHECK-NEXT: br label %[[IF_ELSE]] |
| ; CHECK: [[IF_ELSE]]: |
| ; CHECK-NEXT: [[LOAD3:%.*]] = load i64, ptr [[A]], align 8 |
| ; CHECK-NEXT: ret void |
| ; |
| entry: |
| %load1 = load i64, ptr %a, align 8 |
| br i1 %cond, label %if.then, label %if.else |
| |
| if.then: |
| %load2 = load i64, ptr %a, align 16 |
| br label %if.else |
| |
| if.else: |
| %load3 = load i64, ptr %a, align 1 |
| ret void |
| } |