| ; RUN: opt -basicaa -load-combine -S < %s | FileCheck %s |
| target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" |
| target triple = "x86_64-unknown-linux-gnu" |
| |
| define i64 @test1(i32* nocapture readonly noalias %a, i32* nocapture readonly noalias %b) { |
| ; CHECK-LABEL: @test1 |
| |
| ; CHECK: load i64, i64* |
| ; CHECK: ret i64 |
| |
| %load1 = load i32, i32* %a, align 4 |
| %conv = zext i32 %load1 to i64 |
| %arrayidx1 = getelementptr inbounds i32, i32* %a, i64 1 |
| store i32 %load1, i32* %b, align 4 |
| %load2 = load i32, i32* %arrayidx1, align 4 |
| %conv2 = zext i32 %load2 to i64 |
| %shl = shl nuw i64 %conv2, 32 |
| %add = or i64 %shl, %conv |
| ret i64 %add |
| } |
| |
| define i64 @test2(i32* nocapture readonly %a, i32* nocapture readonly %b) { |
| ; CHECK-LABEL: @test2 |
| |
| ; CHECK-NOT: load i64 |
| ; CHECK: load i32, i32* |
| ; CHECK: load i32, i32* |
| ; CHECK: ret i64 |
| |
| %load1 = load i32, i32* %a, align 4 |
| %conv = zext i32 %load1 to i64 |
| %arrayidx1 = getelementptr inbounds i32, i32* %a, i64 1 |
| store i32 %load1, i32* %b, align 4 |
| %load2 = load i32, i32* %arrayidx1, align 4 |
| %conv2 = zext i32 %load2 to i64 |
| %shl = shl nuw i64 %conv2, 32 |
| %add = or i64 %shl, %conv |
| ret i64 %add |
| } |
| |
| %rec11 = type { i16, i16, i16 } |
| @str = global %rec11 { i16 1, i16 2, i16 3 } |
| |
| ; PR31517 - Check that loads which span an aliasing store are not combined. |
| define i16 @test3() { |
| ; CHECK-LABEL: @test3 |
| |
| ; CHECK-NOT: load i32 |
| ; CHECK: load i16, i16* |
| ; CHECK: store i16 |
| ; CHECK: load i16, i16* |
| ; CHECK: ret i16 |
| |
| %_tmp9 = getelementptr %rec11, %rec11* @str, i16 0, i32 1 |
| %_tmp10 = load i16, i16* %_tmp9 |
| %_tmp12 = getelementptr %rec11, %rec11* @str, i16 0, i32 0 |
| store i16 %_tmp10, i16* %_tmp12 |
| %_tmp13 = getelementptr %rec11, %rec11* @str, i16 0, i32 0 |
| %_tmp14 = load i16, i16* %_tmp13 |
| %_tmp15 = icmp eq i16 %_tmp14, 3 |
| %_tmp16 = select i1 %_tmp15, i16 1, i16 0 |
| ret i16 %_tmp16 |
| } |